zen-gitsync 2.13.8 → 2.13.10
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/README.md +2 -2
- package/package.json +1 -1
- package/scripts/README_COLOR_CONVERTER.md +196 -196
- package/scripts/README_FONTSIZE_CONVERTER.md +278 -278
- package/scripts/README_SPACING_CONVERTER.md +126 -126
- package/scripts/README_STYLE_VARS.md +180 -180
- package/scripts/verify-subtask-row.mjs +284 -0
- package/src/ui/public/assets/EditorView-B4g8XOLB.js +0 -0
- package/src/ui/public/assets/{EditorView-Dvg7sMyU.css → EditorView-noBxnUk5.css} +1 -1
- package/src/ui/public/assets/SourceMapView-BVfD3VYO.js +3 -0
- package/src/ui/public/assets/WorkbenchView-Cx2p-WGc.js +6 -0
- package/src/ui/public/assets/WorkbenchView-_Z4j_RIa.css +1 -0
- package/src/ui/public/assets/{_plugin-vue_export-helper-rFkdzaHd.js → _plugin-vue_export-helper-rin5I4Hu.js} +3 -3
- package/src/ui/public/assets/{css.worker-Wv5dxAWO.js → css.worker-CvXBzhp8.js} +1 -1
- package/src/ui/public/assets/{html.worker-CQP8QQsS.js → html.worker-BO6WuOEO.js} +1 -1
- package/src/ui/public/assets/index-8cDK0aD_.js +66 -0
- package/src/ui/public/assets/index-CmMxt1ti.css +1 -0
- package/src/ui/public/assets/{json.worker-DzV-CpCQ.js → json.worker-BkJRGcCJ.js} +1 -1
- package/src/ui/public/assets/{ts.worker-Dth06zuC.js → ts.worker-B0J26iPs.js} +15 -15
- package/src/ui/public/assets/vendor-Bq2rS2vY.css +1 -0
- package/src/ui/public/assets/{vendor-CDAfMQIV.js → vendor-C30huq-U.js} +247 -240
- package/src/ui/public/favicon.svg +75 -75
- package/src/ui/public/index.html +23 -23
- package/src/ui/public/logo.svg +74 -74
- package/src/ui/server/routes/workbench.js +4 -3
- package/src/ui/public/assets/EditorView-CSUfBR5z.js +0 -0
- package/src/ui/public/assets/SourceMapView-CPsyB1rP.js +0 -3
- package/src/ui/public/assets/WorkbenchView-BBDJOY3C.js +0 -6
- package/src/ui/public/assets/WorkbenchView-CA91BJc8.css +0 -1
- package/src/ui/public/assets/index-CLVL3Inb.js +0 -66
- package/src/ui/public/assets/index-ChSExFC3.css +0 -1
- package/src/ui/public/assets/vendor-CIeR0bF6.css +0 -1
- /package/src/ui/public/assets/{editor.worker-Bd9IXS8d.js → editor.worker-Cn2oRESe.js} +0 -0
- /package/src/ui/public/assets/{rolldown-runtime-BM3Ffeng.js → rolldown-runtime-CMxvf4Kt.js} +0 -0
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<defs>
|
|
3
|
-
<radialGradient id="bgGrad" cx="38%" cy="32%" r="70%">
|
|
4
|
-
<stop offset="0%" stop-color="#1e1b4b"/>
|
|
5
|
-
<stop offset="100%" stop-color="#0d0b1e"/>
|
|
6
|
-
</radialGradient>
|
|
7
|
-
<linearGradient id="mainGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
8
|
-
<stop offset="0%" stop-color="#c4b5fd"/>
|
|
9
|
-
<stop offset="100%" stop-color="#7c3aed"/>
|
|
10
|
-
</linearGradient>
|
|
11
|
-
<linearGradient id="featGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
12
|
-
<stop offset="0%" stop-color="#7dd3fc"/>
|
|
13
|
-
<stop offset="100%" stop-color="#0284c7"/>
|
|
14
|
-
</linearGradient>
|
|
15
|
-
<filter id="glow" x="-40%" y="-40%" width="180%" height="180%">
|
|
16
|
-
<feGaussianBlur in="SourceGraphic" stdDeviation="2.5" result="blur"/>
|
|
17
|
-
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
18
|
-
</filter>
|
|
19
|
-
<filter id="softGlow" x="-20%" y="-20%" width="140%" height="140%">
|
|
20
|
-
<feGaussianBlur in="SourceGraphic" stdDeviation="1.5" result="blur"/>
|
|
21
|
-
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
22
|
-
</filter>
|
|
23
|
-
</defs>
|
|
24
|
-
|
|
25
|
-
<!-- 背景圆 -->
|
|
26
|
-
<circle cx="100" cy="100" r="96" fill="url(#bgGrad)"/>
|
|
27
|
-
|
|
28
|
-
<!-- 同步外弧(上半,代表 sync 循环) -->
|
|
29
|
-
<path d="M 100,20 A 80,80 0 1,1 36,153"
|
|
30
|
-
stroke="rgba(167,139,250,0.18)" stroke-width="4.5" fill="none" stroke-linecap="round"/>
|
|
31
|
-
<!-- 同步外弧(下半) -->
|
|
32
|
-
<path d="M 36,153 A 80,80 0 0,1 164,153"
|
|
33
|
-
stroke="rgba(56,189,248,0.18)" stroke-width="4.5" fill="none" stroke-linecap="round"/>
|
|
34
|
-
<!-- 同步箭头(上) -->
|
|
35
|
-
<path d="M 91,17 L 100,20 L 96,29"
|
|
36
|
-
stroke="rgba(167,139,250,0.55)" stroke-width="2.5" fill="none"
|
|
37
|
-
stroke-linecap="round" stroke-linejoin="round"/>
|
|
38
|
-
<!-- 同步箭头(下) -->
|
|
39
|
-
<path d="M 163,145 L 164,154 L 155,151"
|
|
40
|
-
stroke="rgba(56,189,248,0.55)" stroke-width="2.5" fill="none"
|
|
41
|
-
stroke-linecap="round" stroke-linejoin="round"/>
|
|
42
|
-
|
|
43
|
-
<!-- 主分支竖线 -->
|
|
44
|
-
<line x1="76" y1="44" x2="76" y2="156"
|
|
45
|
-
stroke="url(#mainGrad)" stroke-width="5.5" stroke-linecap="round"
|
|
46
|
-
filter="url(#softGlow)"/>
|
|
47
|
-
|
|
48
|
-
<!-- 特性分支曲线(分出) -->
|
|
49
|
-
<path d="M 76,80 C 98,80 130,96 130,120 L 130,140"
|
|
50
|
-
stroke="url(#featGrad)" stroke-width="4.5" fill="none"
|
|
51
|
-
stroke-linecap="round" filter="url(#softGlow)"/>
|
|
52
|
-
<!-- 特性分支合并回主分支 -->
|
|
53
|
-
<path d="M 130,140 C 130,156 105,159 76,155"
|
|
54
|
-
stroke="url(#featGrad)" stroke-width="4.5" fill="none" stroke-linecap="round"/>
|
|
55
|
-
|
|
56
|
-
<!-- 主分支节点 -->
|
|
57
|
-
<circle cx="76" cy="48" r="11" fill="#13103a" stroke="#c4b5fd" stroke-width="3" filter="url(#glow)"/>
|
|
58
|
-
<circle cx="76" cy="48" r="5" fill="#ddd6fe"/>
|
|
59
|
-
|
|
60
|
-
<circle cx="76" cy="84" r="11" fill="#13103a" stroke="#a78bfa" stroke-width="3"/>
|
|
61
|
-
<circle cx="76" cy="84" r="5" fill="#c4b5fd"/>
|
|
62
|
-
|
|
63
|
-
<circle cx="76" cy="120" r="11" fill="#13103a" stroke="#8b5cf6" stroke-width="3"/>
|
|
64
|
-
<circle cx="76" cy="120" r="5" fill="#a78bfa"/>
|
|
65
|
-
|
|
66
|
-
<circle cx="76" cy="155" r="11" fill="#13103a" stroke="#7c3aed" stroke-width="3" filter="url(#glow)"/>
|
|
67
|
-
<circle cx="76" cy="155" r="5" fill="#8b5cf6"/>
|
|
68
|
-
|
|
69
|
-
<!-- 特性分支节点 -->
|
|
70
|
-
<circle cx="130" cy="115" r="11" fill="#13103a" stroke="#38bdf8" stroke-width="3" filter="url(#glow)"/>
|
|
71
|
-
<circle cx="130" cy="115" r="5" fill="#7dd3fc"/>
|
|
72
|
-
|
|
73
|
-
<circle cx="130" cy="143" r="11" fill="#13103a" stroke="#0ea5e9" stroke-width="3" filter="url(#glow)"/>
|
|
74
|
-
<circle cx="130" cy="143" r="5" fill="#38bdf8"/>
|
|
75
|
-
</svg>
|
|
1
|
+
<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<radialGradient id="bgGrad" cx="38%" cy="32%" r="70%">
|
|
4
|
+
<stop offset="0%" stop-color="#1e1b4b"/>
|
|
5
|
+
<stop offset="100%" stop-color="#0d0b1e"/>
|
|
6
|
+
</radialGradient>
|
|
7
|
+
<linearGradient id="mainGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
8
|
+
<stop offset="0%" stop-color="#c4b5fd"/>
|
|
9
|
+
<stop offset="100%" stop-color="#7c3aed"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<linearGradient id="featGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
12
|
+
<stop offset="0%" stop-color="#7dd3fc"/>
|
|
13
|
+
<stop offset="100%" stop-color="#0284c7"/>
|
|
14
|
+
</linearGradient>
|
|
15
|
+
<filter id="glow" x="-40%" y="-40%" width="180%" height="180%">
|
|
16
|
+
<feGaussianBlur in="SourceGraphic" stdDeviation="2.5" result="blur"/>
|
|
17
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
18
|
+
</filter>
|
|
19
|
+
<filter id="softGlow" x="-20%" y="-20%" width="140%" height="140%">
|
|
20
|
+
<feGaussianBlur in="SourceGraphic" stdDeviation="1.5" result="blur"/>
|
|
21
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
22
|
+
</filter>
|
|
23
|
+
</defs>
|
|
24
|
+
|
|
25
|
+
<!-- 背景圆 -->
|
|
26
|
+
<circle cx="100" cy="100" r="96" fill="url(#bgGrad)"/>
|
|
27
|
+
|
|
28
|
+
<!-- 同步外弧(上半,代表 sync 循环) -->
|
|
29
|
+
<path d="M 100,20 A 80,80 0 1,1 36,153"
|
|
30
|
+
stroke="rgba(167,139,250,0.18)" stroke-width="4.5" fill="none" stroke-linecap="round"/>
|
|
31
|
+
<!-- 同步外弧(下半) -->
|
|
32
|
+
<path d="M 36,153 A 80,80 0 0,1 164,153"
|
|
33
|
+
stroke="rgba(56,189,248,0.18)" stroke-width="4.5" fill="none" stroke-linecap="round"/>
|
|
34
|
+
<!-- 同步箭头(上) -->
|
|
35
|
+
<path d="M 91,17 L 100,20 L 96,29"
|
|
36
|
+
stroke="rgba(167,139,250,0.55)" stroke-width="2.5" fill="none"
|
|
37
|
+
stroke-linecap="round" stroke-linejoin="round"/>
|
|
38
|
+
<!-- 同步箭头(下) -->
|
|
39
|
+
<path d="M 163,145 L 164,154 L 155,151"
|
|
40
|
+
stroke="rgba(56,189,248,0.55)" stroke-width="2.5" fill="none"
|
|
41
|
+
stroke-linecap="round" stroke-linejoin="round"/>
|
|
42
|
+
|
|
43
|
+
<!-- 主分支竖线 -->
|
|
44
|
+
<line x1="76" y1="44" x2="76" y2="156"
|
|
45
|
+
stroke="url(#mainGrad)" stroke-width="5.5" stroke-linecap="round"
|
|
46
|
+
filter="url(#softGlow)"/>
|
|
47
|
+
|
|
48
|
+
<!-- 特性分支曲线(分出) -->
|
|
49
|
+
<path d="M 76,80 C 98,80 130,96 130,120 L 130,140"
|
|
50
|
+
stroke="url(#featGrad)" stroke-width="4.5" fill="none"
|
|
51
|
+
stroke-linecap="round" filter="url(#softGlow)"/>
|
|
52
|
+
<!-- 特性分支合并回主分支 -->
|
|
53
|
+
<path d="M 130,140 C 130,156 105,159 76,155"
|
|
54
|
+
stroke="url(#featGrad)" stroke-width="4.5" fill="none" stroke-linecap="round"/>
|
|
55
|
+
|
|
56
|
+
<!-- 主分支节点 -->
|
|
57
|
+
<circle cx="76" cy="48" r="11" fill="#13103a" stroke="#c4b5fd" stroke-width="3" filter="url(#glow)"/>
|
|
58
|
+
<circle cx="76" cy="48" r="5" fill="#ddd6fe"/>
|
|
59
|
+
|
|
60
|
+
<circle cx="76" cy="84" r="11" fill="#13103a" stroke="#a78bfa" stroke-width="3"/>
|
|
61
|
+
<circle cx="76" cy="84" r="5" fill="#c4b5fd"/>
|
|
62
|
+
|
|
63
|
+
<circle cx="76" cy="120" r="11" fill="#13103a" stroke="#8b5cf6" stroke-width="3"/>
|
|
64
|
+
<circle cx="76" cy="120" r="5" fill="#a78bfa"/>
|
|
65
|
+
|
|
66
|
+
<circle cx="76" cy="155" r="11" fill="#13103a" stroke="#7c3aed" stroke-width="3" filter="url(#glow)"/>
|
|
67
|
+
<circle cx="76" cy="155" r="5" fill="#8b5cf6"/>
|
|
68
|
+
|
|
69
|
+
<!-- 特性分支节点 -->
|
|
70
|
+
<circle cx="130" cy="115" r="11" fill="#13103a" stroke="#38bdf8" stroke-width="3" filter="url(#glow)"/>
|
|
71
|
+
<circle cx="130" cy="115" r="5" fill="#7dd3fc"/>
|
|
72
|
+
|
|
73
|
+
<circle cx="130" cy="143" r="11" fill="#13103a" stroke="#0ea5e9" stroke-width="3" filter="url(#glow)"/>
|
|
74
|
+
<circle cx="130" cy="143" r="5" fill="#38bdf8"/>
|
|
75
|
+
</svg>
|
package/src/ui/public/index.html
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="zh-CN" translate="no">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8" />
|
|
5
|
-
<meta name="google" content="notranslate" />
|
|
6
|
-
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
7
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
8
|
-
<title>Zen GitSync</title>
|
|
9
|
-
<!-- Premium fonts: Plus Jakarta Sans (UI) + JetBrains Mono (code) -->
|
|
10
|
-
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
11
|
-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
12
|
-
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,400&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
|
|
13
|
-
<script type="module" crossorigin src="/assets/index-
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/assets/vendor-
|
|
16
|
-
<link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-
|
|
17
|
-
<link rel="stylesheet" crossorigin href="/assets/vendor-
|
|
18
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
19
|
-
</head>
|
|
20
|
-
<body>
|
|
21
|
-
<div id="app"></div>
|
|
22
|
-
</body>
|
|
23
|
-
</html>
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh-CN" translate="no">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="google" content="notranslate" />
|
|
6
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
7
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
8
|
+
<title>Zen GitSync</title>
|
|
9
|
+
<!-- Premium fonts: Plus Jakarta Sans (UI) + JetBrains Mono (code) -->
|
|
10
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
11
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
12
|
+
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,400&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
|
|
13
|
+
<script type="module" crossorigin src="/assets/index-8cDK0aD_.js"></script>
|
|
14
|
+
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-CMxvf4Kt.js">
|
|
15
|
+
<link rel="modulepreload" crossorigin href="/assets/vendor-C30huq-U.js">
|
|
16
|
+
<link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-rin5I4Hu.js">
|
|
17
|
+
<link rel="stylesheet" crossorigin href="/assets/vendor-Bq2rS2vY.css">
|
|
18
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CmMxt1ti.css">
|
|
19
|
+
</head>
|
|
20
|
+
<body>
|
|
21
|
+
<div id="app"></div>
|
|
22
|
+
</body>
|
|
23
|
+
</html>
|
package/src/ui/public/logo.svg
CHANGED
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<defs>
|
|
3
|
-
<radialGradient id="bgGrad" cx="38%" cy="32%" r="70%">
|
|
4
|
-
<stop offset="0%" stop-color="#1e1b4b"/>
|
|
5
|
-
<stop offset="100%" stop-color="#0d0b1e"/>
|
|
6
|
-
</radialGradient>
|
|
7
|
-
<linearGradient id="mainGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
8
|
-
<stop offset="0%" stop-color="#c4b5fd"/>
|
|
9
|
-
<stop offset="100%" stop-color="#7c3aed"/>
|
|
10
|
-
</linearGradient>
|
|
11
|
-
<linearGradient id="featGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
12
|
-
<stop offset="0%" stop-color="#7dd3fc"/>
|
|
13
|
-
<stop offset="100%" stop-color="#0284c7"/>
|
|
14
|
-
</linearGradient>
|
|
15
|
-
<filter id="glow" x="-40%" y="-40%" width="180%" height="180%">
|
|
16
|
-
<feGaussianBlur in="SourceGraphic" stdDeviation="2.5" result="blur"/>
|
|
17
|
-
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
18
|
-
</filter>
|
|
19
|
-
<filter id="softGlow" x="-20%" y="-20%" width="140%" height="140%">
|
|
20
|
-
<feGaussianBlur in="SourceGraphic" stdDeviation="1.5" result="blur"/>
|
|
21
|
-
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
22
|
-
</filter>
|
|
23
|
-
</defs>
|
|
24
|
-
|
|
25
|
-
<!-- 背景�?-->
|
|
26
|
-
<circle cx="100" cy="100" r="96" fill="url(#bgGrad)"/>
|
|
27
|
-
|
|
28
|
-
<!-- 同步外弧(上半,代表 sync 循环�?-->
|
|
29
|
-
<path d="M 100,20 A 80,80 0 1,1 36,153"
|
|
30
|
-
stroke="rgba(167,139,250,0.18)" stroke-width="4.5" fill="none" stroke-linecap="round"/>
|
|
31
|
-
<!-- 同步外弧(下半) -->
|
|
32
|
-
<path d="M 36,153 A 80,80 0 0,1 164,153"
|
|
33
|
-
stroke="rgba(56,189,248,0.18)" stroke-width="4.5" fill="none" stroke-linecap="round"/>
|
|
34
|
-
<!-- 同步箭头(上�?-->
|
|
35
|
-
<path d="M 91,17 L 100,20 L 96,29"
|
|
36
|
-
stroke="rgba(167,139,250,0.55)" stroke-width="2.5" fill="none"
|
|
37
|
-
stroke-linecap="round" stroke-linejoin="round"/>
|
|
38
|
-
<!-- 同步箭头(下�?-->
|
|
39
|
-
<path d="M 163,145 L 164,154 L 155,151"
|
|
40
|
-
stroke="rgba(56,189,248,0.55)" stroke-width="2.5" fill="none"
|
|
41
|
-
stroke-linecap="round" stroke-linejoin="round"/>
|
|
42
|
-
|
|
43
|
-
<!-- 主分支竖�?-->
|
|
44
|
-
<line x1="76" y1="44" x2="76" y2="156"
|
|
45
|
-
stroke="url(#mainGrad)" stroke-width="5.5" stroke-linecap="round"
|
|
46
|
-
filter="url(#softGlow)"/>
|
|
47
|
-
|
|
48
|
-
<!-- 特性分支曲线(分出�?-->
|
|
49
|
-
<path d="M 76,80 C 98,80 130,96 130,120 L 130,140"
|
|
50
|
-
stroke="url(#featGrad)" stroke-width="4.5" fill="none"
|
|
51
|
-
stroke-linecap="round" filter="url(#softGlow)"/>
|
|
52
|
-
<!-- 特性分支合并回主分�?-->
|
|
53
|
-
<path d="M 130,140 C 130,156 105,159 76,155"
|
|
54
|
-
stroke="url(#featGrad)" stroke-width="4.5" fill="none" stroke-linecap="round"/>
|
|
55
|
-
|
|
56
|
-
<!-- 主分支节�?-->
|
|
57
|
-
<circle cx="76" cy="48" r="11" fill="#13103a" stroke="#c4b5fd" stroke-width="3" filter="url(#glow)"/>
|
|
58
|
-
<circle cx="76" cy="48" r="5" fill="#ddd6fe"/>
|
|
59
|
-
|
|
60
|
-
<circle cx="76" cy="84" r="11" fill="#13103a" stroke="#a78bfa" stroke-width="3"/>
|
|
61
|
-
<circle cx="76" cy="84" r="5" fill="#c4b5fd"/>
|
|
62
|
-
|
|
63
|
-
<circle cx="76" cy="120" r="11" fill="#13103a" stroke="#8b5cf6" stroke-width="3"/>
|
|
64
|
-
<circle cx="76" cy="120" r="5" fill="#a78bfa"/>
|
|
65
|
-
|
|
66
|
-
<circle cx="76" cy="155" r="11" fill="#13103a" stroke="#7c3aed" stroke-width="3" filter="url(#glow)"/>
|
|
67
|
-
<circle cx="76" cy="155" r="5" fill="#8b5cf6"/>
|
|
68
|
-
|
|
69
|
-
<!-- 特性分支节�?-->
|
|
70
|
-
<circle cx="130" cy="115" r="11" fill="#13103a" stroke="#38bdf8" stroke-width="3" filter="url(#glow)"/>
|
|
71
|
-
<circle cx="130" cy="115" r="5" fill="#7dd3fc"/>
|
|
72
|
-
|
|
73
|
-
<circle cx="130" cy="143" r="11" fill="#13103a" stroke="#0ea5e9" stroke-width="3" filter="url(#glow)"/>
|
|
74
|
-
<circle cx="130" cy="143" r="5" fill="#38bdf8"/>
|
|
1
|
+
<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<radialGradient id="bgGrad" cx="38%" cy="32%" r="70%">
|
|
4
|
+
<stop offset="0%" stop-color="#1e1b4b"/>
|
|
5
|
+
<stop offset="100%" stop-color="#0d0b1e"/>
|
|
6
|
+
</radialGradient>
|
|
7
|
+
<linearGradient id="mainGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
8
|
+
<stop offset="0%" stop-color="#c4b5fd"/>
|
|
9
|
+
<stop offset="100%" stop-color="#7c3aed"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<linearGradient id="featGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
12
|
+
<stop offset="0%" stop-color="#7dd3fc"/>
|
|
13
|
+
<stop offset="100%" stop-color="#0284c7"/>
|
|
14
|
+
</linearGradient>
|
|
15
|
+
<filter id="glow" x="-40%" y="-40%" width="180%" height="180%">
|
|
16
|
+
<feGaussianBlur in="SourceGraphic" stdDeviation="2.5" result="blur"/>
|
|
17
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
18
|
+
</filter>
|
|
19
|
+
<filter id="softGlow" x="-20%" y="-20%" width="140%" height="140%">
|
|
20
|
+
<feGaussianBlur in="SourceGraphic" stdDeviation="1.5" result="blur"/>
|
|
21
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
22
|
+
</filter>
|
|
23
|
+
</defs>
|
|
24
|
+
|
|
25
|
+
<!-- 背景�?-->
|
|
26
|
+
<circle cx="100" cy="100" r="96" fill="url(#bgGrad)"/>
|
|
27
|
+
|
|
28
|
+
<!-- 同步外弧(上半,代表 sync 循环�?-->
|
|
29
|
+
<path d="M 100,20 A 80,80 0 1,1 36,153"
|
|
30
|
+
stroke="rgba(167,139,250,0.18)" stroke-width="4.5" fill="none" stroke-linecap="round"/>
|
|
31
|
+
<!-- 同步外弧(下半) -->
|
|
32
|
+
<path d="M 36,153 A 80,80 0 0,1 164,153"
|
|
33
|
+
stroke="rgba(56,189,248,0.18)" stroke-width="4.5" fill="none" stroke-linecap="round"/>
|
|
34
|
+
<!-- 同步箭头(上�?-->
|
|
35
|
+
<path d="M 91,17 L 100,20 L 96,29"
|
|
36
|
+
stroke="rgba(167,139,250,0.55)" stroke-width="2.5" fill="none"
|
|
37
|
+
stroke-linecap="round" stroke-linejoin="round"/>
|
|
38
|
+
<!-- 同步箭头(下�?-->
|
|
39
|
+
<path d="M 163,145 L 164,154 L 155,151"
|
|
40
|
+
stroke="rgba(56,189,248,0.55)" stroke-width="2.5" fill="none"
|
|
41
|
+
stroke-linecap="round" stroke-linejoin="round"/>
|
|
42
|
+
|
|
43
|
+
<!-- 主分支竖�?-->
|
|
44
|
+
<line x1="76" y1="44" x2="76" y2="156"
|
|
45
|
+
stroke="url(#mainGrad)" stroke-width="5.5" stroke-linecap="round"
|
|
46
|
+
filter="url(#softGlow)"/>
|
|
47
|
+
|
|
48
|
+
<!-- 特性分支曲线(分出�?-->
|
|
49
|
+
<path d="M 76,80 C 98,80 130,96 130,120 L 130,140"
|
|
50
|
+
stroke="url(#featGrad)" stroke-width="4.5" fill="none"
|
|
51
|
+
stroke-linecap="round" filter="url(#softGlow)"/>
|
|
52
|
+
<!-- 特性分支合并回主分�?-->
|
|
53
|
+
<path d="M 130,140 C 130,156 105,159 76,155"
|
|
54
|
+
stroke="url(#featGrad)" stroke-width="4.5" fill="none" stroke-linecap="round"/>
|
|
55
|
+
|
|
56
|
+
<!-- 主分支节�?-->
|
|
57
|
+
<circle cx="76" cy="48" r="11" fill="#13103a" stroke="#c4b5fd" stroke-width="3" filter="url(#glow)"/>
|
|
58
|
+
<circle cx="76" cy="48" r="5" fill="#ddd6fe"/>
|
|
59
|
+
|
|
60
|
+
<circle cx="76" cy="84" r="11" fill="#13103a" stroke="#a78bfa" stroke-width="3"/>
|
|
61
|
+
<circle cx="76" cy="84" r="5" fill="#c4b5fd"/>
|
|
62
|
+
|
|
63
|
+
<circle cx="76" cy="120" r="11" fill="#13103a" stroke="#8b5cf6" stroke-width="3"/>
|
|
64
|
+
<circle cx="76" cy="120" r="5" fill="#a78bfa"/>
|
|
65
|
+
|
|
66
|
+
<circle cx="76" cy="155" r="11" fill="#13103a" stroke="#7c3aed" stroke-width="3" filter="url(#glow)"/>
|
|
67
|
+
<circle cx="76" cy="155" r="5" fill="#8b5cf6"/>
|
|
68
|
+
|
|
69
|
+
<!-- 特性分支节�?-->
|
|
70
|
+
<circle cx="130" cy="115" r="11" fill="#13103a" stroke="#38bdf8" stroke-width="3" filter="url(#glow)"/>
|
|
71
|
+
<circle cx="130" cy="115" r="5" fill="#7dd3fc"/>
|
|
72
|
+
|
|
73
|
+
<circle cx="130" cy="143" r="11" fill="#13103a" stroke="#0ea5e9" stroke-width="3" filter="url(#glow)"/>
|
|
74
|
+
<circle cx="130" cy="143" r="5" fill="#38bdf8"/>
|
|
75
75
|
</svg>
|
|
@@ -1742,7 +1742,8 @@ ${desc ? `描述:${desc}` : '描述:(无)'}${attachmentBlock}${templateB
|
|
|
1742
1742
|
app.post('/api/workbench/tasks', async (req, res) => {
|
|
1743
1743
|
try {
|
|
1744
1744
|
const { id, title, desc, promptId, subtasks, type: rawType, simpleOverride } = req.body || {};
|
|
1745
|
-
|
|
1745
|
+
// title 非必填:允许空字符串,UI 层会用"未命名任务"占位
|
|
1746
|
+
const safeTitle = typeof title === 'string' ? title.trim() : '';
|
|
1746
1747
|
// type 归一化:仅接受 'simple' | 'complex',缺省/未知一律按 complex
|
|
1747
1748
|
const taskType = rawType === 'simple' ? 'simple' : 'complex';
|
|
1748
1749
|
const safeOverride = typeof simpleOverride === 'string' ? simpleOverride.slice(0, 8000) : '';
|
|
@@ -1756,7 +1757,7 @@ ${desc ? `描述:${desc}` : '描述:(无)'}${attachmentBlock}${templateB
|
|
|
1756
1757
|
if (i < 0) return res.status(404).json({ success: false, error: '任务不存在' });
|
|
1757
1758
|
tasks[i] = {
|
|
1758
1759
|
...tasks[i],
|
|
1759
|
-
title,
|
|
1760
|
+
title: safeTitle,
|
|
1760
1761
|
desc: desc || '',
|
|
1761
1762
|
promptId: promptId || null,
|
|
1762
1763
|
type: taskType,
|
|
@@ -1786,7 +1787,7 @@ ${desc ? `描述:${desc}` : '描述:(无)'}${attachmentBlock}${templateB
|
|
|
1786
1787
|
}
|
|
1787
1788
|
const task = {
|
|
1788
1789
|
id: genId(),
|
|
1789
|
-
title,
|
|
1790
|
+
title: safeTitle,
|
|
1790
1791
|
desc: desc || '',
|
|
1791
1792
|
promptId: promptId || null,
|
|
1792
1793
|
type: taskType,
|
|
Binary file
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-BM3Ffeng.js";import{Di as t,Gi as n,Gt as r,Hi as i,Ht as a,Jn as o,Jt as s,Ki as c,Kt as ee,Li as l,Ni as u,Oi as te,Ri as d,Si as f,Ui as ne,Ut as re,Wi as p,Wt as ie,Xt as ae,Yt as oe,_i as m,bi as se,ci as h,di as g,hi as _,ji as v,ki as ce,li as le,mi as y,qi as b,qt as ue,si as de,t as fe,un as pe,vi as x,wi as me,xi as S,xt as C,zi as w}from"./vendor-CDAfMQIV.js";import{n as T,t as E}from"./_plugin-vue_export-helper-rFkdzaHd.js";import{a as he,r as ge}from"./index-CLVL3Inb.js";var _e=e(a(),1),ve={class:`source-map-view`},ye={class:`sm-toolbar`},be={class:`sm-toolbar-left`},xe={class:`sm-title`},Se={class:`sm-toolbar-center`},Ce=[`placeholder`,`disabled`],we=[`disabled`],Te={class:`sm-toolbar-right`},Ee={class:`sm-body`},De={class:`sm-panel-header sm-panel-header--tabs`},Oe={key:0,class:`sm-badge`},ke={class:`sm-panel-body sm-file-tree`},Ae=[`onClick`],je={key:1,class:`sm-tree-arrow-spacer`},Me={key:2,class:`sm-tree-icon mit-icon`,"aria-hidden":`true`},Ne=[`xlink:href`],Pe={key:3,class:`sm-tree-icon mit-icon`,"aria-hidden":`true`},Fe=[`xlink:href`],Ie=[`title`],Le={key:1,class:`sm-tree-empty`},Re={class:`sm-panel-body sm-outline-body`},ze={class:`sm-badge`,style:{"margin-left":`auto`}},Be=[`onClick`],Ve=[`title`],He={key:0,class:`sm-outline-desc`},Ue={key:1,class:`sm-tree-empty`},We={class:`sm-panel sm-panel-graph`},Ge={key:0,class:`sm-project-info`},Ke={class:`sm-lang-badge`},qe={class:`sm-summary-text`},Je={class:`sm-graph-container`},Ye={class:`sm-layout-btn-wrap`},Xe=[`disabled`],Ze=[`title`],Qe={class:`sm-fn-label`},$e={key:0,class:`sm-fn-desc`},et={key:0,class:`sm-graph-empty`},tt={viewBox:`0 0 24 24`,width:`48`,height:`48`,fill:`none`,stroke:`currentColor`,"stroke-width":`1`,style:{opacity:`0.3`}},nt={key:1,class:`sm-graph-loading`},rt={class:`sm-log-header`},it={key:0,class:`sm-log-indicator`},at={class:`sm-log-body`,ref:`logBodyRef`},ot={key:0,class:`sm-empty`},st={class:`sm-panel-header`},ct={key:0,class:`sm-badge sm-badge-amber`},lt={key:0,class:`sm-node-detail`},ut={class:`sm-node-name`},dt={class:`sm-node-file`},ft={key:0},pt={key:0,class:`sm-node-desc`},mt={class:`sm-panel-body sm-source-body`},ht={key:0,class:`sm-source-overlay`},gt={key:1,class:`sm-source-overlay sm-source-placeholder`},D=E(me({__name:`SourceMapView`,setup(e){let a=i(document.documentElement.getAttribute(`data-theme`)===`dark`?`dark`:`light`);function me(){a.value=document.documentElement.getAttribute(`data-theme`)===`dark`?`dark`:`light`}let E=null,D=he(),O=i(D.currentDirectory||``),k=i(`idle`),A=i([]),_t=0,j=i(null),M=i(null),N=i(`files`),P=i(``),F=i(``),I=i(!1),L=i([]),R=i(new Set),z=i({files:!0,graph:!0,source:!0}),B=i(!1),vt=i(220),V=i(360),H=i(140),U=null,W=0,yt=0,G=0;function K(e,t){U=e,W=t.clientX,yt=t.clientY,G=e===`files`?vt.value:e===`source`?V.value:H.value,document.addEventListener(`mousemove`,bt),document.addEventListener(`mouseup`,q),t.preventDefault()}function bt(e){U&&(U===`files`?vt.value=Math.max(120,Math.min(480,G+e.clientX-W)):U===`source`?V.value=Math.max(200,Math.min(700,G+W-e.clientX)):H.value=Math.max(60,Math.min(500,G+yt-e.clientY)))}function q(){U=null,document.removeEventListener(`mousemove`,bt),document.removeEventListener(`mouseup`,q)}let J=i(null),Y=ne(null),{fitView:xt,setNodes:X,setEdges:St,getNodes:Ct,getEdges:wt,updateNodeInternals:Tt}=ae(),Z=y(()=>k.value===`scanning`||k.value===`analyzing`),Et=y(()=>a.value===`dark`?`#334155`:`#cbd5e1`),Q=y(()=>j.value?.nodes.find(e=>e.id===M.value)??null),Dt=y(()=>{if(!j.value)return[];let e=new Map;for(let t of j.value.nodes){let n=t.subsystem??`__default__`;if(!e.has(n)){let r=j.value.subsystems?.find(e=>e.name===n);e.set(n,{displayName:r?.displayName||t.subsystem||T(`@SRCMAP:默认`),color:t.subsystemColor||kt[0],nodes:[]})}e.get(n).nodes.push(t)}return[...e.entries()].map(([,e])=>e)});function $(e,t=`info`){A.value.push({id:++_t,message:e,type:t,timestamp:Date.now()}),A.value.length>200&&A.value.splice(0,A.value.length-200)}function Ot(e){let t={name:``,path:``,kind:`dir`,children:[],childMap:new Map};for(let n of e){let e=n.trim().split(`/`).filter(Boolean),r=t,i=``;for(let t=0;t<e.length;t++){let n=e[t];i=i?`${i}/${n}`:n;let a=t===e.length-1,o=r.childMap.get(n);o||(o={name:n,path:i,kind:a?`file`:`dir`,children:[],childMap:new Map},r.childMap.set(n,o),r.children.push(o)),r=o}}let n=e=>{e.sort((e,t)=>e.kind===t.kind?e.name.localeCompare(t.name):e.kind===`dir`?-1:1),e.forEach(e=>{e.kind===`dir`&&n(e.children)})};return n(t.children),t.children}let kt=[`#f59e0b`,`#3b82f6`,`#10b981`,`#8b5cf6`];function At(e){return e.subsystemColor?e.subsystemColor:e.subsystemIndex===void 0?e.importance===`high`?`#f59e0b`:e.importance===`low`?`#94a3b8`:`#3b82f6`:kt[e.subsystemIndex%kt.length]}function jt(e){return{ts:`typescript`,tsx:`typescript`,js:`javascript`,mjs:`javascript`,cjs:`javascript`,jsx:`javascript`,vue:`html`,svelte:`html`,html:`html`,py:`python`,java:`java`,go:`go`,rs:`rust`,cpp:`cpp`,cc:`cpp`,cxx:`cpp`,c:`c`,h:`c`,hpp:`cpp`,cs:`csharp`,rb:`ruby`,php:`php`,swift:`swift`,kt:`kotlin`,sh:`shell`,bash:`shell`,json:`json`,yaml:`yaml`,yml:`yaml`,md:`markdown`,css:`css`,scss:`scss`,less:`less`,sql:`sql`}[e.split(`.`).pop()?.toLowerCase()||``]||`plaintext`}function Mt(){!J.value||Y.value||(Y.value=C.create(J.value,{value:``,language:`plaintext`,theme:a.value===`dark`?`vs-dark`:`vs`,readOnly:!0,fontSize:12,lineHeight:19,fontFamily:`'JetBrains Mono', 'Fira Code', Consolas, monospace`,minimap:{enabled:!1},scrollBeyondLastLine:!1,automaticLayout:!0,wordWrap:`off`,padding:{top:8,bottom:8},scrollbar:{verticalScrollbarSize:6,horizontalScrollbarSize:6}}))}l(a,e=>{Y.value&&C.setTheme(e===`dark`?`vs-dark`:`vs`)});function Nt(e,t){let n={};t.forEach(e=>{n[e.source]||(n[e.source]=[]),n[e.source].push(e.target)});let r=new Map;e.forEach(e=>{let t=e.subsystem??`__default`;r.has(t)||r.set(t,[]),r.get(t).push(e)});let i=[],a=0;for(let[,e]of r){let t=new Set(e.map(e=>e.id)),r={},o=e.length?[e[0].id]:[];for(o[0]&&(r[o[0]]=0);o.length;){let e=o.shift();(n[e]||[]).filter(e=>t.has(e)).forEach(t=>{r[t]===void 0&&(r[t]=(r[e]??0)+1,o.push(t))})}let s={};e.forEach(e=>{let t=r[e.id]??0;s[t]=(s[t]||0)+1});let c={};e.forEach(e=>{let t=r[e.id]??0;c[t]=(c[t]??-1)+1;let n=c[t],o=s[t]??1,ee=a*600+n*220-(o-1)*220/2,l=t*110,u=At(e);i.push({id:e.id,type:`default`,position:{x:ee,y:l},label:e.label,class:`sm-fn-node`,data:{...e,_accentColor:u},style:{"--node-accent":u}})}),a++}return{flowNodes:i,flowEdges:t.map((e,t)=>({id:`e_${t}_${e.source}_${e.target}`,source:e.source,target:e.target,type:`smoothstep`,animated:!1,class:`sm-fn-edge`,markerEnd:{type:ee.ArrowClosed}}))}}async function Pt(){let e=Ct.value,n=wt.value;if(e.length!==0){B.value=!0;try{await t(),await new Promise(e=>requestAnimationFrame(()=>e())),Tt(e.map(e=>e.id)),await new Promise(e=>requestAnimationFrame(()=>e()));let r=new Map;e.forEach(e=>{let t=e.data?.subsystem??`__default__`;r.has(t)||r.set(t,[]),r.get(t).push(e)});let i=new Map,a=0;for(let[,e]of r){let t=new _e.default.graphlib.Graph;t.setDefaultEdgeLabel(()=>({})),t.setGraph({rankdir:`TB`,nodesep:55,ranksep:75,marginx:40,marginy:40});let r=new Set(e.map(e=>e.id));e.forEach(e=>{let n=190,r=e.data?.description?68:48,i=document.querySelector(`.vue-flow__node[data-id="${e.id}"]`);i&&i.offsetWidth>0&&(n=i.offsetWidth,r=i.offsetHeight),t.setNode(e.id,{width:n,height:r})}),n.forEach(e=>{r.has(e.source)&&r.has(e.target)&&t.setEdge(e.source,e.target)}),_e.default.layout(t);let o=0;e.forEach(e=>{let n=t.node(e.id);n&&(i.set(e.id,{x:a+n.x-n.width/2,y:n.y-n.height/2}),o=Math.max(o,n.x+n.width/2))}),a+=o+120}X(e.map(e=>({...e,position:i.get(e.id)??e.position}))),await t(),xt({padding:.18})}finally{B.value=!1}}}async function Ft(){if(!O.value.trim()){pe.warning(T(`@SRCMAP:请先输入项目路径`));return}if(!Z.value){A.value=[],j.value=null,M.value=null,P.value=``,F.value=``,X([]),St([]),k.value=`scanning`,$(T(`@SRCMAP:开始分析项目...`),`info`);try{let e=await fetch(`/api/code-analysis/analyze`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:O.value})});if(!e.ok){let t=await e.json().catch(()=>({error:`请求失败`}));throw Error(t.error||`HTTP ${e.status}`)}let t=e.body.getReader(),n=new TextDecoder,r=``;k.value=`analyzing`;let i=``,a=[];for(;;){let{done:e,value:o}=await t.read();if(e)break;r+=n.decode(o,{stream:!0});let s=r.split(`
|
|
2
|
-
`);r=s.pop()??``;for(let e of s)if(e.startsWith(`event:`))i=e.slice(6).trim(),a=[];else if(e.startsWith(`data:`))a.push(e.slice(5).trim());else if(e===``){if(i&&a.length){let e=a.join(``);try{let t=JSON.parse(e);It(i,t)}catch{}}i=``,a=[]}}}catch(e){$(`${T(`@SRCMAP:分析失败`)}: ${e.message}`,`error`),k.value=`error`}}}function It(e,n){if(e===`log`)$(n.message,n.type||`info`);else if(e===`files`)L.value=Ot(n.files||[]),L.value.forEach(e=>{e.kind===`dir`&&R.value.add(e.path)});else if(e===`result`){j.value={language:n.language||``,entryFile:n.entryFile||``,entryFunction:n.entryFunction||``,nodes:Array.isArray(n.nodes)?n.nodes:[],edges:Array.isArray(n.edges)?n.edges:[],techStack:Array.isArray(n.techStack)?n.techStack:[],summary:n.summary||``,allFiles:Array.isArray(n.allFiles)?n.allFiles:[],codeFiles:Array.isArray(n.codeFiles)?n.codeFiles:[],subsystems:Array.isArray(n.subsystems)?n.subsystems:void 0};let{flowNodes:e,flowEdges:r}=Nt(j.value.nodes,j.value.edges);X(e),St(r),t(()=>Pt())}else e===`done`&&(n.error?($(`${T(`@SRCMAP:分析失败`)}: ${n.error}`,`error`),k.value=`error`):k.value=`done`)}async function Lt(e){if(!(!e||I.value)&&F.value!==e){I.value=!0,F.value=e,P.value=``;try{let t=await(await fetch(`/api/code-analysis/file-content?path=${encodeURIComponent(O.value)}&file=${encodeURIComponent(e)}`)).json();if(t.error)throw Error(t.error);P.value=t.content||``}catch(e){P.value=`// ${T(`@SRCMAP:加载失败`)}: ${e.message}`}finally{I.value=!1}}}function Rt(e){let t=e.node.data;M.value=t.id,t.file&&Lt(t.file)}function zt(e){R.value.has(e)?R.value.delete(e):R.value.add(e)}let Bt=y(()=>{let e=[];function t(n,r){for(let i of n){let n=R.value.has(i.path);e.push({name:i.name,path:i.path,kind:i.kind,depth:r,expanded:n}),i.kind===`dir`&&n&&t(i.children,r+1)}}return t(L.value,0),e});return l(()=>D.currentDirectory,e=>{e&&!O.value&&(O.value=e)}),l([P,F],([e,t])=>{let n=Y.value;if(!n)return;let r=jt(t||``),i=n.getModel(),a=C.createModel(e||``,r);n.setModel(a),i?.dispose(),n.setScrollPosition({scrollTop:0,scrollLeft:0})}),ce(()=>{Mt(),!O.value&&D.currentDirectory&&(O.value=D.currentDirectory),E=new MutationObserver(()=>me()),E.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-theme`]})}),te(()=>{Y.value?.getModel()?.dispose(),Y.value?.dispose(),q(),E?.disconnect(),E=null}),(e,t)=>{let i=o;return v(),x(`div`,ve,[_(`div`,ye,[_(`div`,be,[t[9]||=_(`svg`,{viewBox:`0 0 24 24`,width:`18`,height:`18`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,class:`sm-icon-map`},[_(`polygon`,{points:`3 6 9 3 15 6 21 3 21 18 15 21 9 18 3 21`}),_(`line`,{x1:`9`,y1:`3`,x2:`9`,y2:`18`}),_(`line`,{x1:`15`,y1:`6`,x2:`15`,y2:`21`})],-1),_(`span`,xe,b(p(T)(`@SRCMAP:源码地图`)),1)]),_(`div`,Se,[w(_(`input`,{"onUpdate:modelValue":t[0]||=e=>O.value=e,class:`sm-path-input`,placeholder:p(T)(`@SRCMAP:输入项目目录路径`),disabled:Z.value,onKeydown:le(Ft,[`enter`])},null,40,Ce),[[de,O.value]]),_(`button`,{class:`sm-btn sm-btn-primary`,disabled:Z.value,onClick:Ft},[Z.value?(v(),x(g,{key:0},[t[10]||=_(`span`,{class:`sm-spinner`},null,-1),S(` `+b(p(T)(`@SRCMAP:分析中...`)),1)],64)):(v(),x(g,{key:1},[S(b(k.value===`done`?p(T)(`@SRCMAP:重新分析`):p(T)(`@SRCMAP:开始分析`)),1)],64))],8,we)]),_(`div`,Te,[f(i,{content:p(T)(`@SRCMAP:文件列表`),placement:`bottom`},{default:d(()=>[_(`button`,{class:n([`sm-panel-btn`,{active:z.value.files}]),onClick:t[1]||=e=>z.value.files=!z.value.files},t[11]||=[_(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[_(`path`,{d:`M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z`})],-1)],2)]),_:1},8,[`content`]),f(i,{content:p(T)(`@SRCMAP:调用图`),placement:`bottom`},{default:d(()=>[_(`button`,{class:n([`sm-panel-btn`,{active:z.value.graph}]),onClick:t[2]||=e=>z.value.graph=!z.value.graph},t[12]||=[_(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[_(`circle`,{cx:`12`,cy:`12`,r:`3`}),_(`circle`,{cx:`3`,cy:`6`,r:`2`}),_(`circle`,{cx:`21`,cy:`6`,r:`2`}),_(`circle`,{cx:`3`,cy:`18`,r:`2`}),_(`circle`,{cx:`21`,cy:`18`,r:`2`}),_(`line`,{x1:`5`,y1:`6`,x2:`9`,y2:`11`}),_(`line`,{x1:`19`,y1:`6`,x2:`15`,y2:`11`}),_(`line`,{x1:`5`,y1:`18`,x2:`9`,y2:`13`}),_(`line`,{x1:`19`,y1:`18`,x2:`15`,y2:`13`})],-1)],2)]),_:1},8,[`content`]),f(i,{content:p(T)(`@SRCMAP:源码面板`),placement:`bottom`},{default:d(()=>[_(`button`,{class:n([`sm-panel-btn`,{active:z.value.source}]),onClick:t[3]||=e=>z.value.source=!z.value.source},t[13]||=[_(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[_(`polyline`,{points:`16 18 22 12 16 6`}),_(`polyline`,{points:`8 6 2 12 8 18`})],-1)],2)]),_:1},8,[`content`])])]),_(`div`,Ee,[w(_(`div`,{class:`sm-panel sm-panel-files`,style:c({width:vt.value+`px`})},[_(`div`,De,[_(`button`,{class:n([`sm-tab-btn`,{active:N.value===`files`}]),onClick:t[4]||=e=>N.value=`files`},[t[14]||=_(`svg`,{viewBox:`0 0 24 24`,width:`12`,height:`12`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[_(`path`,{d:`M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z`})],-1),S(` `+b(p(T)(`@SRCMAP:文件列表`))+` `,1),j.value?(v(),x(`span`,Oe,b(j.value.allFiles.length),1)):m(``,!0)],2),_(`button`,{class:n([`sm-tab-btn`,{active:N.value===`outline`}]),onClick:t[5]||=e=>N.value=`outline`},[t[15]||=se(`<svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.8" data-v-71d3569e><line x1="8" y1="6" x2="21" y2="6" data-v-71d3569e></line><line x1="8" y1="12" x2="21" y2="12" data-v-71d3569e></line><line x1="8" y1="18" x2="21" y2="18" data-v-71d3569e></line><line x1="3" y1="6" x2="3.01" y2="6" data-v-71d3569e></line><line x1="3" y1="12" x2="3.01" y2="12" data-v-71d3569e></line><line x1="3" y1="18" x2="3.01" y2="18" data-v-71d3569e></line></svg>`,1),S(` `+b(p(T)(`@SRCMAP:大纲`)),1)],2)]),w(_(`div`,ke,[Bt.value.length>0?(v(!0),x(g,{key:0},u(Bt.value,e=>(v(),x(`div`,{key:e.path,class:n([`sm-tree-node`,{"sm-tree-node--dir":e.kind===`dir`,"sm-tree-node--active":e.kind===`file`&&F.value===e.path}]),style:c({paddingLeft:10+e.depth*14+`px`}),onClick:t=>e.kind===`dir`?zt(e.path):Lt(e.path)},[e.kind===`dir`?(v(),x(`span`,{key:0,class:n([`sm-tree-arrow`,{expanded:e.expanded}])},t[16]||=[_(`svg`,{viewBox:`0 0 24 24`,width:`10`,height:`10`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[_(`polyline`,{points:`9 18 15 12 9 6`})],-1)],2)):(v(),x(`span`,je)),e.kind===`dir`?(v(),x(`svg`,Me,[_(`use`,{"xlink:href":`#${p(ge)(e.name)||`icon-folder`}`},null,8,Ne)])):(v(),x(`svg`,Pe,[_(`use`,{"xlink:href":`#${p(ge)(e.name)}`},null,8,Fe)])),_(`span`,{class:`sm-tree-name`,title:e.path},b(e.name),9,Ie)],14,Ae))),128)):(v(),x(`div`,Le,b(p(T)(`@SRCMAP:暂无文件,请先开始分析`)),1))],512),[[h,N.value===`files`]]),w(_(`div`,Re,[Dt.value.length>0?(v(!0),x(g,{key:0},u(Dt.value,e=>(v(),x(`div`,{key:e.displayName,class:`sm-outline-group`},[_(`div`,{class:`sm-outline-group-header`,style:c({color:e.color})},[t[17]||=_(`svg`,{viewBox:`0 0 24 24`,width:`8`,height:`8`,fill:`currentColor`},[_(`circle`,{cx:`12`,cy:`12`,r:`6`})],-1),S(` `+b(e.displayName)+` `,1),_(`span`,ze,b(e.nodes.length),1)],4),(v(!0),x(g,null,u(e.nodes,t=>(v(),x(`div`,{key:t.id,class:n([`sm-outline-node`,{"sm-outline-node--active":M.value===t.id}]),onClick:e=>{M.value=t.id,t.file&&Lt(t.file)}},[_(`span`,{class:`sm-outline-dot`,style:c({background:e.color})},null,4),_(`span`,{class:`sm-outline-label`,title:t.file||t.label},b(t.label),9,Ve),t.description?(v(),x(`span`,He,b(t.description.length>18?t.description.slice(0,18)+`…`:t.description),1)):m(``,!0)],10,Be))),128))]))),128)):(v(),x(`div`,Ue,b(p(T)(`@SRCMAP:暂无分析结果`)),1))],512),[[h,N.value===`outline`]])],4),[[h,z.value.files]]),w(_(`div`,{class:`sm-resizer sm-resizer-v`,onMousedown:t[6]||=e=>K(`files`,e)},null,544),[[h,z.value.files&&z.value.graph]]),w(_(`div`,We,[j.value?(v(),x(`div`,Ge,[_(`span`,Ke,b(j.value.language),1),j.value.subsystems&&j.value.subsystems.length>1?(v(!0),x(g,{key:0},u(j.value.subsystems,e=>(v(),x(`span`,{key:e.name,class:`sm-subsystem-tag`,style:c({borderColor:e.color,color:e.color})},`● `+b(e.displayName||e.name),5))),128)):(v(!0),x(g,{key:1},u(j.value.techStack.slice(0,4),e=>(v(),x(`span`,{key:e,class:`sm-tech-tag`},b(e),1))),128)),_(`span`,qe,b(j.value.summary),1)])):m(``,!0),_(`div`,Je,[_(`div`,Ye,[_(`button`,{class:`sm-layout-btn`,disabled:B.value||!j.value,onClick:Pt},[t[18]||=se(`<svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.8" data-v-71d3569e><rect x="3" y="3" width="7" height="7" rx="1" data-v-71d3569e></rect><rect x="14" y="3" width="7" height="7" rx="1" data-v-71d3569e></rect><rect x="3" y="14" width="7" height="7" rx="1" data-v-71d3569e></rect><rect x="14" y="14" width="7" height="7" rx="1" data-v-71d3569e></rect></svg>`,1),S(` `+b(B.value?p(T)(`@SRCMAP:布局中...`):p(T)(`@SRCMAP:优化布局`)),1)],8,Xe)]),f(p(s),{class:`sm-vue-flow`,"default-viewport":{zoom:1},"min-zoom":.2,"max-zoom":4,"fit-view-on-init":``,onNodeClick:Rt},{"node-default":d(({data:e,label:t})=>[f(p(oe),{type:`target`,position:p(ue).Top},null,8,[`position`]),_(`div`,{class:`sm-fn-inner`,title:`${t}${e?.description?`
|
|
3
|
-
`+e.description:``}`},[_(`div`,Qe,b(t),1),e?.description?(v(),x(`div`,$e,b(e.description.length>22?e.description.slice(0,22)+`…`:e.description),1)):m(``,!0)],8,Ze),f(p(oe),{type:`source`,position:p(ue).Bottom},null,8,[`position`])]),default:d(()=>[f(p(r),{variant:p(ie).Dots,gap:20,size:1,"pattern-color":Et.value},null,8,[`variant`,`pattern-color`]),f(p(re)),f(p(fe),{"node-color":`#3b82f6`,"mask-color":a.value===`dark`?`rgba(0,0,0,0.55)`:`rgba(15,23,42,0.06)`},null,8,[`mask-color`])]),_:1}),!j.value&&!Z.value?(v(),x(`div`,et,[(v(),x(`svg`,tt,t[19]||=[_(`polygon`,{points:`3 6 9 3 15 6 21 3 21 18 15 21 9 18 3 21`},null,-1),_(`line`,{x1:`9`,y1:`3`,x2:`9`,y2:`18`},null,-1),_(`line`,{x1:`15`,y1:`6`,x2:`15`,y2:`21`},null,-1)])),_(`p`,null,b(p(T)(`@SRCMAP:输入项目路径后点击开始分析`)),1)])):m(``,!0),Z.value&&!j.value?(v(),x(`div`,nt,[t[20]||=_(`span`,{class:`sm-spinner sm-spinner-lg`},null,-1),_(`p`,null,b(p(T)(`@SRCMAP:AI 正在分析项目结构...`)),1)])):m(``,!0)]),_(`div`,{class:`sm-resizer sm-resizer-h`,onMousedown:t[7]||=e=>K(`log`,e)},null,32),_(`div`,{class:`sm-log-panel`,style:c({height:H.value+`px`})},[_(`div`,rt,[t[21]||=_(`svg`,{viewBox:`0 0 24 24`,width:`12`,height:`12`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[_(`polyline`,{points:`4 17 10 11 4 5`}),_(`line`,{x1:`12`,y1:`19`,x2:`20`,y2:`19`})],-1),S(` `+b(p(T)(`@SRCMAP:Agent 日志`))+` `,1),Z.value?(v(),x(`span`,it)):m(``,!0)]),_(`div`,at,[(v(!0),x(g,null,u(A.value.slice(-50),e=>(v(),x(`div`,{key:e.id,class:n([`sm-log-entry`,`sm-log-entry--${e.type}`])},b(e.message),3))),128)),A.value.length===0?(v(),x(`div`,ot,b(p(T)(`@SRCMAP:等待开始分析`)),1)):m(``,!0)],512)],4)],512),[[h,z.value.graph]]),w(_(`div`,{class:`sm-resizer sm-resizer-v`,onMousedown:t[8]||=e=>K(`source`,e)},null,544),[[h,z.value.graph&&z.value.source]]),w(_(`div`,{class:`sm-panel sm-panel-source`,style:c({width:V.value+`px`})},[_(`div`,st,[t[22]||=_(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[_(`polyline`,{points:`16 18 22 12 16 6`}),_(`polyline`,{points:`8 6 2 12 8 18`})],-1),S(` `+b(F.value||p(T)(`@SRCMAP:源码面板`))+` `,1),Q.value?(v(),x(`span`,ct,b(Q.value.label),1)):m(``,!0)]),Q.value?(v(),x(`div`,lt,[_(`div`,ut,b(Q.value.label),1),_(`div`,dt,[S(b(Q.value.file),1),Q.value.line?(v(),x(`span`,ft,` :`+b(Q.value.line),1)):m(``,!0)]),Q.value.description?(v(),x(`div`,pt,b(Q.value.description),1)):m(``,!0)])):m(``,!0),_(`div`,mt,[I.value?(v(),x(`div`,ht,t[23]||=[_(`span`,{class:`sm-spinner`},null,-1)])):m(``,!0),!I.value&&!P.value?(v(),x(`div`,gt,b(p(T)(`@SRCMAP:点击调用图中的节点查看源码`)),1)):m(``,!0),_(`div`,{ref_key:`monacoContainerRef`,ref:J,class:`sm-monaco-container`},null,512)])],4),[[h,z.value.source]])])])}}}),[[`__scopeId`,`data-v-71d3569e`]]);export{D as default};
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import"./rolldown-runtime-BM3Ffeng.js";import{$n as e,$r as t,An as n,Bi as r,Di as i,Dn as a,Dr as o,En as s,Er as c,Gi as l,Hi as u,Hn as d,Ii as f,Ir as p,Ki as m,Kn as h,Li as g,Ln as _,Ni as v,Nr as ee,Oi as y,On as b,Pr as x,Qn as S,Ri as C,Si as w,Tn as te,Un as T,Vi as E,Wi as D,Wn as O,Xn as ne,Zn as k,_i as A,_n as re,_r as j,br as ie,di as M,dn as ae,er as oe,fr as se,gi as N,gn as P,hi as F,ir as ce,ji as I,jn as le,ki as ue,kn as de,kr as fe,li as pe,ln as L,mi as R,mr as me,oi as he,pi as ge,qi as z,si as _e,sr as ve,ui as B,un as V,vi as H,wi as U,xi as W,zi as ye}from"./vendor-CDAfMQIV.js";import{n as G,t as be}from"./_plugin-vue_export-helper-rFkdzaHd.js";import{t as xe}from"./index-CLVL3Inb.js";var Se={key:0,class:`ai-split-status`},Ce={key:1,class:`ai-split-status is-error`},we={class:`ai-split-prompt-actions`},Te={key:0,class:`ai-split-prompt-editor`},Ee={class:`ai-split-prompt-editor__actions`},De={key:1,class:`ai-split-pre`},K={class:`ai-split-subhead`},q={class:`ai-split-pre`},J={key:0,class:`ai-split-tab-count`},Y={class:`ai-split-pre ai-split-pre--think`},Oe={key:0,class:`ai-split-tab-count`},ke={class:`ai-split-parse-error__detail`},X={class:`ai-split-parse-error__hint`},Ae={class:`ai-split-parse-error__actions`},je={key:1,class:`ai-split-raw-toolbar`},Me={class:`ai-split-raw-tip`},Ne={key:0,class:`ai-split-tab-count`},Pe={key:0,class:`ai-split-empty`},Z={key:1,class:`ai-split-list`},Fe={class:`ai-split-list__no`},Ie={class:`ai-split-list__body`},Le={class:`ai-split-list__title`},Re={class:`ai-split-list__desc`},ze={key:2,class:`ai-split-footer-hint`},Be=be(U({__name:`AISplitDialog`,props:{modelValue:{type:Boolean},title:{},desc:{},taskId:{},promptId:{}},emits:[`update:modelValue`,`confirm`],setup(e,{emit:n}){let r=e,i=n,a=u(`idle`),s=u(`prompt`),c=u(``),l=u(``),d=u(``),f=u(``),p=u(``),m=u([]),ee=u(``),y=u(``),b=u(``),x=null,S=0,te=R(()=>d.value.length),T=R(()=>f.value.length),E=R(()=>a.value===`result`&&m.value.length>0),O=R(()=>a.value===`running`);function j(){ie(),i(`update:modelValue`,!1)}function ie(){x&&=(x.abort(),null)}function ae(){ie(),a.value=`idle`,s.value=`prompt`,c.value=``,l.value=``,d.value=``,f.value=``,p.value=``,m.value=[],ee.value=``,y.value=``,b.value=``}async function oe(){if(!r.title.trim()){V.warning(G(`@WORKBENCH:请先填写任务标题`));return}ae();let e=++S;a.value=`running`,s.value=`thinking`,x=new AbortController;let t=x;try{let n=await fetch(`/api/workbench/tasks/ai-split-subtasks`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`text/event-stream`},body:JSON.stringify({title:r.title,desc:r.desc,taskId:r.taskId||``,promptId:r.promptId||``}),signal:t.signal});if(e!==S)return;if(!n.ok||!n.body){let e=await n.text().catch(()=>``);throw Error(e||`HTTP ${n.status}`)}let i=n.body.getReader(),o=new TextDecoder(`utf-8`),u=``,h=null;for(;;){let{value:t,done:n}=await i.read();if(e!==S)return;if(n)break;u+=o.decode(t,{stream:!0});let r=u.split(`
|
|
2
|
-
`);u=r.pop()??``;for(let e of r){let t=e.trim();if(!t.startsWith(`data:`))continue;let n=t.slice(5).trim();if(!n)continue;let r;try{r=JSON.parse(n)}catch{continue}switch(r.type){case`meta`:c.value=r.prompt?.system||``,l.value=r.prompt?.user||``;break;case`thinking`:d.value+=String(r.delta||``);break;case`content`:f.value+=String(r.delta||``);break;case`done`:h=r;break;case`error`:throw Error(r.error||`AI 拆分失败`)}}}if(e!==S)return;if(!h)throw Error(G(`@WORKBENCH:AI 未返回结果`));m.value=Array.isArray(h.subtasks)?h.subtasks:[],p.value=h.raw||f.value,y.value=String(h.parseError||``),b.value=String(h.parseStage||``),d.value||=G(`@WORKBENCH:(当前模型未返回独立的思考内容,可切换到「原始结果」查看完整输出)`),a.value=`result`,s.value=m.value.length>0?`confirm`:(y.value,`raw`)}catch(n){if(console.log(`[AI Split] catch err:`,{name:n?.name,msg:n?.message,aborted:t.signal.aborted,nonce:{mine:e,cur:S}}),e!==S||n?.name===`AbortError`||t.signal.aborted)return;a.value=`error`,ee.value=n?.message||String(n)}finally{e===S&&(x=null)}}function se(){E.value&&(i(`confirm`,m.value.slice()),i(`update:modelValue`,!1))}function le(){oe()}let ue=u(!1);async function de(){if(!f.value.trim()){V.warning(G(`@WORKBENCH:原始结果为空,无法解析`));return}ue.value=!0;try{let e=await fetch(`/api/workbench/tasks/parse-subtasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({raw:f.value})}).then(e=>e.json());if(!e.success){V.error(e.error||G(`@WORKBENCH:解析失败`));return}m.value=Array.isArray(e.subtasks)?e.subtasks:[],y.value=String(e.parseError||``),b.value=String(e.parseStage||``),p.value=f.value,m.value.length>0?(V.success(G(`@WORKBENCH:解析成功,已识别 {n} 个子任务`,{n:m.value.length})),s.value=`confirm`):V.warning(G(`@WORKBENCH:仍未解析到子任务,请继续修改原始结果`))}catch(e){V.error(G(`@WORKBENCH:解析失败: `)+(e?.message||e))}finally{ue.value=!1}}g(()=>r.modelValue,e=>{e&&a.value===`idle`&&oe()});let fe=u(!1),pe=u(``),L=u(!1);function me(){pe.value=c.value,fe.value=!0}async function he(){if(!pe.value.trim()){V.warning(G(`@WORKBENCH:指令内容不能为空`));return}L.value=!0;try{let e=await fetch(`/api/workbench/tasks/ai-subtask-instruction`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({instruction:pe.value})}).then(e=>e.json());e.success?(V.success(G(`@WORKBENCH:已保存指令`)),fe.value=!1,le()):V.error(e.error||G(`@WORKBENCH:保存失败`))}catch(e){V.error(G(`@WORKBENCH:保存失败: `)+(e?.message||e))}finally{L.value=!1}}function ge(){fe.value=!1}return(e,n)=>{let r=t,u=h,p=ne,g=P,b=k,x=re,S=_;return I(),N(S,{"model-value":e.modelValue,"onUpdate:modelValue":n[4]||=e=>i(`update:modelValue`,e),title:D(G)(`@WORKBENCH:AI 拆分任务`),width:`800px`,"close-on-click-modal":!1,"close-on-press-escape":!O.value,"show-close":!O.value,onClose:j},{footer:C(()=>[a.value===`error`||a.value===`result`&&y.value&&m.value.length===0?(I(),N(u,{key:0,onClick:le},{default:C(()=>[W(z(D(G)(`@WORKBENCH:重新生成`)),1)]),_:1})):A(``,!0),w(u,{onClick:j},{default:C(()=>[W(z(D(G)(`@WORKBENCH:取消`)),1)]),_:1}),w(u,{type:`primary`,disabled:!E.value,onClick:se},{default:C(()=>[W(z(D(G)(`@WORKBENCH:确认入库`))+` (`+z(m.value.length)+`) `,1)]),_:1},8,[`disabled`])]),default:C(()=>[O.value?(I(),H(`div`,Se,[w(r,{class:`is-loading`},{default:C(()=>[w(D(o))]),_:1}),F(`span`,null,z(D(G)(`@WORKBENCH:AI 正在拆分…`)),1)])):a.value===`error`?(I(),H(`div`,Ce,[w(r,{color:`#f56c6c`},{default:C(()=>[w(D(ce))]),_:1}),F(`span`,null,z(ee.value),1)])):A(``,!0),w(x,{modelValue:s.value,"onUpdate:modelValue":n[3]||=e=>s.value=e,class:`ai-split-tabs`},{default:C(()=>[w(g,{label:D(G)(`@WORKBENCH:提示词`),name:`prompt`},{default:C(()=>[F(`div`,we,[w(u,{size:`small`,disabled:O.value,onClick:me},{default:C(()=>[W(z(D(G)(`@WORKBENCH:编辑指令`)),1)]),_:1},8,[`disabled`])]),fe.value?(I(),H(`div`,Te,[w(p,{modelValue:pe.value,"onUpdate:modelValue":n[0]||=e=>pe.value=e,type:`textarea`,rows:12,placeholder:D(G)(`@WORKBENCH:指令内容`)},null,8,[`modelValue`,`placeholder`]),F(`div`,Ee,[w(u,{size:`small`,onClick:ge},{default:C(()=>[W(z(D(G)(`@WORKBENCH:取消`)),1)]),_:1}),w(u,{size:`small`,type:`primary`,loading:L.value,onClick:he},{default:C(()=>[W(z(D(G)(`@WORKBENCH:保存并重跑`)),1)]),_:1},8,[`loading`])])])):(I(),H(`pre`,De,z(c.value||`(等待 LLM 启动…)`),1)),F(`h4`,K,z(D(G)(`@WORKBENCH:用户提示词(拼装后)`)),1),F(`pre`,q,z(l.value||`(等待 LLM 启动…)`),1)]),_:1},8,[`label`]),w(g,{name:`thinking`},{label:C(()=>[F(`span`,null,[W(z(D(G)(`@WORKBENCH:思考`))+` `,1),te.value>0?(I(),H(`span`,J,`(`+z(te.value)+`)`,1)):A(``,!0)])]),default:C(()=>[F(`pre`,Y,z(d.value||D(G)(`@WORKBENCH:(暂无输出)`)),1)]),_:1}),w(g,{name:`raw`},{label:C(()=>[F(`span`,null,[W(z(D(G)(`@WORKBENCH:原始结果`))+` `,1),T.value>0?(I(),H(`span`,Oe,`(`+z(T.value)+`)`,1)):A(``,!0)])]),default:C(()=>[y.value&&a.value===`result`?(I(),N(b,{key:0,type:`warning`,"show-icon":``,closable:!1,class:`ai-split-parse-error`},{title:C(()=>[W(z(D(G)(`@WORKBENCH:模型返回内容解析失败,无法识别为有效的子任务 JSON`)),1)]),default:C(()=>[F(`div`,ke,z(y.value),1),F(`div`,X,z(D(G)(`@WORKBENCH:常见原因:desc 内夹杂了 ASCII 双引号、出现尾随逗号,或输出被截断。可在下方文本框中手动修改后点「重新解析」,或重新生成。`)),1),F(`div`,Ae,[w(u,{size:`small`,type:`primary`,loading:ue.value,onClick:de},{default:C(()=>[W(z(D(G)(`@WORKBENCH:重新解析`)),1)]),_:1},8,[`loading`]),w(u,{size:`small`,onClick:le},{default:C(()=>[W(z(D(G)(`@WORKBENCH:重新生成`)),1)]),_:1}),w(u,{size:`small`,onClick:n[1]||=e=>s.value=`prompt`},{default:C(()=>[W(z(D(G)(`@WORKBENCH:去编辑指令`)),1)]),_:1})])]),_:1})):A(``,!0),a.value===`result`||f.value?(I(),H(`div`,je,[F(`span`,Me,z(D(G)(`@WORKBENCH:可直接编辑下方文本,修正后点「重新解析」即可入库`)),1),w(u,{size:`small`,type:`primary`,loading:ue.value,disabled:!f.value.trim(),onClick:de},{default:C(()=>[W(z(D(G)(`@WORKBENCH:重新解析`)),1)]),_:1},8,[`loading`,`disabled`])])):A(``,!0),w(p,{modelValue:f.value,"onUpdate:modelValue":n[2]||=e=>f.value=e,type:`textarea`,rows:14,placeholder:D(G)(`@WORKBENCH:(暂无输出)`),readonly:O.value,class:`ai-split-raw-editor`,resize:`none`},null,8,[`modelValue`,`placeholder`,`readonly`])]),_:1}),w(g,{name:`confirm`,disabled:m.value.length===0},{label:C(()=>[F(`span`,null,[W(z(D(G)(`@WORKBENCH:确认入库`))+` `,1),m.value.length>0?(I(),H(`span`,Ne,`(`+z(m.value.length)+`)`,1)):A(``,!0)])]),default:C(()=>[m.value.length===0?(I(),H(`div`,Pe,z(D(G)(`@WORKBENCH:(暂无子任务)`)),1)):(I(),H(`ul`,Z,[(I(!0),H(M,null,v(m.value,(e,t)=>(I(),H(`li`,{key:t,class:`ai-split-list__item`},[F(`div`,Fe,z(t+1),1),F(`div`,Ie,[F(`div`,Le,z(e.title),1),F(`div`,Re,z(e.desc),1)])]))),128))]))]),_:1},8,[`disabled`])]),_:1},8,[`modelValue`]),y.value&&a.value===`result`&&m.value.length===0?(I(),H(`div`,ze,[w(r,{color:`#e6a23c`},{default:C(()=>[w(D(ce))]),_:1}),F(`span`,null,z(D(G)(`@WORKBENCH:解析失败,未能从模型输出中提取出子任务 — 请查看「原始结果」`)),1)])):A(``,!0)]),_:1},8,[`model-value`,`title`,`close-on-press-escape`,`show-close`])}}}),[[`__scopeId`,`data-v-fa5bf380`]]),Ve={class:`wb-attachments__head`},He={class:`wb-attachments__label`},Ue={class:`wb-attachments__count`},We=[`disabled`],Ge={key:0,class:`wb-attachments__paste-hint`},Q={key:1,class:`wb-attachments__list`},Ke=[`title`,`onClick`],qe=[`src`,`alt`],Je={key:1},Ye={class:`wb-attachment__meta`},Xe=[`title`],Ze={class:`wb-attachment__sub`},Qe=[`onClick`,`title`],$e=U({__name:`AttachmentZone`,props:{attachments:{},isImage:{type:Function},humanSize:{type:Function},isUploading:{type:Boolean},isPasteHover:{type:Boolean},maxCount:{},onPick:{type:Function},onRemove:{type:Function}},emits:[`paste`,`drop`,`dragover`,`dragenter`,`dragleave`],setup(e,{emit:t}){let n=e,r=t,i=R(()=>n.attachments.filter(e=>n.isImage(e))),a=R(()=>i.value.map(e=>`/api/workbench/attachments/${e.id}/raw`)),o=u(0),s=u(!1);function c(e){if(n.isImage(e)){let t=i.value.findIndex(t=>t.id===e.id);o.value=t>=0?t:0,s.value=!0}else window.open(`/api/workbench/attachments/${e.id}/raw`,`_blank`,`noopener`)}function d(){s.value=!1}return(e,t)=>(I(),H(M,null,[F(`div`,{class:l([`wb-attachments`,{"is-paste-hover":e.isPasteHover}]),onPaste:t[1]||=e=>r(`paste`,e),onDrop:t[2]||=B(e=>r(`drop`,e),[`prevent`]),onDragover:t[3]||=B(e=>r(`dragover`,e),[`prevent`]),onDragenter:t[4]||=B(e=>r(`dragenter`,e),[`prevent`]),onDragleave:t[5]||=e=>r(`dragleave`,e)},[F(`div`,Ve,[F(`span`,He,[W(z(D(G)(`@WORKBENCH:附件`))+` `,1),F(`span`,Ue,z(e.attachments.length)+` / `+z(e.maxCount),1)]),F(`button`,{class:`wb-attachments__add wb-soft-btn`,disabled:e.isUploading||e.attachments.length>=e.maxCount,onClick:t[0]||=(...t)=>e.onPick&&e.onPick(...t)},z(e.isUploading?D(G)(`@WORKBENCH:上传中…`):D(G)(`@WORKBENCH:添加附件`)),9,We)]),e.isPasteHover?(I(),H(`div`,Ge,z(D(G)(`@WORKBENCH:粘贴图片以快速添加`)),1)):A(``,!0),e.attachments.length>0?(I(),H(`ul`,Q,[(I(!0),H(M,null,v(e.attachments,t=>(I(),H(`li`,{key:t.id,class:`wb-attachment`},[F(`button`,{type:`button`,class:`wb-attachment__preview`,title:D(G)(`@WORKBENCH:点击预览`),onClick:e=>c(t)},[F(`div`,{class:l([`wb-attachment__icon`,{"wb-attachment__icon--img":e.isImage(t)}])},[e.isImage(t)?(I(),H(`img`,{key:0,src:`/api/workbench/attachments/${t.id}/raw`,alt:t.originalName,loading:`lazy`},null,8,qe)):(I(),H(`span`,Je,z(t.ext.toUpperCase()),1))],2),F(`div`,Ye,[F(`div`,{class:`wb-attachment__name`,title:t.originalName},z(t.originalName),9,Xe),F(`div`,Ze,z(e.humanSize(t.size))+` · `+z(t.mimeType),1)])],8,Ke),F(`button`,{class:`wb-attachment__del`,onClick:B(n=>e.onRemove(t),[`stop`]),title:D(G)(`@WORKBENCH:删除`)},`×`,8,Qe)]))),128))])):A(``,!0)],34),(I(),N(ge,{to:`body`},[s.value&&a.value.length>0?(I(),N(D(de),{key:0,"url-list":a.value,"initial-index":o.value,"hide-on-click-modal":!0,onClose:d},null,8,[`url-list`,`initial-index`])):A(``,!0)]))],64))}}),et=[`open`],tt={class:`wb-log-summary`},nt={class:`wb-log-summary__left`},rt={key:0},it={key:1},at={key:2},ot={class:`wb-log-summary__right`},st={class:`wb-log-summary__meta`},ct=[`title`],lt={key:0,class:`wb-log-section`},ut={class:`wb-log-section__summary`},dt={class:`wb-log-section__tag wb-log-section__tag--user`},ft={class:`wb-log-section__count`},pt=[`title`],mt={class:`wb-log-section__pre wb-log-section__pre--user`},ht={key:1,class:`wb-log-section`},gt={class:`wb-log-section__summary`},_t={class:`wb-log-section__tag wb-log-section__tag--think`},vt={class:`wb-log-section__count`},yt=[`title`],bt={class:`wb-log-section__pre wb-log-section__pre--think`},xt={class:`wb-log-pre__head`},St={class:`wb-log-pre__label`},Ct={class:`wb-log-pre__meta`},wt=[`title`],Tt=64*1024,Et=be(U({__name:`JobLogDetails`,props:{job:{}},setup(e){let t=e,n=R(()=>t.job.status===`running`||t.job.status===`pending`);function r(){let e=t.job.output||``;return e?e.length<=Tt?e:`${G(`@WORKBENCH:…(前文已截断)`)}\n${e.slice(-Tt)}`:``}async function a(e){try{if(navigator?.clipboard?.writeText)return await navigator.clipboard.writeText(e),!0}catch{}try{let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.opacity=`0`,t.style.left=`-9999px`,document.body.appendChild(t),t.select();let n=document.execCommand(`copy`);return document.body.removeChild(t),n}catch{return!1}}async function o(e){let n=t.job[e]||``;if(!n){V.warning(G(`@WORKBENCH:暂无内容可复制`));return}await a(n)?V.success(G(`@WORKBENCH:已复制到剪贴板`)):V.error(G(`@WORKBENCH:复制失败`))}async function s(){let e=[];if(t.job.prompt&&e.push(`## ${G(`@WORKBENCH:用户提示词`)}\n\n${t.job.prompt}`),t.job.thinking&&e.push(`## ${G(`@WORKBENCH:Claude 思考`)}\n\n${t.job.thinking}`),t.job.output&&e.push(`## ${G(`@WORKBENCH:模型返回`)}\n\n${t.job.output}`),!e.length){V.warning(G(`@WORKBENCH:暂无内容可复制`));return}await a(e.join(`
|
|
3
|
-
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
`))?V.success(G(`@WORKBENCH:已复制到剪贴板`)):V.error(G(`@WORKBENCH:复制失败`))}let c=u(null);return g(()=>(t.job.output||``).length,async()=>{n.value&&(await i(),c.value&&(c.value.scrollTop=c.value.scrollHeight))}),(e,t)=>(I(),H(`details`,{class:`wb-log-details`,open:n.value},[F(`summary`,tt,[F(`span`,nt,[e.job.status===`running`?(I(),H(`span`,rt,`● `+z(D(G)(`@WORKBENCH:正在执行…`)),1)):e.job.status===`pending`?(I(),H(`span`,it,z(D(G)(`@WORKBENCH:排队中…`)),1)):(I(),H(`span`,at,z(D(G)(`@WORKBENCH:查看执行日志`)),1))]),F(`span`,ot,[F(`span`,st,z((e.job.output||``).length)+` `+z(D(G)(`@WORKBENCH:字符`)),1),F(`button`,{type:`button`,class:`wb-log-copy`,title:D(G)(`@WORKBENCH:复制全部(含提示词与输出)`),onClick:B(s,[`stop`])},` ⧉ `+z(D(G)(`@WORKBENCH:复制全部`)),9,ct)])]),e.job.prompt?(I(),H(`details`,lt,[F(`summary`,ut,[F(`span`,dt,z(D(G)(`@WORKBENCH:用户提示词`)),1),F(`span`,ft,z((e.job.prompt||``).length)+` `+z(D(G)(`@WORKBENCH:字符`)),1),F(`button`,{type:`button`,class:`wb-log-copy wb-log-copy--sm`,title:D(G)(`@WORKBENCH:复制用户提示词`),onClick:t[0]||=B(e=>o(`prompt`),[`stop`])},` ⧉ `+z(D(G)(`@WORKBENCH:复制`)),9,pt)]),F(`pre`,mt,z(e.job.prompt),1)])):A(``,!0),e.job.thinking?(I(),H(`details`,ht,[F(`summary`,gt,[F(`span`,_t,z(D(G)(`@WORKBENCH:Claude 思考`)),1),F(`span`,vt,z((e.job.thinking||``).length)+` `+z(D(G)(`@WORKBENCH:字符`)),1),F(`button`,{type:`button`,class:`wb-log-copy wb-log-copy--sm`,title:D(G)(`@WORKBENCH:复制思考内容`),onClick:t[1]||=B(e=>o(`thinking`),[`stop`])},` ⧉ `+z(D(G)(`@WORKBENCH:复制`)),9,yt)]),F(`pre`,bt,z(e.job.thinking),1)])):A(``,!0),F(`div`,xt,[F(`span`,St,z(D(G)(`@WORKBENCH:模型返回`)),1),F(`span`,Ct,z((e.job.output||``).length)+` `+z(D(G)(`@WORKBENCH:字符`)),1),F(`button`,{type:`button`,class:`wb-log-copy wb-log-copy--sm`,title:D(G)(`@WORKBENCH:复制模型返回`),onClick:t[2]||=B(e=>o(`output`),[`stop`])},` ⧉ `+z(D(G)(`@WORKBENCH:复制`)),9,wt)]),F(`pre`,{ref_key:`preRef`,ref:c,class:`wb-log-pre`},z(r()||D(G)(`@WORKBENCH:(暂无输出)`)),513)],8,et))}}),[[`__scopeId`,`data-v-ae32f993`]]);function Dt(e){switch(e){case`todo`:return G(`@WORKBENCH:待执行`);case`running`:return G(`@WORKBENCH:执行中`);case`done`:return G(`@WORKBENCH:已完成`);case`error`:return G(`@WORKBENCH:出错`);case`cancelled`:return G(`@WORKBENCH:已取消`);case`pending`:return G(`@WORKBENCH:排队中`);default:return e}}function Ot(e){switch(e){case`running`:return`var(--color-primary)`;case`done`:return`#22c55e`;case`error`:return`#ef4444`;case`cancelled`:return`#9ca3af`;case`pending`:return`#f59e0b`;default:return`var(--text-tertiary)`}}var kt={class:`exec-logs`},At={class:`exec-logs__head`},jt={class:`exec-logs__title-block`},Mt={class:`exec-logs__title`},Nt={class:`exec-logs__stats`},Pt={class:`exec-logs__head-actions`},Ft={class:`exec-logs__config`},$={class:`exec-logs__config-label`},It={class:`exec-logs__config-field`},Lt={class:`exec-logs__config-name`},Rt={class:`exec-logs__config-field`},zt={class:`exec-logs__config-name`},Bt={class:`exec-logs__filter`},Vt={key:0,class:`exec-logs__batch-meta`},Ht={key:0,class:`exec-logs__batch`},Ut={class:`exec-logs__list`},Wt={key:0,class:`exec-logs__empty`},Gt={class:`exec-logs__empty-art`,"aria-hidden":`true`},Kt={class:`exec-logs__empty-title`},qt={class:`exec-logs__empty-hint`},Jt={class:`exec-card__head`},Yt=[`title`],Xt={class:`exec-card__meta`},Zt={key:0,class:`exec-card__task`},Qt={key:1,class:`exec-card__time`},$t={key:2,class:`exec-card__exit`},en=[`title`,`onClick`],tn={key:0,class:`exec-card__error`},nn={key:1,class:`exec-logs__pager`},rn=50,an=be(U({__name:`ExecutionLogManager`,setup(e){function n(e){return e instanceof Error?e.message:String(e)}let r=u([]),i=u(0),o=E({count:0,sizeMB:0,byStatus:{}}),c=u(!1),d=u(new Set),f=E({q:``,status:``,page:1}),g=u({maxCount:500,maxSizeMB:256}),_=E({maxCount:500,maxSizeMB:256}),ee=u(!1),y=[{value:`pending`,label:G(`@WORKBENCH:排队中`)},{value:`running`,label:G(`@WORKBENCH:执行中`)},{value:`done`,label:G(`@WORKBENCH:已完成`)},{value:`error`,label:G(`@WORKBENCH:出错`)},{value:`cancelled`,label:G(`@WORKBENCH:已取消`)}],x=R(()=>r.value.length>0&&r.value.every(e=>d.value.has(e.id))),S=R(()=>r.value.some(e=>d.value.has(e.id))&&!x.value);async function T(){c.value=!0;try{let e=new URLSearchParams;f.q&&e.set(`q`,f.q),f.status&&e.set(`status`,f.status),e.set(`limit`,String(rn)),e.set(`offset`,String((f.page-1)*rn));let t=await fetch(`/api/workbench/jobs/list?${e.toString()}`).then(e=>e.json());if(!t.success)throw Error(t.error||`list failed`);r.value=t.jobs,i.value=t.total,o.count=t.stats.count,o.sizeMB=t.stats.sizeMB,o.byStatus=t.stats.byStatus;let n=new Set(r.value.map(e=>e.id));for(let e of Array.from(d.value))n.has(e)||d.value.delete(e)}catch(e){V.error(G(`@WORKBENCH:加载失败`)+`: `+n(e))}finally{c.value=!1}}async function k(){try{let e=await fetch(`/api/workbench/jobs/config`).then(e=>e.json());e.success&&(g.value=e.config,_.maxCount=e.config.maxCount,_.maxSizeMB=e.config.maxSizeMB)}catch{}}async function re(){ee.value=!0;try{let e=await fetch(`/api/workbench/jobs/config`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({maxCount:_.maxCount,maxSizeMB:_.maxSizeMB})}).then(e=>e.json());if(!e.success)throw Error(e.error||`save failed`);g.value=e.config,V.success(G(`@WORKBENCH:已保存策略`)),await T()}catch(e){V.error(G(`@WORKBENCH:保存失败`)+`: `+n(e))}finally{ee.value=!1}}function j(){f.page=1,T()}function ie(){f.q=``,f.status=``,f.page=1,T()}function oe(e,t){t?d.value.add(e):d.value.delete(e),d.value=new Set(d.value)}function se(e){if(e)for(let e of r.value)d.value.add(e.id);else for(let e of r.value)d.value.delete(e.id);d.value=new Set(d.value)}async function N(e){try{await L.confirm(G(`@WORKBENCH:确定要删除所选的 {count} 条日志吗?`,{count:1}),G(`@WORKBENCH:删除`),{type:`warning`})}catch{return}try{let t=await fetch(`/api/workbench/jobs/${e}`,{method:`DELETE`}).then(e=>e.json());if(!t.success)throw Error(t.error||`delete failed`);d.value.delete(e),d.value=new Set(d.value),await T()}catch(e){V.error(G(`@WORKBENCH:保存失败`)+`: `+n(e))}}async function P(){let e=Array.from(d.value);if(e.length!==0){try{await L.confirm(G(`@WORKBENCH:确定要删除所选的 {count} 条日志吗?`,{count:e.length}),G(`@WORKBENCH:批量删除`),{type:`warning`})}catch{return}try{let t=await fetch(`/api/workbench/jobs/batch-delete`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({ids:e})}).then(e=>e.json());if(!t.success)throw Error(t.error||`batch delete failed`);V.success(G(`@WORKBENCH:成功删除 {count} 条`,{count:t.removed||e.length})),d.value=new Set,await T()}catch(e){V.error(G(`@WORKBENCH:保存失败`)+`: `+n(e))}}}async function ce(){let e=o.count;if(e!==0){try{await L.confirm(G(`@WORKBENCH:确定要清空所有 {count} 条执行日志吗?此操作不可恢复。`,{count:e}),G(`@WORKBENCH:清空全部`),{type:`warning`,confirmButtonText:G(`@WORKBENCH:清空全部`)})}catch{return}try{let t=await fetch(`/api/workbench/jobs/clear`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({confirm:!0})}).then(e=>e.json());if(!t.success)throw Error(t.error||`clear failed`);V.success(G(`@WORKBENCH:成功删除 {count} 条`,{count:t.removed||e})),d.value=new Set,await T()}catch(e){V.error(G(`@WORKBENCH:保存失败`)+`: `+n(e))}}}function le(e,t){if(!e)return``;let n=new Date(e).getTime(),r=t?new Date(t).getTime():Date.now(),i=Math.max(0,r-n);return i<1e3?`${i}ms`:i<6e4?`${(i/1e3).toFixed(1)}s`:i<36e5?`${Math.floor(i/6e4)}m ${Math.floor(i%6e4/1e3)}s`:`${Math.floor(i/36e5)}h ${Math.floor(i%36e5/6e4)}m`}return ue(()=>{T(),k()}),(e,n)=>{let u=h,g=b,E=ne,k=s,ue=a,de=O,fe=t,L=te,R=ae;return I(),H(`div`,kt,[F(`header`,At,[F(`div`,jt,[F(`h2`,Mt,z(D(G)(`@WORKBENCH:执行日志`)),1),F(`span`,Nt,z(D(G)(`@WORKBENCH:共 {count} 条,占 {size} MB`,{count:o.count,size:o.sizeMB})),1)]),F(`div`,Pt,[w(u,{icon:D(p),size:`small`,loading:c.value,onClick:T},{default:C(()=>[W(z(D(G)(`@WORKBENCH:刷新`)),1)]),_:1},8,[`icon`,`loading`]),w(u,{type:`danger`,plain:``,size:`small`,disabled:o.count===0,onClick:ce},{default:C(()=>[W(z(D(G)(`@WORKBENCH:清空全部`)),1)]),_:1},8,[`disabled`])])]),F(`div`,Ft,[F(`span`,$,z(D(G)(`@WORKBENCH:保存策略`)),1),F(`span`,It,[F(`span`,Lt,z(D(G)(`@WORKBENCH:最大条数`)),1),w(g,{modelValue:_.maxCount,"onUpdate:modelValue":n[0]||=e=>_.maxCount=e,min:0,max:1e4,step:50,size:`small`,"controls-position":`right`,style:{width:`130px`}},null,8,[`modelValue`])]),F(`span`,Rt,[F(`span`,zt,z(D(G)(`@WORKBENCH:最大体积 (MB)`)),1),w(g,{modelValue:_.maxSizeMB,"onUpdate:modelValue":n[1]||=e=>_.maxSizeMB=e,min:0,max:10240,step:32,size:`small`,"controls-position":`right`,style:{width:`140px`}},null,8,[`modelValue`])]),w(u,{type:`primary`,size:`small`,loading:ee.value,onClick:re},{default:C(()=>[W(z(D(G)(`@WORKBENCH:保存策略`)),1)]),_:1},8,[`loading`])]),F(`div`,Bt,[w(E,{modelValue:f.q,"onUpdate:modelValue":n[2]||=e=>f.q=e,placeholder:D(G)(`@WORKBENCH:搜索标题 / 任务`),clearable:``,size:`small`,style:{width:`240px`},onKeyup:pe(j,[`enter`]),onClear:j},null,8,[`modelValue`,`placeholder`]),w(ue,{modelValue:f.status,"onUpdate:modelValue":n[3]||=e=>f.status=e,placeholder:D(G)(`@WORKBENCH:全部状态`),clearable:``,size:`small`,style:{width:`130px`},onChange:j},{default:C(()=>[(I(),H(M,null,v(y,e=>w(k,{key:e.value,label:e.label,value:e.value},null,8,[`label`,`value`])),64))]),_:1},8,[`modelValue`,`placeholder`]),w(u,{size:`small`,onClick:ie},{default:C(()=>[W(z(D(G)(`@WORKBENCH:重置`)),1)]),_:1}),n[5]||=F(`span`,{class:`exec-logs__filter-spacer`},null,-1),d.value.size>0?(I(),H(`span`,Vt,z(D(G)(`@WORKBENCH:已选择 {count} 项`,{count:d.value.size})),1)):A(``,!0)]),d.value.size>0?(I(),H(`div`,Ht,[w(de,{"model-value":x.value,indeterminate:S.value,onChange:se},{default:C(()=>[W(z(x.value?D(G)(`@WORKBENCH:取消全选`):D(G)(`@WORKBENCH:全选`)),1)]),_:1},8,[`model-value`,`indeterminate`]),w(u,{type:`danger`,size:`small`,onClick:P},{default:C(()=>[W(z(D(G)(`@WORKBENCH:批量删除`)),1)]),_:1})])):A(``,!0),ye((I(),H(`div`,Ut,[!c.value&&r.value.length===0?(I(),H(`div`,Wt,[F(`div`,Gt,[w(fe,null,{default:C(()=>[w(D(me))]),_:1})]),F(`div`,Kt,z(D(G)(`@WORKBENCH:暂无执行日志`)),1),F(`div`,qt,z(D(G)(`@WORKBENCH:点击「执行任务」开始一次执行,日志会出现在这里。`)),1)])):A(``,!0),(I(!0),H(M,null,v(r.value,e=>(I(),H(`article`,{key:e.id,class:l([`exec-card`,{"is-selected":d.value.has(e.id)}])},[F(`header`,Jt,[w(de,{"model-value":d.value.has(e.id),onChange:t=>oe(e.id,t)},null,8,[`model-value`,`onChange`]),F(`span`,{class:`exec-card__status`,style:m({color:D(Ot)(e.status),borderColor:D(Ot)(e.status)})},z(D(Dt)(e.status)),5),F(`span`,{class:`exec-card__title`,title:e.title||D(G)(`@WORKBENCH:无标题`)},z(e.title||D(G)(`@WORKBENCH:无标题`)),9,Yt),n[6]||=F(`span`,{class:`exec-card__spacer`},null,-1),F(`span`,Xt,[e.taskTitle?(I(),H(`span`,Zt,`📁 `+z(e.taskTitle),1)):A(``,!0),e.startedAt?(I(),H(`span`,Qt,`⏱ `+z(le(e.startedAt,e.endedAt)),1)):A(``,!0),e.exitCode===null?A(``,!0):(I(),H(`span`,$t,`exit `+z(e.exitCode),1))]),F(`button`,{type:`button`,class:`exec-card__del`,title:D(G)(`@WORKBENCH:删除`),onClick:t=>N(e.id)},`×`,8,en)]),e.error?(I(),H(`p`,tn,`⚠ `+z(e.error),1)):A(``,!0),w(Et,{job:e},null,8,[`job`])],2))),128))])),[[R,c.value]]),i.value>rn?(I(),H(`footer`,nn,[w(L,{"current-page":f.page,"onUpdate:currentPage":n[4]||=e=>f.page=e,"page-size":rn,total:i.value,layout:`prev, pager, next, total`,background:``,small:``,onCurrentChange:T},null,8,[`current-page`,`total`])])):A(``,!0)])}}}),[[`__scopeId`,`data-v-13ab606e`]]),on={class:`workbench`},sn={class:`wb-tabs`},cn={key:0,class:`workbench__editor-row`},ln={class:`wb-sidebar`},un={class:`wb-section`},dn={class:`wb-section__head`},fn={class:`wb-section__tag`},pn={class:`wb-section__title`},mn={class:`wb-pill wb-section__count`},hn={class:`wb-task-list`},gn=[`aria-expanded`,`title`,`onClick`,`onKeydown`],_n=[`title`],vn={class:`wb-pill wb-task-group__count`},yn=[`data-icon`,`onClick`],bn=[`data-icon`],xn={class:`wb-task-item__body`},Sn=[`title`],Cn={class:`wb-task-item__meta`},wn=[`title`],Tn={class:`wb-pill wb-task-item__num`},En=[`title`],Dn={class:`wb-pill wb-task-item__num`},On=[`title`],kn=[`title`],An=[`title`],jn=[`onClick`,`title`,`aria-label`],Mn={key:0,class:`wb-empty wb-empty--rich`},Nn={class:`wb-empty__art`,"aria-hidden":`true`},Pn={class:`wb-empty__title`},Fn={class:`wb-empty__hint`},In={class:`wb-empty__cta`},Ln={class:`wb-section`},Rn={class:`wb-section__head`},zn={class:`wb-section__tag wb-section__tag--accent`},Bn={class:`wb-section__title`},Vn={class:`wb-pill wb-section__count`},Hn=[`title`,`aria-label`],Un={class:`wb-prompt-list`},Wn={class:`wb-prompt-item__icon`},Gn=[`onClick`,`title`],Kn=[`title`],qn=[`onClick`,`title`,`aria-label`],Jn={key:0,class:`wb-empty wb-empty--compact`},Yn={class:`wb-split`},Xn={key:0,class:`wb-placeholder`},Zn={class:`wb-split__header`},Qn=[`placeholder`],$n=[`title`],er={key:0,class:`wb-meta-save__dot`},tr={key:1,class:`wb-meta-save__check`},nr={key:2,class:`wb-meta-save__bang`},rr={key:3,class:`wb-meta-save__dot`},ir={value:null},ar=[`value`],or=[`placeholder`],sr={class:`wb-split__sub-header`},cr={class:`wb-split__sub-actions`},lr={key:0,class:`wb-dirty-badge`},ur={class:`wb-sub-list`},dr={key:0,class:`wb-sub-item__row wb-sub-item__row--compact`},fr=[`title`],pr=[`title`],mr=[`title`,`aria-label`,`onClick`],hr=[`title`,`aria-label`,`onClick`],gr=[`title`,`aria-label`,`disabled`,`onClick`],_r=[`title`,`aria-label`,`disabled`,`onClick`],vr={class:`wb-sub-item__row`},yr=[`onUpdate:modelValue`,`placeholder`,`onPaste`],br=[`title`],xr=[`title`],Sr=[`title`,`aria-label`,`onClick`],Cr=[`title`,`onClick`],wr=[`title`,`aria-label`,`onClick`],Tr=[`title`,`aria-label`,`disabled`,`onClick`],Er=[`title`,`aria-label`,`disabled`,`onClick`],Dr=[`onUpdate:modelValue`,`placeholder`,`onPaste`],Or={key:0,class:`wb-empty wb-empty--rich`},kr={class:`wb-empty__art`,"aria-hidden":`true`},Ar={class:`wb-empty__title`},jr={class:`wb-empty__hint`},Mr={class:`wb-empty__cta`},Nr=[`disabled`],Pr={class:`wb-simple__header`},Fr={class:`wb-simple__hint`},Ir={class:`wb-simple__status-row`},Lr=[`title`],Rr={class:`wb-simple__status-text`},zr={key:0,class:`wb-simple__meta`},Br=[`title`],Vr={class:`wb-form-item__label wb-simple__override-summary`},Hr=[`title`],Ur=[`placeholder`],Wr={style:{display:`flex`,gap:`8px`,"align-items":`center`}},Gr=`__simple`,Kr=`__no_project__`,qr=`.png,.jpg,.jpeg,.gif,.webp,.bmp,.svg,.pdf,.txt,.md,.csv,.json,.log`,Jr=5*1024*1024,Yr=be(U({__name:`WorkbenchView`,setup(i){let o=u([]),p=u([]),b=u([]),te=u(`editor`),O=u(null),k=R(()=>p.value.find(e=>e.id===O.value)||null),re=R(()=>k.value?.type===`simple`),ae=u(new Map),P=u({title:``,desc:``,promptId:null,simpleOverride:``});function ce(){let e=new Map;if(k.value)for(let t of k.value.subtasks)e.set(t.id,{id:t.id,title:t.title,desc:t.desc,promptOverride:t.promptOverride});ae.value=e,k.value?P.value={title:k.value.title,desc:k.value.desc,promptId:k.value.promptId,simpleOverride:k.value.simpleOverride||``}:P.value={title:``,desc:``,promptId:null,simpleOverride:``}}let de=R(()=>{let e=new Set;if(!k.value)return e;for(let t of k.value.subtasks){let n=ae.value.get(t.id);if(!n){e.add(t.id);continue}(n.title!==t.title||n.desc!==t.desc||n.promptOverride!==t.promptOverride)&&e.add(t.id)}return e}),ge=R(()=>de.value.size>0),U=u(`idle`),be=u(0),Se=null,Ce=R(()=>{if(!k.value)return!1;let e=k.value;return P.value.title!==e.title||P.value.desc!==e.desc||P.value.promptId!==e.promptId||P.value.simpleOverride!==(e.simpleOverride||``)});function we(){Se!==null&&(clearTimeout(Se),Se=null)}async function Te(){if(!k.value)return!1;if(!Ce.value)return!0;if(U.value=`saving`,await _t(!1))return be.value=Date.now(),U.value=`saved`,setTimeout(()=>{U.value===`saved`&&Date.now()-be.value>=4e3&&(U.value=`idle`)},4e3),!0;U.value=`error`;let e=Date.now();return setTimeout(()=>{U.value===`error`&&Date.now()-e>=4e3&&(U.value=`idle`)},4e3),!1}g(()=>k.value?{id:k.value.id,title:k.value.title,desc:k.value.desc,promptId:k.value.promptId,simpleOverride:k.value.simpleOverride||``}:null,(e,t)=>{!e||!t||e.id!==t.id||(Se!==null&&clearTimeout(Se),Se=window.setTimeout(()=>{Te()},1500))},{deep:!0}),g(O,async(e,t)=>{we(),k.value&&Ce.value&&await Te()});function Ee(e){try{let t=new Blob([JSON.stringify(e)],{type:`application/json`});navigator.sendBeacon?.(`/api/workbench/tasks`,t)}catch{}}function De(){k.value&&Ce.value&&Ee(k.value)}let K=E({visible:!1,editing:null,name:``,content:``,aiLoading:!1}),q=E({visible:!1,text:``,loading:!1,saving:!1}),J=E({visible:!1,editing:null,title:``,desc:``,promptId:null,type:`complex`,simpleOverride:``}),Y=null,Oe=xe();function ke(){Oe.setRunning(b.value.filter(e=>e.status===`running`).length)}function X(e){return b.value.find(t=>t.subId===e)||null}function Ae(e,t){if(e===`hello`){b.value=t.jobs||[],ke();return}if(e===`job:update`){let e=t,n=b.value.findIndex(t=>t.id===e.id);n>=0?b.value[n]=e:b.value.push(e),ke();return}if(e===`job:thinking-delta`||e===`job:output-delta`){let n=e===`job:thinking-delta`?`thinking`:`output`,r=t?.delta||``;if(!r)return;let i=b.value.findIndex(e=>e.id===t.id);if(i<0)return;let a=b.value[i][n]||``;b.value[i][n]=a+r;return}if(e===`sub:update`){let e=p.value.find(e=>e.id===t.taskId);if(e){let n=e.subtasks.findIndex(e=>e.id===t.sub.id);n>=0&&(e.subtasks[n]=t.sub)}}if(e===`task:update`){let e=p.value.findIndex(e=>e.id===t.id);e>=0&&(p.value[e]=t)}e===`task:error`&&V.error(t.error||G(`@WORKBENCH:执行出错`))}let je=[{key:`image`,patterns:[/图\s*片/,/上\s*传/,/upload/i,/image/i,/screenshot/i,/截图/,/附件/,/attachment/i]},{key:`icon`,patterns:[/图\s*标/,/icon/i,/svg/i]},{key:`test`,patterns:[/测\s*试/,/test/i,/spec/i,/\bqa\b/i]},{key:`ui`,patterns:[/ui\s*优\s*化/,/样\s*式/,/style/i,/css/i,/界面/,/视\s*觉/,/design/i]}];function Me(e){let t=(e||``).trim();if(!t)return`doc`;for(let e of je)if(e.patterns.some(e=>e.test(t)))return e.key;return`doc`}let Ne={icon:r(me),image:r(ee),test:r(j),ui:r(fe),doc:r(me),idea:r(fe)};function Pe(e){return Ne[Me(e.title)]}function Z(e){return e?X(`${e.id}${Gr}`):null}function Fe(e){return e?e.status===`pending`||e.status===`running`?`running`:e.status===`done`?`done`:e.status===`cancelled`?`cancelled`:`error`:`idle`}function Ie(e){switch(e){case`running`:return`var(--color-primary)`;case`done`:return`#22c55e`;case`error`:return`#ef4444`;case`cancelled`:return`#9ca3af`;default:return`var(--text-tertiary)`}}function Le(e){switch(e){case`idle`:return G(`@WORKBENCH:尚未执行`);case`running`:return G(`@WORKBENCH:正在执行…`);case`done`:return G(`@WORKBENCH:已完成`);case`error`:return G(`@WORKBENCH:执行失败`);case`cancelled`:return G(`@WORKBENCH:已停止`)}}function Re(e){if(!e)return``;let t=new Date(e);if(Number.isNaN(t.getTime()))return e;let n=e=>String(e).padStart(2,`0`);return`${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}function ze(e){return Array.isArray(e.attachments)?e.attachments.length:0}function Ve(e){return Array.isArray(e.subtasks)?e.subtasks.length:0}function He(e){return Array.isArray(e.subtasks)?e.subtasks.filter(e=>e&&e.status===`done`).length:0}function Ue(e){return Array.isArray(e.subtasks)?e.subtasks.some(e=>e&&e.status===`running`):!1}async function We(){o.value=(await fetch(`/api/workbench/prompts`).then(e=>e.json()).catch(()=>({prompts:[]}))).prompts||[]}async function Ge(){p.value=(await fetch(`/api/workbench/tasks`).then(e=>e.json()).catch(()=>({tasks:[]}))).tasks||[],!O.value&&p.value.length>0&&(O.value=p.value[0].id),ce()}let Q=u({path:``,name:``});async function Ke(){let e=await fetch(`/api/workbench/current-project`).then(e=>e.json()).catch(()=>({}));e&&typeof e.projectPath==`string`&&(Q.value={path:e.projectPath,name:e.projectName||``})}let qe=u(new Set);function Je(e){return qe.value.has(e)}function Ye(e){qe.value.has(e)?qe.value.delete(e):qe.value.add(e),qe.value=new Set(qe.value)}let Xe=R(()=>{let e=p.value,t=new Map;for(let n of e){let e=(n.projectPath||``).trim()||Kr;t.has(e)||t.set(e,[]),t.get(e).push(n)}let n=Q.value.path,r=Array.from(t.keys()).sort((e,t)=>e===n?-1:t===n||e===Kr?1:t===Kr?-1:e.localeCompare(t));return{groups:r.map(e=>({path:e,label:e===Kr?G(`@WORKBENCH:未关联项目`):e,tasks:t.get(e)})),hasMultiple:r.length>1}});function Ze(e){if(!e||e===Kr)return e;let t=e.split(/[\\/]/).filter(Boolean);return t.length<=1?e:t.slice(-2).join(`/`)}g(()=>Xe.value.groups.map(e=>e.path),e=>{let t=Q.value.path,n=new Set(qe.value),r=!1;for(let i of e)i!==t&&!n.has(i)&&(n.add(i),r=!0);r&&(qe.value=n)},{immediate:!0});async function Qe(){b.value=(await fetch(`/api/workbench/jobs`).then(e=>e.json()).catch(()=>({jobs:[]}))).jobs||[],ke()}function et(){Y&&=(Y.close(),null),Y=new EventSource(`/api/workbench/events`),Y.onmessage=e=>{try{let t=JSON.parse(e.data);Ae(t.event,t.payload)}catch{}},Y.onerror=()=>{Y&&=(Y.close(),null),setTimeout(et,3e3)}}function tt(){K.editing=null,K.name=``,K.content=``,K.aiLoading=!1,K.visible=!0}function nt(e){K.editing=e,K.name=e.name,K.content=e.content,K.aiLoading=!1,K.visible=!0}async function rt(){if(!K.aiLoading){K.aiLoading=!0;try{let e=await fetch(`/api/workbench/prompts/ai-generate`,{method:`POST`}).then(e=>e.json());e.success?(K.name=e.name||K.name,K.content=e.result||``,V.success(G(`@WORKBENCH:已生成,可继续编辑`))):V.error(e.error||G(`@WORKBENCH:生成失败`))}catch(e){V.error(G(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}finally{K.aiLoading=!1}}}async function it(){q.visible=!0,q.loading=!0;try{let e=await fetch(`/api/workbench/prompts/ai-instruction`).then(e=>e.json());e.success?q.text=e.instruction||``:V.error(e.error||G(`@WORKBENCH:读取指令失败`))}catch(e){V.error(G(`@WORKBENCH:读取指令失败`)+`: `+(e&&e.message||e))}finally{q.loading=!1}}async function at(){if(!q.text.trim()){V.warning(G(`@WORKBENCH:指令内容不能为空`));return}q.saving=!0;try{let e=await fetch(`/api/workbench/prompts/ai-instruction`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({instruction:q.text})}).then(e=>e.json());e.success?(V.success(G(`@WORKBENCH:已保存指令`)),q.visible=!1):V.error(e.error||G(`@WORKBENCH:保存失败`))}catch(e){V.error(G(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}finally{q.saving=!1}}async function ot(){if(!K.name.trim()||!K.content.trim()){V.warning(G(`@WORKBENCH:名称和内容不能为空`));return}let e={id:K.editing?.id,name:K.name.trim(),content:K.content},t=await fetch(`/api/workbench/prompts`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}).then(e=>e.json());t.success?(V.success(G(`@WORKBENCH:已保存`)),K.visible=!1,We()):V.error(t.error||G(`@WORKBENCH:保存失败`))}async function st(e){await L.confirm(G(`@WORKBENCH:删除提示词「{name}」?`,{name:e.name}),G(`@WORKBENCH:确认`),{type:`warning`}),await fetch(`/api/workbench/prompts/${e.id}`,{method:`DELETE`}),We();for(let t of p.value)t.promptId===e.id&&(t.promptId=null,await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}));Ge()}function ct(){J.editing=null,J.title=``,J.desc=``,J.promptId=null,J.type=`complex`,J.simpleOverride=``,J.visible=!0}async function lt(){if(!J.title.trim()){V.warning(G(`@WORKBENCH:标题必填`));return}let e={id:J.editing?.id,title:J.title.trim(),desc:J.desc,promptId:J.promptId,type:J.type,simpleOverride:J.type===`simple`?J.simpleOverride:``,subtasks:J.editing?.subtasks||[]};!J.editing?.id&&Q.value.path&&(e.projectPath=Q.value.path);let t=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}).then(e=>e.json());if(t.success){V.success(G(`@WORKBENCH:已保存`));let e=!J.editing?.id;J.visible=!1,await Ge(),e&&t.task?.id?(O.value=t.task.id,ce()):O.value||=t.task.id}else V.error(t.error||G(`@WORKBENCH:保存失败`))}async function ut(e){await L.confirm(G(`@WORKBENCH:删除任务「{title}」及其所有子任务?`,{title:e.title}),G(`@WORKBENCH:确认`),{type:`warning`}),await fetch(`/api/workbench/tasks/${e.id}`,{method:`DELETE`}),O.value===e.id&&(O.value=null),Ge()}async function dt(e){O.value!==e.id&&(we(),k.value&&Ce.value&&await Te(),O.value=e.id,ce())}let ft=u(new Set);function pt(e){return ft.value.has(e)}function mt(e,t){t?ft.value.add(e):ft.value.delete(e),ft.value=new Set(ft.value)}async function ht(){if(!k.value)return;let e={id:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`,title:G(`@WORKBENCH:新子任务`),desc:``,status:`todo`,promptOverride:``};k.value.subtasks.push(e),mt(e.id,!0);try{await _t(!1)}finally{mt(e.id,!1)}}async function gt(e){if(k.value){k.value.subtasks=k.value.subtasks.filter(t=>t.id!==e.id),mt(e.id,!0);try{await _t(!1)}finally{mt(e.id,!1)}}}async function _t(e){if(!k.value)return!1;let t=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(k.value)}).then(e=>e.json());return t.success?(e&&V.success(G(`@WORKBENCH:已保存拆分`)),await Ge(),!0):(V.error(t.error||G(`@WORKBENCH:保存失败`)),!1)}async function vt(){await _t(!0)}let yt=u(!1);function bt(){if(k.value){if(!(k.value.title||``).trim()){V.warning(G(`@WORKBENCH:请先填写任务标题`));return}yt.value=!0}}function xt(e){if(k.value){for(let t of e)k.value.subtasks.push({id:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`,title:t.title,desc:t.desc||``,status:`todo`,promptOverride:``,attachments:[]});V.success(G(`@WORKBENCH:已生成 {n} 个子任务,请审阅后保存`,{n:e.length}))}}async function St(e){if(e.type===`simple`)return Ct(e);if(!e.subtasks||e.subtasks.length===0){V.warning(G(`@WORKBENCH:请先拆分任务`));return}if(k.value&&k.value.id===e.id){let t=p.value.find(t=>t.id===e.id);if((!t||t.title!==k.value.title||t.desc!==k.value.desc||JSON.stringify(t.subtasks)!==JSON.stringify(k.value.subtasks)||t.promptId!==k.value.promptId)&&!await _t(!1))return}let t=await fetch(`/api/workbench/tasks/${e.id}/run`,{method:`POST`}).then(e=>e.json());t.success?V.success(t.message||G(`@WORKBENCH:已加入执行队列`)):V.error(t.error||G(`@WORKBENCH:执行失败`))}async function Ct(e){if(k.value&&k.value.id===e.id){let t=p.value.find(t=>t.id===e.id);if((!t||t.title!==k.value.title||t.desc!==k.value.desc||t.promptId!==k.value.promptId||(t.simpleOverride||``)!==(k.value.simpleOverride||``))&&!await _t(!1))return}let t=await fetch(`/api/workbench/tasks/${e.id}/run-simple`,{method:`POST`}).then(e=>e.json());t.success?V.success(t.message||G(`@WORKBENCH:已加入执行队列`)):V.error(t.error||G(`@WORKBENCH:执行失败`))}async function wt(e){if(!k.value)return;let t=k.value,n=X(e.id);if(n&&(n.status===`running`||n.status===`pending`)){V.warning(G(`@WORKBENCH:该子任务正在执行中`));return}let r=p.value.find(e=>e.id===t.id);if((!r||r.title!==t.title||r.desc!==t.desc||JSON.stringify(r.subtasks)!==JSON.stringify(t.subtasks)||r.promptId!==t.promptId)&&!await _t(!1))return;let i=await fetch(`/api/workbench/subtasks/${e.id}/run`,{method:`POST`}).then(e=>e.json()).catch(e=>({success:!1,error:e?.message||String(e)}));i.success?V.success(i.message||G(`@WORKBENCH:已开始执行子任务`)):V.error(i.error||G(`@WORKBENCH:执行失败`))}function Tt(e){if(e.status===`done`)return!1;let t=X(e.id);return!(t&&(t.status===`running`||t.status===`pending`))}let kt=u(new Set);function At(e){return e.status===`done`?!kt.value.has(e.id):!1}function jt(e){kt.value.has(e.id)?kt.value.delete(e.id):kt.value.add(e.id),kt.value=new Set(kt.value)}async function Mt(e){if(k.value&&!pt(e.id)){mt(e.id,!0);try{let t=ae.value.get(e.id);t&&ae.value.set(e.id,{...t,status:`todo`}),e.status=`todo`,await _t(!1)}finally{mt(e.id,!1)}}}async function Nt(e){try{await L.confirm(G(`@WORKBENCH:确认停止执行?已输出的内容会保留。`),G(`@WORKBENCH:停止执行`),{confirmButtonText:G(`@WORKBENCH:停止`),cancelButtonText:G(`@WORKBENCH:取消`),type:`warning`})}catch{return}let t=await fetch(`/api/workbench/jobs/${e.id}/cancel`,{method:`POST`}).then(e=>e.json()).catch(e=>({success:!1,error:e?.message||String(e)}));t.success?V.success(G(`@WORKBENCH:已发送停止信号`)):V.error(t.error||G(`@WORKBENCH:停止失败`))}ue(async()=>{await Promise.all([We(),Ge(),Ke(),Qe()]),et(),window.addEventListener(`beforeunload`,De)}),y(()=>{Y&&=(Y.close(),null),window.removeEventListener(`beforeunload`,De),k.value&&Ce.value&&Ee(k.value)});let Pt=new Set([`image/png`,`image/jpeg`,`image/jpg`,`image/gif`,`image/webp`,`image/bmp`,`image/svg+xml`,`application/pdf`,`text/plain`,`text/markdown`,`text/x-markdown`,`text/csv`,`application/json`,`text/json`,`text/x-log`]),Ft=u({}),$=u(null);function It(e){return!!Ft.value[e]}function Lt(e,t){if(e instanceof File)return e;let n=e.type||`application/octet-stream`;return new File([e],t,{type:n})}function Rt(e){return e.kind===`task`?`task-${e.task?.id??``}`:`sub-${e.sub.id}`}function zt(e){let t=e.kind===`task`?e.task?.attachments:e.sub.attachments;return Array.isArray(t)?t:[]}function Bt(e,t){e.kind===`task`?e.task&&(e.task.attachments=t):e.sub.attachments=t}function Vt(e){return e.kind===`task`?`/api/workbench/tasks/${e.task?.id??``}/attachments`:`/api/workbench/subtasks/${e.sub.id}/attachments`}function Ht(e,t){return e.kind===`task`?`/api/workbench/tasks/${e.task?.id??``}/attachments/${t}`:`/api/workbench/subtasks/${e.sub.id}/attachments/${t}`}function Ut(e,t){if(!e.clipboardData)return;let n=Array.from(e.clipboardData.items).filter(e=>e.kind===`file`&&e.type.startsWith(`image/`));if(n.length>0){e.preventDefault();for(let e of n){let n=e.getAsFile();if(!n)continue;let r=(n.type.split(`/`)[1]||`png`).replace(`jpeg`,`jpg`);Gt(t,Lt(n,`paste-${new Date().toISOString().replace(/[:.]/g,`-`)}.${r}`))}return}let r=Array.from(e.clipboardData.items).filter(e=>e.kind===`file`&&!e.type.startsWith(`image/`));if(r.length>0){e.preventDefault();for(let e of r){let n=e.getAsFile();n&&Gt(t,Lt(n,n.name||`pasted-file`))}}}function Wt(e,t){$.value=null,Array.from(e.dataTransfer?.files||[]).forEach(e=>Gt(t,e))}async function Gt(e,t){if(t.size>Jr){V.error(`「${t.name}」${G(`@WORKBENCH:超过 5MB 限制`)}`);return}if(!Pt.has(t.type)&&!t.name.match(/\.(png|jpg|jpeg|gif|webp|bmp|svg|pdf|txt|md|markdown|csv|json|log)$/i)){V.error(`${G(`@WORKBENCH:不支持的文件类型`)}(${t.name})`);return}let n=zt(e);if(n.length>=9){V.error(G(`@WORKBENCH:单个任务最多 9 个附件`));return}if(n.find(e=>e.originalName===t.name&&e.size===t.size)){V.info(`${t.name} ${G(`@WORKBENCH:已存在,已复用`)}`);return}let r=Rt(e);Ft.value[r]=!0;try{let n=await fetch(Vt(e),{method:`POST`,headers:{"Content-Type":`application/octet-stream`,"X-Original-Name":t.name,"X-Mime-Type":t.type||`application/octet-stream`},body:t}).then(e=>e.json());if(n.success){let r=zt(e);r.push(n.attachment),Bt(e,r),V.success(`${G(`@WORKBENCH:已添加:`)}${t.name}`)}else V.error(n.error||G(`@WORKBENCH:上传失败`))}catch(e){V.error(G(`@WORKBENCH:上传失败`)+`:`+(e&&e.message||e))}finally{Ft.value[r]=!1}}async function Kt(e,t){try{await L.confirm(G(`@WORKBENCH:删除附件「{name}」?`,{name:t.originalName}),G(`@WORKBENCH:确认`),{type:`warning`})}catch{return}let n=await fetch(Ht(e,t.id),{method:`DELETE`}).then(e=>e.json());n.success?(Bt(e,zt(e).filter(e=>e.id!==t.id)),V.success(G(`@WORKBENCH:已删除`))):V.error(n.error||G(`@WORKBENCH:删除失败`))}function qt(e){let t=document.createElement(`input`);t.type=`file`,t.accept=qr,t.multiple=!0,t.onchange=()=>{Array.from(t.files||[]).forEach(t=>Gt(e,t))},t.click()}let Jt=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`bmp`,`svg`]);function Yt(e){return Jt.has(String(e.ext||``).toLowerCase())}function Xt(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(2)} MB`}return(r,i)=>{let u=t,g=h,y=ne,b=le,E=n,j=_,ae=d,P=T,ce=s,ue=a;return I(),H(`div`,on,[F(`header`,sn,[F(`button`,{type:`button`,class:l([`wb-tab`,{"is-active":te.value===`editor`}]),onClick:i[0]||=e=>te.value=`editor`},z(D(G)(`@WORKBENCH:任务执行`)),3),F(`button`,{type:`button`,class:l([`wb-tab`,{"is-active":te.value===`logs`}]),onClick:i[1]||=e=>te.value=`logs`},z(D(G)(`@WORKBENCH:执行日志`)),3)]),te.value===`editor`?(I(),H(`div`,cn,[F(`aside`,ln,[F(`section`,un,[F(`header`,dn,[F(`span`,fn,z(D(G)(`@WORKBENCH:任务`)),1),F(`h3`,pn,z(D(G)(`@WORKBENCH:任务列表`)),1),F(`span`,mn,z(p.value.length),1)]),F(`button`,{class:`wb-new-btn`,onClick:ct},[w(u,{class:`wb-new-btn__icon`},{default:C(()=>[w(D(x))]),_:1}),F(`span`,null,z(D(G)(`@WORKBENCH:新建任务`)),1),i[29]||=F(`span`,{class:`wb-new-btn__shortcut`},`N`,-1)]),F(`ul`,hn,[(I(!0),H(M,null,v(Xe.value.groups,t=>(I(),H(M,{key:t.path},[Xe.value.hasMultiple?(I(),H(`li`,{key:0,class:l([`wb-task-group__head`,{"is-current":t.path===Q.value.path,"is-collapsed":Je(t.path)}]),role:`button`,tabindex:`0`,"aria-expanded":!Je(t.path),title:Je(t.path)?D(G)(`@WORKBENCH:展开`):D(G)(`@WORKBENCH:收起`),onClick:e=>Ye(t.path),onKeydown:[pe(B(e=>Ye(t.path),[`prevent`]),[`enter`]),pe(B(e=>Ye(t.path),[`prevent`]),[`space`])]},[w(u,{class:`wb-task-group__caret`},{default:C(()=>[(I(),N(f(Je(t.path)?D(e):D(S))))]),_:2},1024),w(u,{class:`wb-task-group__icon`},{default:C(()=>[w(D(ie))]),_:1}),F(`span`,{class:`wb-task-group__name`,title:t.path===Q.value.path?Q.value.path:t.label},z(t.path===Q.value.path?Q.value.name:Ze(t.label)),9,_n),F(`span`,vn,z(t.tasks.length),1)],42,gn)):A(``,!0),Je(t.path)?A(``,!0):(I(!0),H(M,{key:1},v(t.tasks,e=>(I(),H(`li`,{key:e.id,class:l([`wb-task-item`,{active:e.id===O.value,"has-attachment":ze(e)>0,"is-other-project":e.projectPath&&e.projectPath!==Q.value.path,"is-running":Ue(e)}]),"data-icon":Me(e.title),onClick:t=>dt(e)},[F(`div`,{class:`wb-task-item__avatar`,"data-icon":Me(e.title)},[w(u,null,{default:C(()=>[(I(),N(f(Pe(e))))]),_:2},1024)],8,bn),F(`div`,xn,[F(`div`,{class:`wb-task-item__title`,title:e.title},z(e.title||D(G)(`@WORKBENCH:未命名任务`)),9,Sn),F(`div`,Cn,[Ve(e)>0?(I(),H(`span`,{key:0,class:l([`wb-task-item__meta-item`,{"wb-task-item__meta-item--running":Ue(e)}]),title:D(G)(`@WORKBENCH:个子任务`)},[w(u,{class:`wb-task-item__meta-icon`},{default:C(()=>[w(D(c))]),_:1}),F(`span`,Tn,z(He(e))+`/`+z(Ve(e)),1)],10,wn)):A(``,!0),ze(e)>0?(I(),H(`span`,{key:1,class:`wb-task-item__meta-item`,title:D(G)(`@WORKBENCH:附件`)},[w(u,{class:`wb-task-item__meta-icon`},{default:C(()=>[w(D(ee))]),_:1}),F(`span`,Dn,z(ze(e)),1)],8,En)):A(``,!0),e.promptId?(I(),H(`span`,{key:2,class:`wb-task-item__meta-item wb-task-item__meta-item--accent`,title:D(G)(`@WORKBENCH:已绑定预置提示词`)},[w(u,{class:`wb-task-item__meta-icon`},{default:C(()=>[w(D(fe))]),_:1})],8,On)):A(``,!0),e.type===`simple`?(I(),H(`span`,{key:3,class:`wb-task-item__meta-item wb-task-item__meta-item--simple`,title:D(G)(`@WORKBENCH:简单任务 - 无需拆分直接执行`)},z(D(G)(`@WORKBENCH:简单`)),9,kn)):A(``,!0),e.projectPath&&e.projectPath!==Q.value.path?(I(),H(`span`,{key:4,class:`wb-task-item__meta-item wb-task-item__meta-item--project`,title:e.projectPath},z(Ze(e.projectPath)),9,An)):A(``,!0)])]),F(`button`,{class:`wb-task-item__del`,onClick:B(t=>ut(e),[`stop`]),title:D(G)(`@WORKBENCH:删除`),"aria-label":D(G)(`@WORKBENCH:删除`)},[w(u,null,{default:C(()=>[w(D(ve))]),_:1})],8,jn)],10,yn))),128))],64))),128)),p.value.length===0?(I(),H(`li`,Mn,[F(`div`,Nn,[w(u,null,{default:C(()=>[w(D(se))]),_:1})]),F(`div`,Pn,z(D(G)(`@WORKBENCH:暂无任务`)),1),F(`div`,Fn,z(D(G)(`@WORKBENCH:点击上方按钮新建`)),1),F(`div`,In,[w(g,{type:`primary`,size:`small`,icon:D(x),onClick:ct},{default:C(()=>[W(z(D(G)(`@WORKBENCH:新建任务`)),1)]),_:1},8,[`icon`])])])):A(``,!0)])]),F(`section`,Ln,[F(`header`,Rn,[F(`span`,zn,z(D(G)(`@WORKBENCH:提示`)),1),F(`h3`,Bn,z(D(G)(`@WORKBENCH:预置提示词`)),1),F(`span`,Vn,z(o.value.length),1),F(`button`,{class:`wb-section__action`,onClick:tt,title:D(G)(`@WORKBENCH:新建提示词`),"aria-label":D(G)(`@WORKBENCH:新建提示词`)},[w(u,null,{default:C(()=>[w(D(x))]),_:1})],8,Hn)]),F(`ul`,Un,[(I(!0),H(M,null,v(o.value,e=>(I(),H(`li`,{key:e.id,class:`wb-prompt-item`},[F(`div`,Wn,[w(u,null,{default:C(()=>[w(D(fe))]),_:1})]),F(`span`,{class:`wb-prompt-item__name`,onClick:t=>nt(e),title:e.content},z(e.name),9,Gn),Q.value.name?(I(),H(`span`,{key:0,class:`wb-prompt-item__project`,title:D(G)(`@WORKBENCH:适用于当前项目`)+`:`+Q.value.path},z(Q.value.name),9,Kn)):A(``,!0),F(`button`,{class:`wb-prompt-item__del`,onClick:t=>st(e),title:D(G)(`@WORKBENCH:删除`),"aria-label":D(G)(`@WORKBENCH:删除`)},[w(u,null,{default:C(()=>[w(D(ve))]),_:1})],8,qn)]))),128)),o.value.length===0?(I(),H(`li`,Jn,z(D(G)(`@WORKBENCH:暂无提示词`)),1)):A(``,!0)])])]),F(`section`,Yn,[k.value?(I(),H(M,{key:1},[F(`div`,Zn,[ye(F(`input`,{class:`wb-input wb-input--title`,"onUpdate:modelValue":i[2]||=e=>k.value.title=e,placeholder:D(G)(`@WORKBENCH:任务标题`)},null,8,Qn),[[_e,k.value.title]]),U.value!==`idle`||Ce.value?(I(),H(`span`,{key:0,class:l([`wb-meta-save`,{"is-saving":U.value===`saving`,"is-saved":U.value===`saved`,"is-error":U.value===`error`,"is-dirty":Ce.value&&U.value===`idle`}]),title:U.value===`saving`?D(G)(`@WORKBENCH:保存中…`):U.value===`error`?D(G)(`@WORKBENCH:保存失败`):U.value===`saved`?D(G)(`@WORKBENCH:已保存`):``},[U.value===`saving`?(I(),H(`span`,er)):U.value===`saved`?(I(),H(`span`,tr,`✓`)):U.value===`error`?(I(),H(`span`,nr,`!`)):(I(),H(`span`,rr)),W(` `+z(U.value===`saving`?D(G)(`@WORKBENCH:保存中…`):U.value===`saved`?D(G)(`@WORKBENCH:已保存`):U.value===`error`?D(G)(`@WORKBENCH:保存失败`):D(G)(`@WORKBENCH:有未保存的更改`)),1)],10,$n)):A(``,!0),ye(F(`select`,{class:`wb-select`,"onUpdate:modelValue":i[3]||=e=>k.value.promptId=e},[F(`option`,ir,z(D(G)(`@WORKBENCH:不绑定预置提示词`)),1),(I(!0),H(M,null,v(o.value,e=>(I(),H(`option`,{key:e.id,value:e.id},z(e.name),9,ar))),128))],512),[[he,k.value.promptId]]),re.value?A(``,!0):(I(),N(g,{key:1,type:`info`,plain:``,disabled:!k.value.title||!k.value.title.trim(),onClick:bt},{default:C(()=>[W(z(D(G)(`@WORKBENCH:AI 拆分`)),1)]),_:1},8,[`disabled`])),w(g,{type:`primary`,loading:!1,onClick:i[4]||=e=>St(k.value)},{default:C(()=>[W(z(re.value?D(G)(`@WORKBENCH:执行`):D(G)(`@WORKBENCH:执行任务`)),1)]),_:1})]),ye(F(`textarea`,{class:`wb-textarea`,"onUpdate:modelValue":i[5]||=e=>k.value.desc=e,placeholder:D(G)(`@WORKBENCH:任务描述(可选)`),rows:`3`,onPaste:i[6]||=e=>Ut(e,{kind:`task`,task:k.value})},null,40,or),[[_e,k.value.desc]]),w($e,{attachments:k.value.attachments||[],"is-image":Yt,"human-size":Xt,"is-uploading":It(`task-`+k.value.id),"is-paste-hover":$.value===`task-`+k.value.id,"max-count":9,"on-pick":()=>qt({kind:`task`,task:k.value}),"on-remove":e=>Kt({kind:`task`,task:k.value},e),onPaste:i[7]||=e=>Ut(e,{kind:`task`,task:k.value}),onDrop:i[8]||=B(e=>Wt(e,{kind:`task`,task:k.value}),[`prevent`]),onDragover:i[9]||=B(e=>$.value=`task-`+k.value.id,[`prevent`]),onDragenter:i[10]||=B(e=>$.value=`task-`+k.value.id,[`prevent`]),onDragleave:i[11]||=e=>$.value=$.value===`task-`+k.value.id?null:$.value},null,8,[`attachments`,`is-uploading`,`is-paste-hover`,`on-pick`,`on-remove`]),re.value?(I(),H(M,{key:1},[F(`div`,Pr,[F(`h4`,null,z(D(G)(`@WORKBENCH:简单任务`)),1),F(`span`,Fr,z(D(G)(`@WORKBENCH:无需拆分子任务;点执行后直接用上方描述驱动 Claude`)),1)]),F(`div`,Ir,[F(`span`,{class:`wb-simple__status`,style:m({background:Ie(Fe(Z(k.value)))}),title:D(G)(`@WORKBENCH:任务完成状态`)},[i[30]||=F(`span`,{class:`wb-simple__status-dot`,"aria-hidden":`true`},null,-1),F(`span`,Rr,z(Le(Fe(Z(k.value)))),1)],12,Lr),Z(k.value)?.endedAt&&Fe(Z(k.value))===`done`?(I(),H(`span`,zr,` · `+z(D(G)(`@WORKBENCH:完成时间`))+` `+z(Re(Z(k.value)?.endedAt)),1)):Z(k.value)?.error&&Fe(Z(k.value))===`error`?(I(),H(`span`,{key:1,class:`wb-simple__meta wb-simple__meta--error`,title:Z(k.value)?.error||``},` — `+z(Z(k.value)?.error),9,Br)):A(``,!0)]),F(`details`,{class:l([`wb-simple__override`,{"has-content":!!(k.value.simpleOverride&&k.value.simpleOverride.trim())}])},[F(`summary`,Vr,[w(u,{class:`wb-simple__override-caret`},{default:C(()=>[w(D(e))]),_:1}),F(`span`,null,z(D(G)(`@WORKBENCH:覆盖预置提示词(可选)`)),1),k.value.simpleOverride&&k.value.simpleOverride.trim()?(I(),H(`span`,{key:0,class:`wb-simple__override-tag`,title:D(G)(`@WORKBENCH:已填写覆盖内容`)},z(D(G)(`@WORKBENCH:已填写`)),9,Hr)):A(``,!0)]),ye(F(`textarea`,{class:`wb-textarea`,"onUpdate:modelValue":i[12]||=e=>k.value.simpleOverride=e,placeholder:D(G)(`@WORKBENCH:留空则使用上方选定的「预置提示词」模板;可用变量同子任务:{{task.title}} {{task.desc}} {{repo.path}} {{branch}}`),rows:`6`},null,8,Ur),[[_e,k.value.simpleOverride]])],2),X(`${k.value.id}__simple`)?(I(),N(Et,{key:0,job:X(`${k.value.id}__simple`)},null,8,[`job`])):A(``,!0)],64)):(I(),H(M,{key:0},[F(`div`,sr,[F(`h4`,null,z(D(G)(`@WORKBENCH:子任务拆分`)),1),F(`div`,cr,[w(g,{size:`small`,plain:``,icon:D(x),disabled:k.value.subtasks.length===0,onClick:ht},{default:C(()=>[W(z(D(G)(`@WORKBENCH:添加子任务`)),1)]),_:1},8,[`icon`,`disabled`]),w(g,{size:`small`,type:ge.value?`primary`:`default`,disabled:k.value.subtasks.length===0,onClick:vt},{default:C(()=>[W(z(D(G)(`@WORKBENCH:保存拆分`))+` `,1),ge.value?(I(),H(`span`,lr,z(de.value.size),1)):A(``,!0)]),_:1},8,[`type`,`disabled`])])]),F(`ul`,ur,[(I(!0),H(M,null,v(k.value.subtasks,e=>(I(),H(`li`,{key:e.id,class:l([`wb-sub-item`,{"is-dirty":de.value.has(e.id),"is-running":e.status===`running`,"is-done":e.status===`done`,"is-collapsed":At(e),"is-persisting":pt(e.id)}])},[At(e)?(I(),H(`div`,dr,[F(`span`,{class:`wb-sub-item__status`,style:m({background:D(Ot)(e.status)})},z(D(Dt)(e.status)),5),F(`span`,{class:`wb-sub-item__title-compact`,title:e.title},z(e.title||D(G)(`@WORKBENCH:未命名子任务`)),9,fr),X(e.id)?(I(),H(`span`,{key:0,class:`wb-sub-item__pid`,title:D(G)(`@WORKBENCH:进程ID`)},` PID: `+z(X(e.id)?.pid),9,pr)):A(``,!0),Tt(e)?(I(),H(`button`,{key:1,class:`wb-sub-item__run`,title:D(G)(`@WORKBENCH:单独执行此子任务`),"aria-label":D(G)(`@WORKBENCH:单独执行此子任务`),onClick:B(t=>wt(e),[`stop`])},z(D(G)(`@WORKBENCH:执行`)),9,mr)):A(``,!0),F(`button`,{class:`wb-sub-item__toggle`,title:D(G)(`@WORKBENCH:展开`),"aria-label":D(G)(`@WORKBENCH:展开`),onClick:B(t=>jt(e),[`stop`])},[w(u,null,{default:C(()=>[w(D(S))]),_:1})],8,hr),F(`button`,{class:`wb-sub-item__undo`,title:D(G)(`@WORKBENCH:取消完成`),"aria-label":D(G)(`@WORKBENCH:取消完成`),disabled:pt(e.id),onClick:B(t=>Mt(e),[`stop`])},z(D(G)(`@WORKBENCH:取消完成`)),9,gr),F(`button`,{class:`wb-sub-item__del`,title:D(G)(`@WORKBENCH:删除`),"aria-label":D(G)(`@WORKBENCH:删除`),disabled:pt(e.id),onClick:B(t=>gt(e),[`stop`])},`×`,8,_r)])):(I(),H(M,{key:1},[F(`div`,vr,[F(`span`,{class:`wb-sub-item__status`,style:m({background:D(Ot)(e.status)})},z(D(Dt)(e.status)),5),ye(F(`input`,{class:`wb-input`,"onUpdate:modelValue":t=>e.title=t,placeholder:D(G)(`@WORKBENCH:子任务标题`),onPaste:t=>Ut(t,{kind:`sub`,task:k.value,sub:e})},null,40,yr),[[_e,e.title]]),de.value.has(e.id)?(I(),H(`span`,{key:0,class:`wb-sub-item__dirty`,title:D(G)(`@WORKBENCH:有未保存的更改`)},z(D(G)(`@WORKBENCH:未保存`)),9,br)):A(``,!0),X(e.id)?(I(),H(`span`,{key:1,class:`wb-sub-item__pid`,title:D(G)(`@WORKBENCH:进程ID`)},` PID: `+z(X(e.id)?.pid),9,xr)):A(``,!0),Tt(e)?(I(),H(`button`,{key:2,class:`wb-sub-item__run`,title:D(G)(`@WORKBENCH:单独执行此子任务`),"aria-label":D(G)(`@WORKBENCH:单独执行此子任务`),onClick:t=>wt(e)},z(D(G)(`@WORKBENCH:执行`)),9,Sr)):A(``,!0),X(e.id)&&(X(e.id)?.status===`running`||X(e.id)?.status===`pending`)?(I(),H(`button`,{key:3,class:`wb-sub-item__stop`,title:D(G)(`@WORKBENCH:停止执行`),onClick:t=>Nt(X(e.id))},z(D(G)(`@WORKBENCH:停止`)),9,Cr)):A(``,!0),e.status===`done`?(I(),H(`button`,{key:4,class:`wb-sub-item__toggle`,title:D(G)(`@WORKBENCH:收起`),"aria-label":D(G)(`@WORKBENCH:收起`),onClick:t=>jt(e)},[w(u,null,{default:C(()=>[w(D(oe))]),_:1})],8,wr)):A(``,!0),e.status===`done`?(I(),H(`button`,{key:5,class:`wb-sub-item__undo`,title:D(G)(`@WORKBENCH:取消完成`),"aria-label":D(G)(`@WORKBENCH:取消完成`),disabled:pt(e.id),onClick:t=>Mt(e)},z(D(G)(`@WORKBENCH:取消完成`)),9,Tr)):A(``,!0),F(`button`,{class:`wb-sub-item__del`,title:D(G)(`@WORKBENCH:删除`),"aria-label":D(G)(`@WORKBENCH:删除`),disabled:pt(e.id),onClick:t=>gt(e)},`×`,8,Er)]),ye(F(`textarea`,{class:`wb-textarea wb-textarea--sm`,"onUpdate:modelValue":t=>e.desc=t,placeholder:D(G)(`@WORKBENCH:子任务描述 / 独立提示词覆盖`),rows:`2`,onPaste:t=>Ut(t,{kind:`sub`,task:k.value,sub:e})},null,40,Dr),[[_e,e.desc]]),X(e.id)?(I(),N(Et,{key:0,job:X(e.id)},null,8,[`job`])):A(``,!0),w($e,{attachments:e.attachments||[],"is-image":Yt,"human-size":Xt,"is-uploading":It(`sub-`+e.id),"is-paste-hover":$.value===e.id,"max-count":9,"on-pick":()=>qt({kind:`sub`,task:k.value,sub:e}),"on-remove":t=>Kt({kind:`sub`,task:k.value,sub:e},t),onPaste:t=>Ut(t,{kind:`sub`,task:k.value,sub:e}),onDrop:B(t=>Wt(t,{kind:`sub`,task:k.value,sub:e}),[`prevent`]),onDragover:B(t=>$.value=e.id,[`prevent`]),onDragenter:B(t=>$.value=e.id,[`prevent`]),onDragleave:t=>$.value=$.value===e.id?null:$.value},null,8,[`attachments`,`is-uploading`,`is-paste-hover`,`on-pick`,`on-remove`,`onPaste`,`onDrop`,`onDragover`,`onDragenter`,`onDragleave`])],64))],2))),128)),k.value.subtasks.length===0?(I(),H(`li`,Or,[F(`div`,kr,[w(u,null,{default:C(()=>[w(D(c))]),_:1})]),F(`div`,Ar,z(D(G)(`@WORKBENCH:拆分任务,逐项执行`)),1),F(`div`,jr,z(D(G)(`@WORKBENCH:手动添加子任务,或让 AI 帮你自动拆分`)),1),F(`div`,Mr,[w(g,{type:`primary`,size:`small`,icon:D(x),onClick:ht},{default:C(()=>[W(z(D(G)(`@WORKBENCH:添加子任务`)),1)]),_:1},8,[`icon`]),F(`button`,{type:`button`,class:`wb-empty__link`,disabled:!k.value.title||!k.value.title.trim(),onClick:bt},z(D(G)(`@WORKBENCH:用 AI 自动拆分`)),9,Nr)])])):A(``,!0)])],64))],64)):(I(),H(`div`,Xn,[F(`p`,null,z(D(G)(`@WORKBENCH:左侧选择任务,或新建一个任务开始`)),1)]))])])):(I(),N(an,{key:1})),w(j,{modelValue:K.visible,"onUpdate:modelValue":i[16]||=e=>K.visible=e,title:K.editing?D(G)(`@WORKBENCH:编辑提示词`):D(G)(`@WORKBENCH:新建提示词`),width:`640px`},{footer:C(()=>[w(g,{onClick:i[15]||=e=>K.visible=!1},{default:C(()=>[W(z(D(G)(`@WORKBENCH:取消`)),1)]),_:1}),w(g,{type:`primary`,onClick:ot},{default:C(()=>[W(z(D(G)(`@WORKBENCH:保存`)),1)]),_:1})]),default:C(()=>[w(E,{"label-position":`top`},{default:C(()=>[w(b,{label:D(G)(`@WORKBENCH:名称`)},{default:C(()=>[w(y,{modelValue:K.name,"onUpdate:modelValue":i[13]||=e=>K.name=e,placeholder:D(G)(`@WORKBENCH:如:代码审查 / 写测试`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`]),w(b,null,{default:C(()=>[F(`div`,Wr,[w(g,{type:`primary`,plain:``,loading:K.aiLoading,onClick:rt},{default:C(()=>[W(z(D(G)(`@WORKBENCH:AI 生成项目架构说明`)),1)]),_:1},8,[`loading`]),w(g,{onClick:it},{default:C(()=>[W(z(D(G)(`@WORKBENCH:编辑指令`)),1)]),_:1})])]),_:1}),w(b,{label:D(G)(`@WORKBENCH:内容`)},{default:C(()=>[w(y,{modelValue:K.content,"onUpdate:modelValue":i[14]||=e=>K.content=e,type:`textarea`,rows:10,placeholder:D(G)(`@WORKBENCH:可用变量:`)+`{{task.title}} {{task.desc}} {{sub.title}} {{sub.desc}} {{repo.path}} {{branch}}`},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])]),_:1})]),_:1},8,[`modelValue`,`title`]),w(j,{modelValue:q.visible,"onUpdate:modelValue":i[19]||=e=>q.visible=e,title:D(G)(`@WORKBENCH:编辑生成指令`),width:`720px`,"append-to-body":``},{footer:C(()=>[w(g,{onClick:i[18]||=e=>q.visible=!1},{default:C(()=>[W(z(D(G)(`@WORKBENCH:取消`)),1)]),_:1}),w(g,{type:`primary`,loading:q.saving,onClick:at},{default:C(()=>[W(z(D(G)(`@WORKBENCH:保存`)),1)]),_:1},8,[`loading`])]),default:C(()=>[w(E,{"label-position":`top`},{default:C(()=>[w(b,{label:D(G)(`@WORKBENCH:指令内容`)},{default:C(()=>[w(y,{modelValue:q.text,"onUpdate:modelValue":i[17]||=e=>q.text=e,type:`textarea`,rows:18,placeholder:D(G)(`@WORKBENCH:指令内容`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])]),_:1})]),_:1},8,[`modelValue`,`title`]),w(j,{modelValue:J.visible,"onUpdate:modelValue":i[27]||=e=>J.visible=e,title:J.editing?D(G)(`@WORKBENCH:编辑任务`):D(G)(`@WORKBENCH:新建任务`),width:`600px`},{footer:C(()=>[w(g,{onClick:i[26]||=e=>J.visible=!1},{default:C(()=>[W(z(D(G)(`@WORKBENCH:取消`)),1)]),_:1}),w(g,{type:`primary`,onClick:lt},{default:C(()=>[W(z(D(G)(`@WORKBENCH:保存`)),1)]),_:1})]),default:C(()=>[w(E,{"label-position":`top`},{default:C(()=>[w(b,{label:D(G)(`@WORKBENCH:标题`)},{default:C(()=>[w(y,{modelValue:J.title,"onUpdate:modelValue":i[20]||=e=>J.title=e},null,8,[`modelValue`])]),_:1},8,[`label`]),w(b,{label:D(G)(`@WORKBENCH:类型`)},{default:C(()=>[w(P,{modelValue:J.type,"onUpdate:modelValue":i[21]||=e=>J.type=e},{default:C(()=>[w(ae,{value:`complex`},{default:C(()=>[W(z(D(G)(`@WORKBENCH:复杂任务(需要拆分子任务)`)),1)]),_:1}),w(ae,{value:`simple`},{default:C(()=>[W(z(D(G)(`@WORKBENCH:简单任务(直接执行)`)),1)]),_:1})]),_:1},8,[`modelValue`])]),_:1},8,[`label`]),J.type===`simple`?(I(),N(b,{key:0,label:D(G)(`@WORKBENCH:描述`)},{default:C(()=>[w(y,{modelValue:J.desc,"onUpdate:modelValue":i[22]||=e=>J.desc=e,type:`textarea`,rows:4,placeholder:D(G)(`@WORKBENCH:把要做的事直接写在这里,执行时会把这段描述作为 prompt 喂给 Claude`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])):(I(),N(b,{key:1,label:D(G)(`@WORKBENCH:描述`)},{default:C(()=>[w(y,{modelValue:J.desc,"onUpdate:modelValue":i[23]||=e=>J.desc=e,type:`textarea`,rows:3},null,8,[`modelValue`])]),_:1},8,[`label`])),J.type===`simple`?(I(),N(b,{key:2,label:D(G)(`@WORKBENCH:覆盖预置提示词(可选)`)},{default:C(()=>[w(y,{modelValue:J.simpleOverride,"onUpdate:modelValue":i[24]||=e=>J.simpleOverride=e,type:`textarea`,rows:5,placeholder:D(G)(`@WORKBENCH:留空则使用「预置提示词」下拉里选定的模板;可用变量同子任务覆盖。`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])):A(``,!0),w(b,{label:D(G)(`@WORKBENCH:预置提示词`)},{default:C(()=>[w(ue,{modelValue:J.promptId,"onUpdate:modelValue":i[25]||=e=>J.promptId=e,clearable:``,placeholder:D(G)(`@WORKBENCH:不绑定`),style:{width:`100%`}},{default:C(()=>[(I(!0),H(M,null,v(o.value,e=>(I(),N(ce,{key:e.id,label:e.name,value:e.id},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])]),_:1})]),_:1},8,[`modelValue`,`title`]),k.value?(I(),N(Be,{key:2,modelValue:yt.value,"onUpdate:modelValue":i[28]||=e=>yt.value=e,title:k.value.title,desc:k.value.desc,"task-id":k.value.id,"prompt-id":k.value.promptId,onConfirm:xt},null,8,[`modelValue`,`title`,`desc`,`task-id`,`prompt-id`])):A(``,!0)])}}}),[[`__scopeId`,`data-v-9bb08432`]]);export{Yr as default};
|