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.
Files changed (34) hide show
  1. package/README.md +2 -2
  2. package/package.json +1 -1
  3. package/scripts/README_COLOR_CONVERTER.md +196 -196
  4. package/scripts/README_FONTSIZE_CONVERTER.md +278 -278
  5. package/scripts/README_SPACING_CONVERTER.md +126 -126
  6. package/scripts/README_STYLE_VARS.md +180 -180
  7. package/scripts/verify-subtask-row.mjs +284 -0
  8. package/src/ui/public/assets/EditorView-B4g8XOLB.js +0 -0
  9. package/src/ui/public/assets/{EditorView-Dvg7sMyU.css → EditorView-noBxnUk5.css} +1 -1
  10. package/src/ui/public/assets/SourceMapView-BVfD3VYO.js +3 -0
  11. package/src/ui/public/assets/WorkbenchView-Cx2p-WGc.js +6 -0
  12. package/src/ui/public/assets/WorkbenchView-_Z4j_RIa.css +1 -0
  13. package/src/ui/public/assets/{_plugin-vue_export-helper-rFkdzaHd.js → _plugin-vue_export-helper-rin5I4Hu.js} +3 -3
  14. package/src/ui/public/assets/{css.worker-Wv5dxAWO.js → css.worker-CvXBzhp8.js} +1 -1
  15. package/src/ui/public/assets/{html.worker-CQP8QQsS.js → html.worker-BO6WuOEO.js} +1 -1
  16. package/src/ui/public/assets/index-8cDK0aD_.js +66 -0
  17. package/src/ui/public/assets/index-CmMxt1ti.css +1 -0
  18. package/src/ui/public/assets/{json.worker-DzV-CpCQ.js → json.worker-BkJRGcCJ.js} +1 -1
  19. package/src/ui/public/assets/{ts.worker-Dth06zuC.js → ts.worker-B0J26iPs.js} +15 -15
  20. package/src/ui/public/assets/vendor-Bq2rS2vY.css +1 -0
  21. package/src/ui/public/assets/{vendor-CDAfMQIV.js → vendor-C30huq-U.js} +247 -240
  22. package/src/ui/public/favicon.svg +75 -75
  23. package/src/ui/public/index.html +23 -23
  24. package/src/ui/public/logo.svg +74 -74
  25. package/src/ui/server/routes/workbench.js +4 -3
  26. package/src/ui/public/assets/EditorView-CSUfBR5z.js +0 -0
  27. package/src/ui/public/assets/SourceMapView-CPsyB1rP.js +0 -3
  28. package/src/ui/public/assets/WorkbenchView-BBDJOY3C.js +0 -6
  29. package/src/ui/public/assets/WorkbenchView-CA91BJc8.css +0 -1
  30. package/src/ui/public/assets/index-CLVL3Inb.js +0 -66
  31. package/src/ui/public/assets/index-ChSExFC3.css +0 -1
  32. package/src/ui/public/assets/vendor-CIeR0bF6.css +0 -1
  33. /package/src/ui/public/assets/{editor.worker-Bd9IXS8d.js → editor.worker-Cn2oRESe.js} +0 -0
  34. /package/src/ui/public/assets/{rolldown-runtime-BM3Ffeng.js → rolldown-runtime-CMxvf4Kt.js} +0 -0
@@ -0,0 +1,284 @@
1
+ // scripts/verify-subtask-row.mjs
2
+ import { chromium } from 'playwright'
3
+
4
+ const URL = 'http://localhost:5544/'
5
+ const SCREENSHOT_DIR = 'C:\\Users\\xuze3\\.zen-gitsync\\workbench-images\\_task-mqetoc9k-qc2va6'
6
+ const consoleErrors = []
7
+ const pageErrors = []
8
+ const log = (...a) => console.log('[verify]', ...a)
9
+ async function snapshot(page, name) {
10
+ const path = `${SCREENSHOT_DIR}\\verify-${name}.png`
11
+ try { await page.screenshot({ path, fullPage: false }); log('📸', name) } catch {}
12
+ }
13
+
14
+ // 先注入充足 done 子任务,避免被前面删除/取消用完
15
+ async function ensureTestData() {
16
+ const r = await fetch('http://localhost:5544/api/workbench/tasks')
17
+ const text = await r.text()
18
+ const existing = text ? JSON.parse(text) : {}
19
+ let target = existing.tasks?.find(t => t.title?.includes('verify-task'))
20
+ if (!target) {
21
+ const body = {
22
+ title: '【验证】子任务行交互测试 verify-task',
23
+ type: 'complex',
24
+ subtasks: [
25
+ { id: 'v-done-1', title: '已完成A:默认折叠(用于点行展开)', status: 'done' },
26
+ { id: 'v-done-2', title: '已完成B:用于取消完成按钮冒泡测试', status: 'done' },
27
+ { id: 'v-done-3', title: '已完成C:用于键盘 Enter/Space 测试', status: 'done' }
28
+ ]
29
+ }
30
+ const r = await fetch('http://localhost:5544/api/workbench/tasks', {
31
+ method: 'POST',
32
+ headers: { 'content-type': 'application/json' },
33
+ body: JSON.stringify(body)
34
+ })
35
+ const text = await r.text()
36
+ const j = text ? JSON.parse(text) : {}
37
+ target = j.task
38
+ }
39
+ return target
40
+ }
41
+
42
+ async function main() {
43
+ const target = await ensureTestData()
44
+ log('使用任务:', target?.title, target?.id)
45
+
46
+ const browser = await chromium.launch({ headless: true })
47
+ const ctx = await browser.newContext({ viewport: { width: 1440, height: 900 } })
48
+ const page = await ctx.newPage()
49
+ page.on('console', (msg) => {
50
+ const t = msg.type()
51
+ if (t === 'error' || t === 'warning') consoleErrors.push(`[${t}] ${msg.text()}`)
52
+ })
53
+ page.on('pageerror', (e) => pageErrors.push(String(e)))
54
+
55
+ await page.goto(URL, { waitUntil: 'domcontentloaded' })
56
+ await page.waitForSelector('.activity-bar', { timeout: 20000 })
57
+ await page.locator('.activity-btn').nth(3).click()
58
+ await page.waitForSelector('.workbench-pane', { timeout: 10000 })
59
+ await page.waitForTimeout(3000)
60
+
61
+ // 先展开所有项目分组(含 "未关联项目" / "其他项目"),再点 verify-task
62
+ await page.evaluate(() => {
63
+ document.querySelectorAll('.wb-group-header').forEach(h => {
64
+ if (h.textContent?.includes('收起')) h.click()
65
+ })
66
+ })
67
+ await page.waitForTimeout(500)
68
+
69
+ const clicked = await page.evaluate((title) => {
70
+ const items = Array.from(document.querySelectorAll('.wb-task-item'))
71
+ const target = items.find(el => el.textContent?.includes(title))
72
+ if (target) { target.click(); return true }
73
+ return false
74
+ }, 'verify-task')
75
+ log('侧栏点击 verify-task:', clicked)
76
+ await page.waitForTimeout(1500)
77
+ await snapshot(page, '01-loaded')
78
+
79
+ // 兜底:如果侧栏没有 verify-task(例如其他项目分组未展开),强制把后端任务的
80
+ // projectPath 改成当前项目再刷新——但这会改用户数据,跳过。
81
+ // 我们改为:直接选第一个 subtaskCount>0 的 task
82
+ if ((await page.locator('.wb-sub-item').count()) === 0) {
83
+ log('verify-task 未选中,fallback 到第一个有子任务的任务')
84
+ await page.evaluate(() => {
85
+ const items = Array.from(document.querySelectorAll('.wb-task-item'))
86
+ const withSub = items.find(el => el.textContent?.match(/\d+\/\d+/))
87
+ if (withSub) withSub.click()
88
+ })
89
+ await page.waitForTimeout(1000)
90
+ }
91
+
92
+ const total = await page.locator('.wb-sub-item').count()
93
+ const collapsed = await page.locator('.wb-sub-item.is-collapsed').count()
94
+ log('子任务总数:', total, '折叠态:', collapsed)
95
+ if (collapsed === 0) { log('❌ 无折叠行'); await browser.close(); return }
96
+
97
+ // ── (1) 悬停高亮 ──────────────────────────────────────
98
+ const firstCollapsed = page.locator('.wb-sub-item.is-collapsed').first()
99
+ const firstRow = firstCollapsed.locator('.wb-sub-item__row--compact')
100
+ await firstRow.scrollIntoViewIfNeeded()
101
+ await page.waitForTimeout(200)
102
+ const baseBg = await firstRow.evaluate(el => getComputedStyle(el).backgroundColor)
103
+ await firstRow.hover()
104
+ await page.waitForTimeout(300)
105
+ const hoverBg = await firstRow.evaluate(el => getComputedStyle(el).backgroundColor)
106
+ log('base 背景:', baseBg, '→ hover 背景:', hoverBg)
107
+ if (baseBg !== hoverBg) log('✅ 悬停态背景色变化 OK')
108
+ else log('⚠️ 悬停前后背景一致')
109
+ await snapshot(page, '02-hover')
110
+
111
+ // ── (2) 点击行展开 ───────────────────────────────────
112
+ // 记录当前第一个 collapsed 行的索引
113
+ const idxBefore = await page.evaluate(() => {
114
+ const items = Array.from(document.querySelectorAll('.wb-sub-item'))
115
+ return items.findIndex(el => el.classList.contains('is-collapsed'))
116
+ })
117
+ log('第一个折叠行 index:', idxBefore)
118
+ // 点击 title 区域触发整行 click(不点按钮)
119
+ await page.locator('.wb-sub-item.is-collapsed .wb-sub-item__title-compact').first().click()
120
+ await page.waitForTimeout(500)
121
+ const idxAfter = await page.evaluate(() => {
122
+ const items = Array.from(document.querySelectorAll('.wb-sub-item'))
123
+ return items.findIndex(el => el.classList.contains('is-collapsed'))
124
+ })
125
+ log('点击后第一个折叠行 index:', idxAfter)
126
+ const expandedCount = await page.locator('.wb-sub-item:not(.is-collapsed)').count()
127
+ if (idxAfter !== idxBefore && expandedCount > 0) log('✅ 点击行展开 OK')
128
+ else log('❌ 点击行未展开')
129
+ await snapshot(page, '03-row-expanded')
130
+
131
+ // ── (3) 取消完成按钮无冒泡 ───────────────────────────
132
+ // 关键验证:点按钮后,行的 click handler 不应被触发(@click.stop)。
133
+ // 用 BUBBLE phase 监听 row 的 click(capture phase 永远会触发,与 .stop 无关)。
134
+ // 同时拦截 fetch 让 PUT 成功,避免后端 500 影响判断。
135
+ const undoResult = await page.evaluate(async () => {
136
+ const item = document.querySelector('.wb-sub-item.is-collapsed')
137
+ if (!item) return { found: false }
138
+ const row = item.querySelector('.wb-sub-item__row--compact')
139
+ if (!row) return { found: false }
140
+ let rowClicked = 0
141
+ // bubble phase,.stop 会阻止冒泡到这里
142
+ row.addEventListener('click', () => rowClicked++, false)
143
+ // mock fetch 让 cancelDone 不会因为测试数据问题失败
144
+ const realFetch = window.fetch
145
+ window.fetch = (url, opts) => {
146
+ const s = String(url)
147
+ // 拦截对 /api/workbench/tasks 的写操作
148
+ if (s.includes('/api/workbench/tasks') && (opts?.method === 'POST' || opts?.method === 'PUT')) {
149
+ return Promise.resolve(new Response(JSON.stringify({ success: true, task: { subtasks: [] } }), { status: 200, headers: { 'content-type': 'application/json' } }))
150
+ }
151
+ return realFetch(url, opts)
152
+ }
153
+ const undoBtn = item.querySelector('.wb-sub-item__undo')
154
+ if (!undoBtn) return { found: false }
155
+ const beforeCollapsed = item.classList.contains('is-collapsed')
156
+ undoBtn.click()
157
+ await new Promise(r => setTimeout(r, 700))
158
+ window.fetch = realFetch
159
+ const afterCollapsed = item.classList.contains('is-collapsed')
160
+ return { found: true, rowClicked, beforeCollapsed, afterCollapsed }
161
+ })
162
+ log('「取消完成」→ row bubble click 触发次数:', undoResult.rowClicked, 'isCollapsed:', undoResult.beforeCollapsed, '→', undoResult.afterCollapsed)
163
+ if (undoResult.rowClicked === 0) log('✅ 取消完成按钮:行 click handler 未触发(@click.stop 生效)')
164
+ else log('❌ 取消完成按钮:行 click handler 被触发 ' + undoResult.rowClicked + ' 次')
165
+ await snapshot(page, '04-after-undo')
166
+
167
+ // ── (4) × 删除按钮无冒泡 ─────────────────────────────
168
+ const delResult = await page.evaluate(async () => {
169
+ const items = Array.from(document.querySelectorAll('.wb-sub-item'))
170
+ if (!items.length) return { found: false }
171
+ const item = items[items.length - 1] // 删最后一个,避开折叠测试行
172
+ let flips = 0
173
+ const rowEl = item.querySelector('.wb-sub-item__row--compact') || item.querySelector('.wb-sub-item__row')
174
+ const obs = new MutationObserver(muts => {
175
+ for (const m of muts) {
176
+ if (m.type === 'attributes' && m.attributeName === 'class') flips++
177
+ }
178
+ })
179
+ obs.observe(item, { attributes: true })
180
+ if (rowEl) obs.observe(rowEl, { attributes: true })
181
+ const realFetch = window.fetch
182
+ window.fetch = (url, opts) => {
183
+ if (String(url).includes('/api/workbench/subtasks') && opts?.method === 'DELETE') {
184
+ return Promise.resolve(new Response('{"success":true}', { status: 200 }))
185
+ }
186
+ return realFetch(url, opts)
187
+ }
188
+ const delBtn = item.querySelector('.wb-sub-item__del')
189
+ if (!delBtn) return { found: false }
190
+ const before = document.querySelectorAll('.wb-sub-item').length
191
+ delBtn.click()
192
+ await new Promise(r => setTimeout(r, 600))
193
+ window.fetch = realFetch
194
+ const after = document.querySelectorAll('.wb-sub-item').length
195
+ obs.disconnect()
196
+ return { found: true, flips, before, after }
197
+ })
198
+ log('× 按钮 → class 翻转:', delResult.flips, '行数:', delResult.before, '→', delResult.after)
199
+ if (delResult.found && delResult.after === delResult.before - 1) log('✅ × 删除按钮:行被删除,无冒泡副作用')
200
+ await snapshot(page, '05-after-del')
201
+
202
+ // ── (5) 键盘 Tab + Enter / Space ─────────────────────
203
+ // 通过标题定位 sub,避开 Vue 重渲染时 activeElement 丢失问题
204
+ const kbdRow = page.locator('.wb-sub-item.is-collapsed .wb-sub-item__row--compact').first()
205
+ if (await kbdRow.count()) {
206
+ const titleBefore = (await kbdRow.locator('.wb-sub-item__title-compact').first().textContent())?.trim()
207
+ log('键盘测试目标标题:', titleBefore?.slice(0, 30))
208
+ await kbdRow.focus()
209
+ await page.waitForTimeout(200)
210
+ const focused = await page.evaluate(() => document.activeElement?.classList?.contains('wb-sub-item__row--compact'))
211
+ log('行获得焦点:', focused)
212
+ await snapshot(page, '06-focused')
213
+
214
+ await page.keyboard.press('Enter')
215
+ await page.waitForTimeout(500)
216
+ const afterEnter = await page.evaluate((title) => {
217
+ const items = Array.from(document.querySelectorAll('.wb-sub-item'))
218
+ const t = (title || '').trim()
219
+ for (const it of items) {
220
+ const compact = it.querySelector('.wb-sub-item__title-compact')
221
+ const input = it.querySelector('input.wb-input')
222
+ const text = (compact?.textContent || input?.value || '').trim()
223
+ if (text === t) return it.classList.contains('is-collapsed')
224
+ }
225
+ return null
226
+ }, titleBefore)
227
+ log('Enter 后该 sub isCollapsed:', afterEnter)
228
+ if (afterEnter === false) log('✅ 键盘 Enter 触发展开 OK')
229
+ else log('❌ 键盘 Enter 未触发展开')
230
+
231
+ // Space 折叠回去(同样按标题定位)
232
+ if (afterEnter === false) {
233
+ // 找标题匹配的那条展开行的 input,定位其所在 wb-sub-item__row
234
+ const handle = await page.evaluateHandle((title) => {
235
+ const t = (title || '').trim()
236
+ const items = Array.from(document.querySelectorAll('.wb-sub-item:not(.is-collapsed)'))
237
+ for (const it of items) {
238
+ const input = it.querySelector('input.wb-input')
239
+ if ((input?.value || '').trim() === t) return it.querySelector('.wb-sub-item__row')
240
+ }
241
+ return null
242
+ }, titleBefore)
243
+ if (handle) {
244
+ const el = handle.asElement()
245
+ if (el) {
246
+ await el.focus()
247
+ await page.waitForTimeout(200)
248
+ await page.keyboard.press(' ')
249
+ await page.waitForTimeout(500)
250
+ const afterSpace = await page.evaluate((title) => {
251
+ const items = Array.from(document.querySelectorAll('.wb-sub-item'))
252
+ const t = (title || '').trim()
253
+ for (const it of items) {
254
+ const compact = it.querySelector('.wb-sub-item__title-compact')
255
+ const input = it.querySelector('input.wb-input')
256
+ const text = (compact?.textContent || input?.value || '').trim()
257
+ if (text === t) return it.classList.contains('is-collapsed')
258
+ }
259
+ return null
260
+ }, titleBefore)
261
+ log('Space 后该 sub isCollapsed:', afterSpace)
262
+ if (afterSpace === true) log('✅ 键盘 Space 触发折叠 OK')
263
+ else log('❌ 键盘 Space 未触发折叠')
264
+ }
265
+ } else {
266
+ log('⚠️ 找不到展开后的行进行 Space 测试')
267
+ }
268
+ }
269
+ await snapshot(page, '07-after-keyboard')
270
+ } else {
271
+ log('ℹ️ 无可测折叠行,跳过键盘测试')
272
+ }
273
+
274
+ log('\n=== 验证总结 ===')
275
+ log('Console errors/warnings:', consoleErrors.length)
276
+ consoleErrors.forEach(e => log(' ·', e))
277
+ log('Page errors:', pageErrors.length)
278
+ pageErrors.forEach(e => log(' ·', e))
279
+
280
+ await browser.close()
281
+ log('done.')
282
+ }
283
+
284
+ main().catch(e => { console.error('FATAL:', e); process.exit(1) })
@@ -1 +1 @@
1
- .md-preview[data-v-d602e5a5]{color:inherit;word-break:break-word;padding:20px 24px;font-size:14px;line-height:1.6}.md-preview[data-v-d602e5a5] h1,.md-preview[data-v-d602e5a5] h2,.md-preview[data-v-d602e5a5] h3,.md-preview[data-v-d602e5a5] h4,.md-preview[data-v-d602e5a5] h5,.md-preview[data-v-d602e5a5] h6{border-bottom:1px solid var(--border-color,#d0d7de);margin-top:24px;margin-bottom:16px;padding-bottom:.3em;font-weight:600}.md-preview[data-v-d602e5a5] h1{font-size:1.8em}.md-preview[data-v-d602e5a5] h2{font-size:1.4em}.md-preview[data-v-d602e5a5] h3{font-size:1.2em}.md-preview[data-v-d602e5a5] p{margin:0 0 14px}.md-preview[data-v-d602e5a5] a{color:var(--link-color,#0969da);text-decoration:none}.md-preview[data-v-d602e5a5] a:hover{text-decoration:underline}.md-preview[data-v-d602e5a5] code{background:var(--code-bg,#f6f8fa);border-radius:4px;padding:2px 5px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:87%}.md-preview[data-v-d602e5a5] pre{background:var(--code-bg,#f6f8fa);border-radius:6px;margin:0 0 16px;padding:14px 16px;overflow:auto}.md-preview[data-v-d602e5a5] pre code{background:0 0;padding:0;font-size:100%}.md-preview[data-v-d602e5a5] blockquote{border-left:3px solid var(--border-color,#d0d7de);color:var(--text-secondary,#656d76);margin:0 0 16px;padding:0 16px}.md-preview[data-v-d602e5a5] img{border-radius:4px;max-width:100%}.md-preview[data-v-d602e5a5] hr{border:none;border-top:1px solid var(--border-color,#d0d7de);margin:24px 0}.md-preview[data-v-d602e5a5] table{border-collapse:collapse;width:100%;margin-bottom:16px}.md-preview[data-v-d602e5a5] th,.md-preview[data-v-d602e5a5] td{border:1px solid var(--border-color,#d0d7de);padding:6px 13px}.md-preview[data-v-d602e5a5] thead tr{background:var(--code-bg,#f6f8fa)}.md-preview[data-v-d602e5a5] ul,.md-preview[data-v-d602e5a5] ol{margin-bottom:16px;padding-left:2em}.md-preview[data-v-d602e5a5] li{margin:4px 0}.md-segment[data-v-d602e5a5]{display:block}.md-mindmap[data-v-d602e5a5]{border:1px solid var(--border-color,#d0d7de);background:var(--bg-panel,#fff);border-radius:8px;margin:18px 0 28px;overflow:hidden}.md-mindmap-title[data-v-d602e5a5]{color:var(--text-secondary,#656d76);background:var(--code-bg,#f6f8fa);border-bottom:1px solid var(--border-color,#d0d7de);letter-spacing:.5px;padding:8px 12px;font-size:12px;font-weight:600}.md-mindmap-canvas[data-v-d602e5a5]{width:100%;height:480px;display:block}.mindmap-preview[data-v-5988cf1a]{background:var(--bg-container,#fff);flex-direction:column;width:100%;height:100%;display:flex}.mindmap-preview-header[data-v-5988cf1a]{border-bottom:1px solid var(--border-color,#d0d7de);background:var(--bg-panel,#f6f8fa);align-items:center;gap:12px;padding:8px 14px;font-size:12px;display:flex}.mindmap-preview-title[data-v-5988cf1a]{color:var(--text-primary,#1f2328);letter-spacing:.5px;font-weight:600}.mindmap-preview-hint[data-v-5988cf1a]{color:var(--text-secondary,#656d76);font-size:11px}.mindmap-preview-canvas[data-v-5988cf1a]{flex:1;width:100%;min-height:0}.mindmap-preview-canvas[data-v-5988cf1a] .zm-mindmap,.mindmap-preview-canvas[data-v-5988cf1a]>*{width:100%;height:100%}.editor-view[data-v-212f0a2a]{background:var(--bg-container);border:1px solid var(--border-color);width:100%;height:100%;box-shadow:var(--shadow-sm);border-radius:0;display:flex;overflow:hidden}.editor-sidebar[data-v-212f0a2a]{border-right:1px solid var(--border-color);background:var(--bg-panel);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.sidebar-header[data-v-212f0a2a]{border-bottom:1px solid var(--border-color);flex-shrink:0;justify-content:space-between;align-items:center;padding:8px 10px 6px;display:flex}.sidebar-title[data-v-212f0a2a]{letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);-webkit-user-select:none;user-select:none;font-size:11px;font-weight:700}.sidebar-action-btn[data-v-212f0a2a]{cursor:pointer;color:var(--text-tertiary);border-radius:var(--radius-base);background:0 0;border:none;align-items:center;padding:3px;display:flex}.sidebar-action-btn[data-v-212f0a2a]:hover{color:var(--text-primary);background:var(--bg-hover)}.sidebar-search[data-v-212f0a2a]{border-bottom:1px solid var(--border-color);flex-shrink:0;align-items:center;padding:6px 10px;display:flex;position:relative}.sidebar-search-icon[data-v-212f0a2a]{color:var(--text-tertiary);pointer-events:none;position:absolute;left:18px}.sidebar-search-input[data-v-212f0a2a]{min-width:0;height:26px;color:var(--text-primary);background:var(--bg-input,#ffffff0a);border:1px solid var(--border-color);border-radius:var(--radius-base);outline:none;flex:1;padding:0 24px 0 26px;font-size:12px;transition:border-color .12s,background .12s}.sidebar-search-input[data-v-212f0a2a]::placeholder{color:var(--text-tertiary)}.sidebar-search-input[data-v-212f0a2a]:hover{border-color:var(--text-tertiary)}.sidebar-search-input[data-v-212f0a2a]:focus{border-color:var(--accent-color,#3b82f6);background:var(--bg-panel)}.sidebar-search-clear[data-v-212f0a2a]{cursor:pointer;width:18px;height:18px;color:var(--text-tertiary);background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;transition:background .12s,color .12s;display:flex;position:absolute;right:14px}.sidebar-search-clear[data-v-212f0a2a]:hover{background:var(--bg-hover);color:var(--text-primary)}.tree-name-hit[data-v-212f0a2a]{color:var(--accent-color,#f59e0b);background:#f59e0b26;border-radius:2px;padding:0 1px}.sidebar-tree[data-v-212f0a2a]{flex:1;padding:4px 0;overflow:hidden auto}.tree-node[data-v-212f0a2a]{cursor:pointer;-webkit-user-select:none;user-select:none;height:24px;color:var(--text-primary);white-space:nowrap;border-radius:4px;align-items:center;gap:4px;padding-right:8px;font-size:13px;transition:background .1s;display:flex;overflow:hidden}.tree-node[data-v-212f0a2a]:hover{background:var(--bg-hover)}.tree-node--active[data-v-212f0a2a]{color:var(--color-primary);background:#3b82f61f}.tree-node--selected[data-v-212f0a2a]{outline-offset:-1px;background:#63b3ed26;outline:1px solid #63b3ed59}.tree-arrow[data-v-212f0a2a]{color:var(--text-tertiary);flex-shrink:0;align-items:center;width:12px;transition:transform .15s;display:flex}.tree-arrow.expanded[data-v-212f0a2a]{transform:rotate(90deg)}.tree-arrow-spacer[data-v-212f0a2a]{flex-shrink:0;width:12px}.tree-icon[data-v-212f0a2a]{flex-shrink:0;align-items:center;font-size:14px;line-height:1;display:flex}.tree-icon.mit-icon[data-v-212f0a2a]{fill:currentColor;vertical-align:middle;width:14px;height:14px;display:inline-block}.tree-icon--dir[data-v-212f0a2a]{color:#e8b84b}.tree-name[data-v-212f0a2a]{text-overflow:ellipsis;flex:1;min-width:0;font-size:13px;overflow:hidden}.tree-loading[data-v-212f0a2a]{border:1.5px solid var(--color-primary);border-top-color:#0000;border-radius:50%;flex-shrink:0;width:10px;height:10px;animation:.8s linear infinite spin-212f0a2a;display:inline-block}.tree-empty[data-v-212f0a2a]{color:var(--text-tertiary);text-align:center;padding:24px 12px;font-size:12px}.sidebar-loading[data-v-212f0a2a]{flex:1;justify-content:center;align-items:center;display:flex}.spin-icon[data-v-212f0a2a]{border:2px solid var(--color-primary);border-top-color:#0000;border-radius:50%;width:20px;height:20px;animation:.8s linear infinite spin-212f0a2a;display:inline-block}@keyframes spin-212f0a2a{to{transform:rotate(360deg)}}.editor-resizer[data-v-212f0a2a]{cursor:col-resize;z-index:2;background:0 0;flex-shrink:0;width:6px;transition:background .15s;position:relative}.editor-resizer[data-v-212f0a2a]:after{content:"";background:var(--color-gray-300);border-radius:2px;width:2px;height:32px;transition:background .15s,height .15s;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.editor-resizer[data-v-212f0a2a]:hover{background:#3b82f60f}.editor-resizer[data-v-212f0a2a]:hover:after{background:var(--color-primary);height:48px;box-shadow:0 0 8px #3b82f666}.editor-main[data-v-212f0a2a]{flex-direction:column;flex:1;display:flex;overflow:hidden}.editor-tabs[data-v-212f0a2a]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);scrollbar-width:none;flex-shrink:0;display:flex;overflow:auto hidden}.editor-tabs[data-v-212f0a2a]::-webkit-scrollbar{display:none}.editor-tab[data-v-212f0a2a]{border-right:1px solid var(--border-color);cursor:pointer;height:34px;color:var(--text-secondary);-webkit-user-select:none;user-select:none;flex-shrink:0;align-items:center;gap:6px;min-width:80px;max-width:200px;padding:0 12px;font-size:12.5px;transition:background .1s,color .1s;display:flex}.editor-tab[data-v-212f0a2a]:hover{background:var(--bg-hover);color:var(--text-primary)}.editor-tab.active[data-v-212f0a2a]{background:var(--bg-container);color:var(--text-primary);border-bottom:2px solid var(--color-primary)}.tab-name[data-v-212f0a2a]{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.tab-dirty-dot[data-v-212f0a2a]{background:var(--color-warning);border-radius:50%;flex-shrink:0;width:6px;height:6px}.tab-close[data-v-212f0a2a]{cursor:pointer;color:var(--text-tertiary);opacity:0;background:0 0;border:none;border-radius:3px;flex-shrink:0;align-items:center;padding:2px;transition:opacity .1s,background .1s;display:flex}.editor-tab:hover .tab-close[data-v-212f0a2a],.editor-tab.active .tab-close[data-v-212f0a2a]{opacity:1}.tab-close[data-v-212f0a2a]:hover{background:var(--bg-hover);color:var(--color-danger)}.editor-empty[data-v-212f0a2a]{color:var(--text-tertiary);-webkit-user-select:none;user-select:none;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:10px;font-size:13px;display:flex}.editor-empty p[data-v-212f0a2a]{margin:0}.editor-empty-hint[data-v-212f0a2a]{opacity:.6;font-size:11px}.monaco-container[data-v-212f0a2a]{flex:1;min-width:0;overflow:hidden}.monaco-container.hidden[data-v-212f0a2a]{display:none}.image-tab-placeholder[data-v-212f0a2a]{justify-content:center;align-items:center;gap:var(--spacing-sm);color:var(--text-secondary);background:var(--bg-container);text-align:center;padding:var(--spacing-lg);flex-direction:column;flex:1;display:flex}.image-tab-placeholder-title[data-v-212f0a2a]{font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--text-primary);word-break:break-all;margin:0}.image-tab-placeholder-hint[data-v-212f0a2a]{font-size:var(--font-size-sm);color:var(--text-tertiary);margin:0}.editor-body[data-v-212f0a2a]{flex:1;min-height:0;display:flex;overflow:hidden}.preview-resizer[data-v-212f0a2a]{cursor:col-resize;z-index:2;background:0 0;flex-shrink:0;order:99;width:6px;margin-left:auto;transition:background .15s;position:relative}.preview-resizer[data-v-212f0a2a]:after{content:"";background:var(--color-gray-300);border-radius:2px;width:2px;height:32px;transition:background .15s,height .15s;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.preview-resizer[data-v-212f0a2a]:hover{background:#3b82f60f}.preview-resizer[data-v-212f0a2a]:hover:after{background:var(--color-primary);height:48px;box-shadow:0 0 8px #3b82f666}.preview-panel[data-v-212f0a2a]{border-left:1px solid var(--border-color);background:var(--bg-panel);flex-direction:column;flex:1 1 0;min-width:200px;display:flex;overflow:hidden}.preview-header[data-v-212f0a2a]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:6px;height:34px;padding:0 10px;display:flex}.preview-title[data-v-212f0a2a]{letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);-webkit-user-select:none;user-select:none;font-size:11px;font-weight:700}.preview-ext-badge[data-v-212f0a2a]{color:var(--color-primary);letter-spacing:.04em;background:#3b82f626;border-radius:3px;padding:1px 5px;font-size:10px;font-weight:600}.preview-header-spacer[data-v-212f0a2a]{flex:1}.preview-close-btn[data-v-212f0a2a]{cursor:pointer;color:var(--text-tertiary);border-radius:var(--radius-base);background:0 0;border:none;align-items:center;padding:3px;transition:color .1s,background .1s;display:flex}.preview-close-btn[data-v-212f0a2a]:hover{color:var(--color-danger);background:var(--bg-hover)}.preview-body[data-v-212f0a2a]{flex-direction:column;flex:1;display:flex;overflow:hidden}.preview-iframe[data-v-212f0a2a]{background:0 0;border:none;flex:1;width:100%;height:100%}.preview-markdown[data-v-212f0a2a]{background:var(--bg-container,#fff);width:100%;height:100%;color:var(--text-primary,#1f2328);flex:1;overflow:auto}.preview-mindmap[data-v-212f0a2a]{background:var(--bg-container,#fff);flex-direction:column;flex:1;width:100%;height:100%;display:flex;overflow:hidden}.mindmap-toggle-btn.disabled[data-v-212f0a2a]{opacity:.45;cursor:not-allowed}.mindmap-toggle-btn.active[data-v-212f0a2a]{color:#fff;background:linear-gradient(#6366f1 0%,#4f46e5 100%);border-color:#4f46e5}.preview-image-wrap[data-v-212f0a2a]{background:var(--bg-container);flex:1;justify-content:center;align-items:center;padding:16px;display:flex;overflow:auto}.preview-image-wrap img[data-v-212f0a2a]{object-fit:contain;border-radius:4px;max-width:100%;max-height:100%;box-shadow:0 2px 12px #0003}.editor-tabs-spacer[data-v-212f0a2a]{flex:1}.preview-toggle-btn[data-v-212f0a2a]{cursor:pointer;height:34px;color:var(--text-secondary);white-space:nowrap;border:none;border-left:1px solid var(--border-color);background:0 0;flex-shrink:0;align-items:center;gap:5px;padding:0 10px;font-size:12px;transition:background .1s,color .1s;display:flex}.preview-toggle-btn[data-v-212f0a2a]:hover{background:var(--bg-hover);color:var(--text-primary)}.preview-toggle-btn.active[data-v-212f0a2a]{color:var(--color-primary);background:#3b82f614}.sidebar-actions[data-v-212f0a2a]{align-items:center;gap:2px;display:flex}.tree-inline-input-row[data-v-212f0a2a]{cursor:default;background:var(--bg-hover)}.tree-inline-input[data-v-212f0a2a]{background:var(--bg-container);border:1px solid var(--color-primary);min-width:0;height:20px;color:var(--text-primary);border-radius:3px;outline:none;flex:1;padding:0 5px;font-family:inherit;font-size:12.5px}.ctx-menu[data-v-212f0a2a]{z-index:9999;background:var(--bg-panel);border:1px solid var(--border-color);-webkit-user-select:none;user-select:none;border-radius:6px;min-width:160px;padding:4px;position:fixed;box-shadow:0 8px 24px #00000040}.ctx-menu-item[data-v-212f0a2a]{cursor:pointer;width:100%;color:var(--text-primary);text-align:left;background:0 0;border:none;border-radius:4px;align-items:center;gap:8px;padding:6px 10px;font-size:12.5px;transition:background .1s;display:flex}.ctx-menu-item[data-v-212f0a2a]:hover{background:var(--bg-hover)}.ctx-menu-item--danger[data-v-212f0a2a]{color:var(--color-danger)}.ctx-menu-item--danger[data-v-212f0a2a]:hover{background:#ef44441a}.ctx-menu-sep[data-v-212f0a2a]{background:var(--border-color);height:1px;margin:4px 2px}
1
+ .md-preview[data-v-d602e5a5]{color:inherit;word-break:break-word;padding:20px 24px;font-size:14px;line-height:1.6}.md-preview[data-v-d602e5a5] h1,.md-preview[data-v-d602e5a5] h2,.md-preview[data-v-d602e5a5] h3,.md-preview[data-v-d602e5a5] h4,.md-preview[data-v-d602e5a5] h5,.md-preview[data-v-d602e5a5] h6{border-bottom:1px solid var(--border-color,#d0d7de);margin-top:24px;margin-bottom:16px;padding-bottom:.3em;font-weight:600}.md-preview[data-v-d602e5a5] h1{font-size:1.8em}.md-preview[data-v-d602e5a5] h2{font-size:1.4em}.md-preview[data-v-d602e5a5] h3{font-size:1.2em}.md-preview[data-v-d602e5a5] p{margin:0 0 14px}.md-preview[data-v-d602e5a5] a{color:var(--link-color,#0969da);text-decoration:none}.md-preview[data-v-d602e5a5] a:hover{text-decoration:underline}.md-preview[data-v-d602e5a5] code{background:var(--code-bg,#f6f8fa);border-radius:4px;padding:2px 5px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:87%}.md-preview[data-v-d602e5a5] pre{background:var(--code-bg,#f6f8fa);border-radius:6px;margin:0 0 16px;padding:14px 16px;overflow:auto}.md-preview[data-v-d602e5a5] pre code{background:0 0;padding:0;font-size:100%}.md-preview[data-v-d602e5a5] blockquote{border-left:3px solid var(--border-color,#d0d7de);color:var(--text-secondary,#656d76);margin:0 0 16px;padding:0 16px}.md-preview[data-v-d602e5a5] img{border-radius:4px;max-width:100%}.md-preview[data-v-d602e5a5] hr{border:none;border-top:1px solid var(--border-color,#d0d7de);margin:24px 0}.md-preview[data-v-d602e5a5] table{border-collapse:collapse;width:100%;margin-bottom:16px}.md-preview[data-v-d602e5a5] th,.md-preview[data-v-d602e5a5] td{border:1px solid var(--border-color,#d0d7de);padding:6px 13px}.md-preview[data-v-d602e5a5] thead tr{background:var(--code-bg,#f6f8fa)}.md-preview[data-v-d602e5a5] ul,.md-preview[data-v-d602e5a5] ol{margin-bottom:16px;padding-left:2em}.md-preview[data-v-d602e5a5] li{margin:4px 0}.md-segment[data-v-d602e5a5]{display:block}.md-mindmap[data-v-d602e5a5]{border:1px solid var(--border-color,#d0d7de);background:var(--bg-panel,#fff);border-radius:8px;margin:18px 0 28px;overflow:hidden}.md-mindmap-title[data-v-d602e5a5]{color:var(--text-secondary,#656d76);background:var(--code-bg,#f6f8fa);border-bottom:1px solid var(--border-color,#d0d7de);letter-spacing:.5px;padding:8px 12px;font-size:12px;font-weight:600}.md-mindmap-canvas[data-v-d602e5a5]{width:100%;height:480px;display:block}.mindmap-preview[data-v-5988cf1a]{background:var(--bg-container,#fff);flex-direction:column;width:100%;height:100%;display:flex}.mindmap-preview-header[data-v-5988cf1a]{border-bottom:1px solid var(--border-color,#d0d7de);background:var(--bg-panel,#f6f8fa);align-items:center;gap:12px;padding:8px 14px;font-size:12px;display:flex}.mindmap-preview-title[data-v-5988cf1a]{color:var(--text-primary,#1f2328);letter-spacing:.5px;font-weight:600}.mindmap-preview-hint[data-v-5988cf1a]{color:var(--text-secondary,#656d76);font-size:11px}.mindmap-preview-canvas[data-v-5988cf1a]{flex:1;width:100%;min-height:0}.mindmap-preview-canvas[data-v-5988cf1a] .zm-mindmap,.mindmap-preview-canvas[data-v-5988cf1a]>*{width:100%;height:100%}.editor-view[data-v-83afeae5]{background:var(--bg-container);border:1px solid var(--border-color);width:100%;height:100%;box-shadow:var(--shadow-sm);border-radius:0;display:flex;overflow:hidden}.editor-sidebar[data-v-83afeae5]{border-right:1px solid var(--border-color);background:var(--bg-panel);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.sidebar-header[data-v-83afeae5]{border-bottom:1px solid var(--border-color);flex-shrink:0;justify-content:space-between;align-items:center;padding:8px 10px 6px;display:flex}.sidebar-title[data-v-83afeae5]{letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);-webkit-user-select:none;user-select:none;font-size:11px;font-weight:700}.sidebar-action-btn[data-v-83afeae5]{cursor:pointer;color:var(--text-tertiary);border-radius:var(--radius-base);background:0 0;border:none;align-items:center;padding:3px;display:flex}.sidebar-action-btn[data-v-83afeae5]:hover{color:var(--text-primary);background:var(--bg-hover)}.sidebar-search[data-v-83afeae5]{border-bottom:1px solid var(--border-color);flex-shrink:0;align-items:center;padding:6px 10px;display:flex;position:relative}.sidebar-search-icon[data-v-83afeae5]{color:var(--text-tertiary);pointer-events:none;position:absolute;left:18px}.sidebar-search-input[data-v-83afeae5]{min-width:0;height:26px;color:var(--text-primary);background:var(--bg-input,#ffffff0a);border:1px solid var(--border-color);border-radius:var(--radius-base);outline:none;flex:1;padding:0 24px 0 26px;font-size:12px;transition:border-color .12s,background .12s}.sidebar-search-input[data-v-83afeae5]::placeholder{color:var(--text-tertiary)}.sidebar-search-input[data-v-83afeae5]:hover{border-color:var(--text-tertiary)}.sidebar-search-input[data-v-83afeae5]:focus{border-color:var(--accent-color,#3b82f6);background:var(--bg-panel)}.sidebar-search-clear[data-v-83afeae5]{cursor:pointer;width:18px;height:18px;color:var(--text-tertiary);background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;transition:background .12s,color .12s;display:flex;position:absolute;right:14px}.sidebar-search-clear[data-v-83afeae5]:hover{background:var(--bg-hover);color:var(--text-primary)}.tree-name-hit[data-v-83afeae5]{color:var(--accent-color,#f59e0b);background:#f59e0b26;border-radius:2px;padding:0 1px}.sidebar-tree[data-v-83afeae5]{flex:1;padding:4px 0;overflow:hidden auto}.tree-node[data-v-83afeae5]{cursor:pointer;-webkit-user-select:none;user-select:none;height:24px;color:var(--text-primary);white-space:nowrap;border-radius:4px;align-items:center;gap:4px;padding-right:8px;font-size:13px;transition:background .1s;display:flex;overflow:hidden}.tree-node[data-v-83afeae5]:hover{background:var(--bg-hover)}.tree-node--active[data-v-83afeae5]{color:var(--color-primary);background:#3b82f61f}.tree-node--selected[data-v-83afeae5]{outline-offset:-1px;background:#63b3ed26;outline:1px solid #63b3ed59}.tree-arrow[data-v-83afeae5]{color:var(--text-tertiary);flex-shrink:0;align-items:center;width:12px;transition:transform .15s;display:flex}.tree-arrow.expanded[data-v-83afeae5]{transform:rotate(90deg)}.tree-arrow-spacer[data-v-83afeae5]{flex-shrink:0;width:12px}.tree-icon[data-v-83afeae5]{flex-shrink:0;align-items:center;font-size:14px;line-height:1;display:flex}.tree-icon.mit-icon[data-v-83afeae5]{fill:currentColor;vertical-align:middle;width:14px;height:14px;display:inline-block}.tree-icon--dir[data-v-83afeae5]{color:#e8b84b}.tree-name[data-v-83afeae5]{text-overflow:ellipsis;flex:1;min-width:0;font-size:13px;overflow:hidden}.tree-loading[data-v-83afeae5]{border:1.5px solid var(--color-primary);border-top-color:#0000;border-radius:50%;flex-shrink:0;width:10px;height:10px;animation:.8s linear infinite spin-83afeae5;display:inline-block}.tree-empty[data-v-83afeae5]{color:var(--text-tertiary);text-align:center;padding:24px 12px;font-size:12px}.sidebar-loading[data-v-83afeae5]{flex:1;justify-content:center;align-items:center;display:flex}.spin-icon[data-v-83afeae5]{border:2px solid var(--color-primary);border-top-color:#0000;border-radius:50%;width:20px;height:20px;animation:.8s linear infinite spin-83afeae5;display:inline-block}@keyframes spin-83afeae5{to{transform:rotate(360deg)}}.editor-resizer[data-v-83afeae5]{cursor:col-resize;z-index:2;background:0 0;flex-shrink:0;width:6px;transition:background .15s;position:relative}.editor-resizer[data-v-83afeae5]:after{content:"";background:var(--color-gray-300);border-radius:2px;width:2px;height:32px;transition:background .15s,height .15s;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.editor-resizer[data-v-83afeae5]:hover{background:#3b82f60f}.editor-resizer[data-v-83afeae5]:hover:after{background:var(--color-primary);height:48px;box-shadow:0 0 8px #3b82f666}.editor-main[data-v-83afeae5]{flex-direction:column;flex:1;display:flex;overflow:hidden}.editor-tabs[data-v-83afeae5]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);scrollbar-width:none;flex-shrink:0;display:flex;overflow:auto hidden}.editor-tabs[data-v-83afeae5]::-webkit-scrollbar{display:none}.editor-tab[data-v-83afeae5]{border-right:1px solid var(--border-color);cursor:pointer;height:34px;color:var(--text-secondary);-webkit-user-select:none;user-select:none;flex-shrink:0;align-items:center;gap:6px;min-width:80px;max-width:200px;padding:0 12px;font-size:12.5px;transition:background .1s,color .1s;display:flex}.editor-tab[data-v-83afeae5]:hover{background:var(--bg-hover);color:var(--text-primary)}.editor-tab.active[data-v-83afeae5]{background:var(--bg-container);color:var(--text-primary);border-bottom:2px solid var(--color-primary)}.tab-name[data-v-83afeae5]{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.tab-dirty-dot[data-v-83afeae5]{background:var(--color-warning);border-radius:50%;flex-shrink:0;width:6px;height:6px}.tab-close[data-v-83afeae5]{cursor:pointer;color:var(--text-tertiary);opacity:0;background:0 0;border:none;border-radius:3px;flex-shrink:0;align-items:center;padding:2px;transition:opacity .1s,background .1s;display:flex}.editor-tab:hover .tab-close[data-v-83afeae5],.editor-tab.active .tab-close[data-v-83afeae5]{opacity:1}.tab-close[data-v-83afeae5]:hover{background:var(--bg-hover);color:var(--color-danger)}.editor-empty[data-v-83afeae5]{color:var(--text-tertiary);-webkit-user-select:none;user-select:none;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:10px;font-size:13px;display:flex}.editor-empty p[data-v-83afeae5]{margin:0}.editor-empty-hint[data-v-83afeae5]{opacity:.6;font-size:11px}.monaco-container[data-v-83afeae5]{flex:1;min-width:0;overflow:hidden}.monaco-container.hidden[data-v-83afeae5]{display:none}.image-tab-placeholder[data-v-83afeae5]{justify-content:center;align-items:center;gap:var(--spacing-sm);color:var(--text-secondary);background:var(--bg-container);text-align:center;padding:var(--spacing-lg);flex-direction:column;flex:1;display:flex}.image-tab-placeholder-title[data-v-83afeae5]{font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--text-primary);word-break:break-all;margin:0}.image-tab-placeholder-hint[data-v-83afeae5]{font-size:var(--font-size-sm);color:var(--text-tertiary);margin:0}.editor-body[data-v-83afeae5]{flex:1;min-height:0;display:flex;overflow:hidden}.preview-resizer[data-v-83afeae5]{cursor:col-resize;z-index:2;background:0 0;flex-shrink:0;order:99;width:6px;margin-left:auto;transition:background .15s;position:relative}.preview-resizer[data-v-83afeae5]:after{content:"";background:var(--color-gray-300);border-radius:2px;width:2px;height:32px;transition:background .15s,height .15s;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.preview-resizer[data-v-83afeae5]:hover{background:#3b82f60f}.preview-resizer[data-v-83afeae5]:hover:after{background:var(--color-primary);height:48px;box-shadow:0 0 8px #3b82f666}.preview-panel[data-v-83afeae5]{border-left:1px solid var(--border-color);background:var(--bg-panel);flex-direction:column;flex:1 1 0;min-width:200px;display:flex;overflow:hidden}.preview-header[data-v-83afeae5]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:6px;height:34px;padding:0 10px;display:flex}.preview-title[data-v-83afeae5]{letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);-webkit-user-select:none;user-select:none;font-size:11px;font-weight:700}.preview-ext-badge[data-v-83afeae5]{color:var(--color-primary);letter-spacing:.04em;background:#3b82f626;border-radius:3px;padding:1px 5px;font-size:10px;font-weight:600}.preview-header-spacer[data-v-83afeae5]{flex:1}.preview-close-btn[data-v-83afeae5]{cursor:pointer;color:var(--text-tertiary);border-radius:var(--radius-base);background:0 0;border:none;align-items:center;padding:3px;transition:color .1s,background .1s;display:flex}.preview-close-btn[data-v-83afeae5]:hover{color:var(--color-danger);background:var(--bg-hover)}.preview-body[data-v-83afeae5]{flex-direction:column;flex:1;display:flex;overflow:hidden}.preview-iframe[data-v-83afeae5]{background:0 0;border:none;flex:1;width:100%;height:100%}.preview-markdown[data-v-83afeae5]{background:var(--bg-container,#fff);width:100%;height:100%;color:var(--text-primary,#1f2328);flex:1;overflow:auto}.preview-mindmap[data-v-83afeae5]{background:var(--bg-container,#fff);flex-direction:column;flex:1;width:100%;height:100%;display:flex;overflow:hidden}.mindmap-toggle-btn.disabled[data-v-83afeae5]{opacity:.45;cursor:not-allowed}.mindmap-toggle-btn.active[data-v-83afeae5]{color:#fff;background:linear-gradient(#6366f1 0%,#4f46e5 100%);border-color:#4f46e5}.preview-image-wrap[data-v-83afeae5]{background:var(--bg-container);flex:1;justify-content:center;align-items:center;padding:16px;display:flex;overflow:auto}.preview-image-wrap img[data-v-83afeae5]{object-fit:contain;border-radius:4px;max-width:100%;max-height:100%;box-shadow:0 2px 12px #0003}.editor-tabs-spacer[data-v-83afeae5]{flex:1}.preview-toggle-btn[data-v-83afeae5]{cursor:pointer;height:34px;color:var(--text-secondary);white-space:nowrap;border:none;border-left:1px solid var(--border-color);background:0 0;flex-shrink:0;align-items:center;gap:5px;padding:0 10px;font-size:12px;transition:background .1s,color .1s;display:flex}.preview-toggle-btn[data-v-83afeae5]:hover{background:var(--bg-hover);color:var(--text-primary)}.preview-toggle-btn.active[data-v-83afeae5]{color:var(--color-primary);background:#3b82f614}.sidebar-actions[data-v-83afeae5]{align-items:center;gap:2px;display:flex}.tree-inline-input-row[data-v-83afeae5]{cursor:default;background:var(--bg-hover)}.tree-inline-input[data-v-83afeae5]{background:var(--bg-container);border:1px solid var(--color-primary);min-width:0;height:20px;color:var(--text-primary);border-radius:3px;outline:none;flex:1;padding:0 5px;font-family:inherit;font-size:12.5px}.ctx-menu[data-v-83afeae5]{z-index:9999;background:var(--bg-panel);border:1px solid var(--border-color);-webkit-user-select:none;user-select:none;border-radius:6px;min-width:160px;padding:4px;position:fixed;box-shadow:0 8px 24px #00000040}.ctx-menu-item[data-v-83afeae5]{cursor:pointer;width:100%;color:var(--text-primary);text-align:left;background:0 0;border:none;border-radius:4px;align-items:center;gap:8px;padding:6px 10px;font-size:12.5px;transition:background .1s;display:flex}.ctx-menu-item[data-v-83afeae5]:hover{background:var(--bg-hover)}.ctx-menu-item--danger[data-v-83afeae5]{color:var(--color-danger)}.ctx-menu-item--danger[data-v-83afeae5]:hover{background:#ef44441a}.ctx-menu-sep[data-v-83afeae5]{background:var(--border-color);height:1px;margin:4px 2px}
@@ -0,0 +1,3 @@
1
+ import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{An as t,Bn as n,Gn as r,Ln as i,Mn as a,P as o,Pn as s,Qn as c,Rn as l,Un as ee,Vn as u,Wn as d,Xn as f,Zn as te,_ as ne,_t as re,c as p,cr as m,d as h,dr as g,er as _,f as ie,fr as ae,g as oe,gr as v,h as se,hr as y,jn as b,m as ce,mr as x,nr as S,or as le,p as ue,pr as C,qn as de,sr as w,t as fe,v as pe,y as me}from"./vendor-C30huq-U.js";import{n as T,t as E}from"./_plugin-vue_export-helper-rin5I4Hu.js";import{i as he,o as ge}from"./index-8cDK0aD_.js";var _e=e(h(),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(de({__name:`SourceMapView`,setup(e){let h=g(document.documentElement.getAttribute(`data-theme`)===`dark`?`dark`:`light`);function de(){h.value=document.documentElement.getAttribute(`data-theme`)===`dark`?`dark`:`light`}let E=null,D=ge(),O=g(D.currentDirectory||``),k=g(`idle`),A=g([]),_t=0,j=g(null),M=g(null),N=g(`files`),P=g(``),F=g(``),I=g(!1),L=g([]),R=g(new Set),z=g({files:!0,graph:!0,source:!0}),B=g(!1),V=g(220),H=g(360),U=g(140),W=null,G=0,vt=0,K=0;function q(e,t){W=e,G=t.clientX,vt=t.clientY,K=e===`files`?V.value:e===`source`?H.value:U.value,document.addEventListener(`mousemove`,yt),document.addEventListener(`mouseup`,J),t.preventDefault()}function yt(e){W&&(W===`files`?V.value=Math.max(120,Math.min(480,K+e.clientX-G)):W===`source`?H.value=Math.max(200,Math.min(700,K+G-e.clientX)):U.value=Math.max(60,Math.min(500,K+vt-e.clientY)))}function J(){W=null,document.removeEventListener(`mousemove`,yt),document.removeEventListener(`mouseup`,J)}let Y=g(null),X=ae(null),{fitView:bt,setNodes:xt,setEdges:St,getNodes:Ct,getEdges:wt,updateNodeInternals:Tt}=me(),Z=i(()=>k.value===`scanning`||k.value===`analyzing`),Et=i(()=>h.value===`dark`?`#334155`:`#cbd5e1`),Q=i(()=>j.value?.nodes.find(e=>e.id===M.value)??null),Dt=i(()=>{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(){!Y.value||X.value||(X.value=p.create(Y.value,{value:``,language:`plaintext`,theme:h.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}}))}le(h,e=>{X.value&&p.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,l=a*600+n*220-(o-1)*220/2,ee=t*110,u=At(e);i.push({id:e.id,type:`default`,position:{x:l,y:ee},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:se.ArrowClosed}}))}}async function Pt(){let e=Ct.value,t=wt.value;if(e.length!==0){B.value=!0;try{await f(),await new Promise(e=>requestAnimationFrame(()=>e())),Tt(e.map(e=>e.id)),await new Promise(e=>requestAnimationFrame(()=>e()));let n=new Map;e.forEach(e=>{let t=e.data?.subsystem??`__default__`;n.has(t)||n.set(t,[]),n.get(t).push(e)});let r=new Map,i=0;for(let[,e]of n){let n=new _e.default.graphlib.Graph;n.setDefaultEdgeLabel(()=>({})),n.setGraph({rankdir:`TB`,nodesep:55,ranksep:75,marginx:40,marginy:40});let a=new Set(e.map(e=>e.id));e.forEach(e=>{let t=190,r=e.data?.description?68:48,i=document.querySelector(`.vue-flow__node[data-id="${e.id}"]`);i&&i.offsetWidth>0&&(t=i.offsetWidth,r=i.offsetHeight),n.setNode(e.id,{width:t,height:r})}),t.forEach(e=>{a.has(e.source)&&a.has(e.target)&&n.setEdge(e.source,e.target)}),_e.default.layout(n);let o=0;e.forEach(e=>{let t=n.node(e.id);t&&(r.set(e.id,{x:i+t.x-t.width/2,y:t.y-t.height/2}),o=Math.max(o,t.x+t.width/2))}),i+=o+120}xt(e.map(e=>({...e,position:r.get(e.id)??e.position}))),await f(),bt({padding:.18})}finally{B.value=!1}}}async function Ft(){if(!O.value.trim()){o.warning(T(`@SRCMAP:请先输入项目路径`));return}if(!Z.value){A.value=[],j.value=null,M.value=null,P.value=``,F.value=``,xt([]),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,t){if(e===`log`)$(t.message,t.type||`info`);else if(e===`files`)L.value=Ot(t.files||[]),L.value.forEach(e=>{e.kind===`dir`&&R.value.add(e.path)});else if(e===`result`){j.value={language:t.language||``,entryFile:t.entryFile||``,entryFunction:t.entryFunction||``,nodes:Array.isArray(t.nodes)?t.nodes:[],edges:Array.isArray(t.edges)?t.edges:[],techStack:Array.isArray(t.techStack)?t.techStack:[],summary:t.summary||``,allFiles:Array.isArray(t.allFiles)?t.allFiles:[],codeFiles:Array.isArray(t.codeFiles)?t.codeFiles:[],subsystems:Array.isArray(t.subsystems)?t.subsystems:void 0};let{flowNodes:e,flowEdges:n}=Nt(j.value.nodes,j.value.edges);xt(e),St(n),f(()=>Pt())}else e===`done`&&(t.error?($(`${T(`@SRCMAP:分析失败`)}: ${t.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=i(()=>{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 le(()=>D.currentDirectory,e=>{e&&!O.value&&(O.value=e)}),le([P,F],([e,t])=>{let n=X.value;if(!n)return;let r=jt(t||``),i=n.getModel(),a=p.createModel(e||``,r);n.setModel(a),i?.dispose(),n.setScrollPosition({scrollTop:0,scrollLeft:0})}),c(()=>{Mt(),!O.value&&D.currentDirectory&&(O.value=D.currentDirectory),E=new MutationObserver(()=>de()),E.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-theme`]})}),te(()=>{X.value?.getModel()?.dispose(),X.value?.dispose(),J(),E?.disconnect(),E=null}),(e,i)=>{let o=re;return _(),u(`div`,ve,[l(`div`,ye,[l(`div`,be,[i[9]||=l(`svg`,{viewBox:`0 0 24 24`,width:`18`,height:`18`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,class:`sm-icon-map`},[l(`polygon`,{points:`3 6 9 3 15 6 21 3 21 18 15 21 9 18 3 21`}),l(`line`,{x1:`9`,y1:`3`,x2:`9`,y2:`18`}),l(`line`,{x1:`15`,y1:`6`,x2:`15`,y2:`21`})],-1),l(`span`,xe,v(C(T)(`@SRCMAP:源码地图`)),1)]),l(`div`,Se,[m(l(`input`,{"onUpdate:modelValue":i[0]||=e=>O.value=e,class:`sm-path-input`,placeholder:C(T)(`@SRCMAP:输入项目目录路径`),disabled:Z.value,onKeydown:a(Ft,[`enter`])},null,40,Ce),[[t,O.value]]),l(`button`,{class:`sm-btn sm-btn-primary`,disabled:Z.value,onClick:Ft},[Z.value?(_(),u(s,{key:0},[i[10]||=l(`span`,{class:`sm-spinner`},null,-1),d(` `+v(C(T)(`@SRCMAP:分析中...`)),1)],64)):(_(),u(s,{key:1},[d(v(k.value===`done`?C(T)(`@SRCMAP:重新分析`):C(T)(`@SRCMAP:开始分析`)),1)],64))],8,we)]),l(`div`,Te,[r(o,{content:C(T)(`@SRCMAP:文件列表`),placement:`bottom`},{default:w(()=>[l(`button`,{class:x([`sm-panel-btn`,{active:z.value.files}]),onClick:i[1]||=e=>z.value.files=!z.value.files},[...i[11]||=[l(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[l(`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`]),r(o,{content:C(T)(`@SRCMAP:调用图`),placement:`bottom`},{default:w(()=>[l(`button`,{class:x([`sm-panel-btn`,{active:z.value.graph}]),onClick:i[2]||=e=>z.value.graph=!z.value.graph},[...i[12]||=[l(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[l(`circle`,{cx:`12`,cy:`12`,r:`3`}),l(`circle`,{cx:`3`,cy:`6`,r:`2`}),l(`circle`,{cx:`21`,cy:`6`,r:`2`}),l(`circle`,{cx:`3`,cy:`18`,r:`2`}),l(`circle`,{cx:`21`,cy:`18`,r:`2`}),l(`line`,{x1:`5`,y1:`6`,x2:`9`,y2:`11`}),l(`line`,{x1:`19`,y1:`6`,x2:`15`,y2:`11`}),l(`line`,{x1:`5`,y1:`18`,x2:`9`,y2:`13`}),l(`line`,{x1:`19`,y1:`18`,x2:`15`,y2:`13`})],-1)]],2)]),_:1},8,[`content`]),r(o,{content:C(T)(`@SRCMAP:源码面板`),placement:`bottom`},{default:w(()=>[l(`button`,{class:x([`sm-panel-btn`,{active:z.value.source}]),onClick:i[3]||=e=>z.value.source=!z.value.source},[...i[13]||=[l(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[l(`polyline`,{points:`16 18 22 12 16 6`}),l(`polyline`,{points:`8 6 2 12 8 18`})],-1)]],2)]),_:1},8,[`content`])])]),l(`div`,Ee,[m(l(`div`,{class:`sm-panel sm-panel-files`,style:y({width:V.value+`px`})},[l(`div`,De,[l(`button`,{class:x([`sm-tab-btn`,{active:N.value===`files`}]),onClick:i[4]||=e=>N.value=`files`},[i[14]||=l(`svg`,{viewBox:`0 0 24 24`,width:`12`,height:`12`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[l(`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),d(` `+v(C(T)(`@SRCMAP:文件列表`))+` `,1),j.value?(_(),u(`span`,Oe,v(j.value.allFiles.length),1)):n(``,!0)],2),l(`button`,{class:x([`sm-tab-btn`,{active:N.value===`outline`}]),onClick:i[5]||=e=>N.value=`outline`},[i[15]||=ee(`<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),d(` `+v(C(T)(`@SRCMAP:大纲`)),1)],2)]),m(l(`div`,ke,[Bt.value.length>0?(_(!0),u(s,{key:0},S(Bt.value,e=>(_(),u(`div`,{key:e.path,class:x([`sm-tree-node`,{"sm-tree-node--dir":e.kind===`dir`,"sm-tree-node--active":e.kind===`file`&&F.value===e.path}]),style:y({paddingLeft:10+e.depth*14+`px`}),onClick:t=>e.kind===`dir`?zt(e.path):Lt(e.path)},[e.kind===`dir`?(_(),u(`span`,{key:0,class:x([`sm-tree-arrow`,{expanded:e.expanded}])},[...i[16]||=[l(`svg`,{viewBox:`0 0 24 24`,width:`10`,height:`10`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[l(`polyline`,{points:`9 18 15 12 9 6`})],-1)]],2)):(_(),u(`span`,je)),e.kind===`dir`?(_(),u(`svg`,Me,[l(`use`,{"xlink:href":`#${C(he)(e.name)||`icon-folder`}`},null,8,Ne)])):(_(),u(`svg`,Pe,[l(`use`,{"xlink:href":`#${C(he)(e.name)}`},null,8,Fe)])),l(`span`,{class:`sm-tree-name`,title:e.path},v(e.name),9,Ie)],14,Ae))),128)):(_(),u(`div`,Le,v(C(T)(`@SRCMAP:暂无文件,请先开始分析`)),1))],512),[[b,N.value===`files`]]),m(l(`div`,Re,[Dt.value.length>0?(_(!0),u(s,{key:0},S(Dt.value,e=>(_(),u(`div`,{key:e.displayName,class:`sm-outline-group`},[l(`div`,{class:`sm-outline-group-header`,style:y({color:e.color})},[i[17]||=l(`svg`,{viewBox:`0 0 24 24`,width:`8`,height:`8`,fill:`currentColor`},[l(`circle`,{cx:`12`,cy:`12`,r:`6`})],-1),d(` `+v(e.displayName)+` `,1),l(`span`,ze,v(e.nodes.length),1)],4),(_(!0),u(s,null,S(e.nodes,t=>(_(),u(`div`,{key:t.id,class:x([`sm-outline-node`,{"sm-outline-node--active":M.value===t.id}]),onClick:e=>{M.value=t.id,t.file&&Lt(t.file)}},[l(`span`,{class:`sm-outline-dot`,style:y({background:e.color})},null,4),l(`span`,{class:`sm-outline-label`,title:t.file||t.label},v(t.label),9,Ve),t.description?(_(),u(`span`,He,v(t.description.length>18?t.description.slice(0,18)+`…`:t.description),1)):n(``,!0)],10,Be))),128))]))),128)):(_(),u(`div`,Ue,v(C(T)(`@SRCMAP:暂无分析结果`)),1))],512),[[b,N.value===`outline`]])],4),[[b,z.value.files]]),m(l(`div`,{class:`sm-resizer sm-resizer-v`,onMousedown:i[6]||=e=>q(`files`,e)},null,544),[[b,z.value.files&&z.value.graph]]),m(l(`div`,We,[j.value?(_(),u(`div`,Ge,[l(`span`,Ke,v(j.value.language),1),j.value.subsystems&&j.value.subsystems.length>1?(_(!0),u(s,{key:0},S(j.value.subsystems,e=>(_(),u(`span`,{key:e.name,class:`sm-subsystem-tag`,style:y({borderColor:e.color,color:e.color})},`● `+v(e.displayName||e.name),5))),128)):(_(!0),u(s,{key:1},S(j.value.techStack.slice(0,4),e=>(_(),u(`span`,{key:e,class:`sm-tech-tag`},v(e),1))),128)),l(`span`,qe,v(j.value.summary),1)])):n(``,!0),l(`div`,Je,[l(`div`,Ye,[l(`button`,{class:`sm-layout-btn`,disabled:B.value||!j.value,onClick:Pt},[i[18]||=ee(`<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),d(` `+v(B.value?C(T)(`@SRCMAP:布局中...`):C(T)(`@SRCMAP:优化布局`)),1)],8,Xe)]),r(C(ne),{class:`sm-vue-flow`,"default-viewport":{zoom:1},"min-zoom":.2,"max-zoom":4,"fit-view-on-init":``,onNodeClick:Rt},{"node-default":w(({data:e,label:t})=>[r(C(pe),{type:`target`,position:C(oe).Top},null,8,[`position`]),l(`div`,{class:`sm-fn-inner`,title:`${t}${e?.description?`
3
+ `+e.description:``}`},[l(`div`,Qe,v(t),1),e?.description?(_(),u(`div`,$e,v(e.description.length>22?e.description.slice(0,22)+`…`:e.description),1)):n(``,!0)],8,Ze),r(C(pe),{type:`source`,position:C(oe).Bottom},null,8,[`position`])]),default:w(()=>[r(C(ce),{variant:C(ue).Dots,gap:20,size:1,"pattern-color":Et.value},null,8,[`variant`,`pattern-color`]),r(C(ie)),r(C(fe),{"node-color":`#3b82f6`,"mask-color":h.value===`dark`?`rgba(0,0,0,0.55)`:`rgba(15,23,42,0.06)`},null,8,[`mask-color`])]),_:1}),!j.value&&!Z.value?(_(),u(`div`,et,[(_(),u(`svg`,tt,[...i[19]||=[l(`polygon`,{points:`3 6 9 3 15 6 21 3 21 18 15 21 9 18 3 21`},null,-1),l(`line`,{x1:`9`,y1:`3`,x2:`9`,y2:`18`},null,-1),l(`line`,{x1:`15`,y1:`6`,x2:`15`,y2:`21`},null,-1)]])),l(`p`,null,v(C(T)(`@SRCMAP:输入项目路径后点击开始分析`)),1)])):n(``,!0),Z.value&&!j.value?(_(),u(`div`,nt,[i[20]||=l(`span`,{class:`sm-spinner sm-spinner-lg`},null,-1),l(`p`,null,v(C(T)(`@SRCMAP:AI 正在分析项目结构...`)),1)])):n(``,!0)]),l(`div`,{class:`sm-resizer sm-resizer-h`,onMousedown:i[7]||=e=>q(`log`,e)},null,32),l(`div`,{class:`sm-log-panel`,style:y({height:U.value+`px`})},[l(`div`,rt,[i[21]||=l(`svg`,{viewBox:`0 0 24 24`,width:`12`,height:`12`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[l(`polyline`,{points:`4 17 10 11 4 5`}),l(`line`,{x1:`12`,y1:`19`,x2:`20`,y2:`19`})],-1),d(` `+v(C(T)(`@SRCMAP:Agent 日志`))+` `,1),Z.value?(_(),u(`span`,it)):n(``,!0)]),l(`div`,at,[(_(!0),u(s,null,S(A.value.slice(-50),e=>(_(),u(`div`,{key:e.id,class:x([`sm-log-entry`,`sm-log-entry--${e.type}`])},v(e.message),3))),128)),A.value.length===0?(_(),u(`div`,ot,v(C(T)(`@SRCMAP:等待开始分析`)),1)):n(``,!0)],512)],4)],512),[[b,z.value.graph]]),m(l(`div`,{class:`sm-resizer sm-resizer-v`,onMousedown:i[8]||=e=>q(`source`,e)},null,544),[[b,z.value.graph&&z.value.source]]),m(l(`div`,{class:`sm-panel sm-panel-source`,style:y({width:H.value+`px`})},[l(`div`,st,[i[22]||=l(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[l(`polyline`,{points:`16 18 22 12 16 6`}),l(`polyline`,{points:`8 6 2 12 8 18`})],-1),d(` `+v(F.value||C(T)(`@SRCMAP:源码面板`))+` `,1),Q.value?(_(),u(`span`,ct,v(Q.value.label),1)):n(``,!0)]),Q.value?(_(),u(`div`,lt,[l(`div`,ut,v(Q.value.label),1),l(`div`,dt,[d(v(Q.value.file),1),Q.value.line?(_(),u(`span`,ft,` :`+v(Q.value.line),1)):n(``,!0)]),Q.value.description?(_(),u(`div`,pt,v(Q.value.description),1)):n(``,!0)])):n(``,!0),l(`div`,mt,[I.value?(_(),u(`div`,ht,[...i[23]||=[l(`span`,{class:`sm-spinner`},null,-1)]])):n(``,!0),!I.value&&!P.value?(_(),u(`div`,gt,v(C(T)(`@SRCMAP:点击调用图中的节点查看源码`)),1)):n(``,!0),l(`div`,{ref_key:`monacoContainerRef`,ref:Y,class:`sm-monaco-container`},null,512)])],4),[[b,z.value.source]])])])}}}),[[`__scopeId`,`data-v-71d3569e`]]);export{D as default};
@@ -0,0 +1,6 @@
1
+ import"./rolldown-runtime-CMxvf4Kt.js";import{$t as e,An as t,B as n,Bn as r,Ct as i,F as a,Gn as o,In as s,It as c,J as l,Ln as u,Mn as ee,N as d,Nn as f,Ot as p,P as m,Pn as h,Qn as g,Rn as _,Rt as v,St as te,V as y,Vn as b,Vt as x,Wn as S,Wt as C,Xn as w,Xt as T,Y as E,Zn as ne,Zt as D,ar as re,at as ie,bt as O,cr as k,dr as A,er as j,ft as ae,gr as M,gt as oe,hr as se,in as ce,jt as le,kn as ue,lr as N,lt as de,mr as P,nr as F,on as I,or as L,ot as fe,pr as R,q as z,qn as B,rn as pe,sr as V,st as me,tt as he,ur as ge,ut as _e,vt as ve,xt as ye,yt as be,zn as H}from"./vendor-C30huq-U.js";import{n as U,t as xe}from"./_plugin-vue_export-helper-rin5I4Hu.js";import{n as Se}from"./index-8cDK0aD_.js";var W={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`},Oe={class:`ai-split-subhead`},ke={class:`ai-split-pre`},G={key:0,class:`ai-split-tab-count`},K={class:`ai-split-pre ai-split-pre--think`},q={key:0,class:`ai-split-tab-count`},J={class:`ai-split-parse-error__detail`},Ae={class:`ai-split-parse-error__hint`},je={class:`ai-split-parse-error__actions`},Y={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`},Fe={key:1,class:`ai-split-list`},Ie={class:`ai-split-list__no`},X={class:`ai-split-list__body`},Z={class:`ai-split-list__title`},Le={class:`ai-split-list__desc`},Re={key:2,class:`ai-split-footer-hint`},ze=xe(B({__name:`AISplitDialog`,props:{modelValue:{type:Boolean},title:{},desc:{},taskId:{},promptId:{}},emits:[`update:modelValue`,`confirm`],setup(e,{emit:t}){let i=e,a=t,s=A(`idle`),c=A(`prompt`),l=A(``),ee=A(``),d=A(``),f=A(``),g=A(``),v=A([]),te=A(``),x=A(``),C=A(``),w=null,T=0,E=u(()=>d.value.length),ne=u(()=>f.value.length),re=u(()=>s.value===`result`&&v.value.length>0),ie=u(()=>s.value===`running`);function k(){se(),ce(),a(`update:modelValue`,!1)}function se(){w&&=(w.abort(),null)}function ce(){se(),s.value=`idle`,c.value=`prompt`,l.value=``,ee.value=``,d.value=``,f.value=``,g.value=``,v.value=[],te.value=``,x.value=``,C.value=``}async function le(){if(!i.title.trim()){m.warning(U(`@WORKBENCH:请先填写任务标题`));return}ce();let e=++T;s.value=`running`,c.value=`thinking`,w=new AbortController;let t=w;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:i.title,desc:i.desc,taskId:i.taskId||``,promptId:i.promptId||``}),signal:t.signal});if(e!==T)return;if(!n.ok||!n.body){let e=await n.text().catch(()=>``);throw Error(e||`HTTP ${n.status}`)}let r=n.body.getReader(),a=new TextDecoder(`utf-8`),o=``,u=null;for(;;){let{value:t,done:n}=await r.read();if(e!==T)return;if(n)break;o+=a.decode(t,{stream:!0});let i=o.split(`
2
+ `);o=i.pop()??``;for(let e of i){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`:l.value=r.prompt?.system||``,ee.value=r.prompt?.user||``;break;case`thinking`:d.value+=String(r.delta||``);break;case`content`:f.value+=String(r.delta||``);break;case`done`:u=r;break;case`error`:throw Error(r.error||`AI 拆分失败`)}}}if(e!==T)return;if(!u)throw Error(U(`@WORKBENCH:AI 未返回结果`));v.value=Array.isArray(u.subtasks)?u.subtasks:[],g.value=u.raw||f.value,x.value=String(u.parseError||``),C.value=String(u.parseStage||``),d.value||=U(`@WORKBENCH:(当前模型未返回独立的思考内容,可切换到「原始结果」查看完整输出)`),s.value=`result`,c.value=v.value.length>0?`confirm`:(x.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:T}}),e!==T||n?.name===`AbortError`||t.signal.aborted)return;s.value=`error`,te.value=n?.message||String(n)}finally{e===T&&(w=null)}}function ue(){re.value&&(a(`confirm`,v.value.slice()),a(`update:modelValue`,!1))}function N(){le()}let de=A(!1);async function P(){if(!f.value.trim()){m.warning(U(`@WORKBENCH:原始结果为空,无法解析`));return}de.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){m.error(e.error||U(`@WORKBENCH:解析失败`));return}v.value=Array.isArray(e.subtasks)?e.subtasks:[],x.value=String(e.parseError||``),C.value=String(e.parseStage||``),g.value=f.value,v.value.length>0?(m.success(U(`@WORKBENCH:解析成功,已识别 {n} 个子任务`,{n:v.value.length})),c.value=`confirm`):m.warning(U(`@WORKBENCH:仍未解析到子任务,请继续修改原始结果`))}catch(e){m.error(U(`@WORKBENCH:解析失败: `)+(e?.message||e))}finally{de.value=!1}}L(()=>i.modelValue,e=>{e&&s.value===`idle`&&le()}),L(()=>i.taskId,()=>{ce()});let I=A(!1),fe=A(``),z=A(!1);function B(){fe.value=l.value,I.value=!0}async function pe(){if(!fe.value.trim()){m.warning(U(`@WORKBENCH:指令内容不能为空`));return}z.value=!0;try{let e=await fetch(`/api/workbench/tasks/ai-subtask-instruction`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({instruction:fe.value})}).then(e=>e.json());e.success?(m.success(U(`@WORKBENCH:已保存指令`)),I.value=!1,N()):m.error(e.error||U(`@WORKBENCH:保存失败`))}catch(e){m.error(U(`@WORKBENCH:保存失败: `)+(e?.message||e))}finally{z.value=!1}}function me(){I.value=!1}return(t,i)=>{let u=ye,m=ae,g=oe,C=n,w=O,T=y,A=he;return j(),H(A,{"model-value":e.modelValue,"onUpdate:modelValue":i[4]||=e=>a(`update:modelValue`,e),title:R(U)(`@WORKBENCH:AI 拆分任务`),width:`800px`,"close-on-click-modal":!1,"close-on-press-escape":!ie.value,"show-close":!ie.value,onClose:k},{footer:V(()=>[s.value===`error`||s.value===`result`&&x.value&&v.value.length===0?(j(),H(m,{key:0,onClick:N},{default:V(()=>[S(M(R(U)(`@WORKBENCH:重新生成`)),1)]),_:1})):r(``,!0),o(m,{onClick:k},{default:V(()=>[S(M(R(U)(`@WORKBENCH:取消`)),1)]),_:1}),o(m,{type:`primary`,disabled:!re.value,onClick:ue},{default:V(()=>[S(M(R(U)(`@WORKBENCH:确认入库`))+` (`+M(v.value.length)+`) `,1)]),_:1},8,[`disabled`])]),default:V(()=>[ie.value?(j(),b(`div`,W,[o(u,{class:`is-loading`},{default:V(()=>[o(R(D))]),_:1}),_(`span`,null,M(R(U)(`@WORKBENCH:AI 正在拆分…`)),1)])):s.value===`error`?(j(),b(`div`,Ce,[o(u,{color:`#f56c6c`},{default:V(()=>[o(R(p))]),_:1}),_(`span`,null,M(te.value),1)])):r(``,!0),o(T,{modelValue:c.value,"onUpdate:modelValue":i[3]||=e=>c.value=e,class:`ai-split-tabs`},{default:V(()=>[o(C,{label:R(U)(`@WORKBENCH:提示词`),name:`prompt`},{default:V(()=>[_(`div`,we,[o(m,{size:`small`,disabled:ie.value,onClick:B},{default:V(()=>[S(M(R(U)(`@WORKBENCH:编辑指令`)),1)]),_:1},8,[`disabled`])]),I.value?(j(),b(`div`,Te,[o(g,{modelValue:fe.value,"onUpdate:modelValue":i[0]||=e=>fe.value=e,type:`textarea`,rows:12,placeholder:R(U)(`@WORKBENCH:指令内容`)},null,8,[`modelValue`,`placeholder`]),_(`div`,Ee,[o(m,{size:`small`,onClick:me},{default:V(()=>[S(M(R(U)(`@WORKBENCH:取消`)),1)]),_:1}),o(m,{size:`small`,type:`primary`,loading:z.value,onClick:pe},{default:V(()=>[S(M(R(U)(`@WORKBENCH:保存并重跑`)),1)]),_:1},8,[`loading`])])])):(j(),b(`pre`,De,M(l.value||`(等待 LLM 启动…)`),1)),_(`h4`,Oe,M(R(U)(`@WORKBENCH:用户提示词(拼装后)`)),1),_(`pre`,ke,M(ee.value||`(等待 LLM 启动…)`),1)]),_:1},8,[`label`]),o(C,{name:`thinking`},{label:V(()=>[_(`span`,null,[S(M(R(U)(`@WORKBENCH:思考`))+` `,1),E.value>0?(j(),b(`span`,G,`(`+M(E.value)+`)`,1)):r(``,!0)])]),default:V(()=>[_(`pre`,K,M(d.value||R(U)(`@WORKBENCH:(暂无输出)`)),1)]),_:1}),o(C,{name:`raw`},{label:V(()=>[_(`span`,null,[S(M(R(U)(`@WORKBENCH:原始结果`))+` `,1),ne.value>0?(j(),b(`span`,q,`(`+M(ne.value)+`)`,1)):r(``,!0)])]),default:V(()=>[x.value&&s.value===`result`?(j(),H(w,{key:0,type:`warning`,"show-icon":``,closable:!1,class:`ai-split-parse-error`},{title:V(()=>[S(M(R(U)(`@WORKBENCH:模型返回内容解析失败,无法识别为有效的子任务 JSON`)),1)]),default:V(()=>[_(`div`,J,M(x.value),1),_(`div`,Ae,M(R(U)(`@WORKBENCH:常见原因:desc 内夹杂了 ASCII 双引号、出现尾随逗号,或输出被截断。可在下方文本框中手动修改后点「重新解析」,或重新生成。`)),1),_(`div`,je,[o(m,{size:`small`,type:`primary`,loading:de.value,onClick:P},{default:V(()=>[S(M(R(U)(`@WORKBENCH:重新解析`)),1)]),_:1},8,[`loading`]),o(m,{size:`small`,onClick:N},{default:V(()=>[S(M(R(U)(`@WORKBENCH:重新生成`)),1)]),_:1}),o(m,{size:`small`,onClick:i[1]||=e=>c.value=`prompt`},{default:V(()=>[S(M(R(U)(`@WORKBENCH:去编辑指令`)),1)]),_:1})])]),_:1})):r(``,!0),s.value===`result`||f.value?(j(),b(`div`,Y,[_(`span`,Me,M(R(U)(`@WORKBENCH:可直接编辑下方文本,修正后点「重新解析」即可入库`)),1),o(m,{size:`small`,type:`primary`,loading:de.value,disabled:!f.value.trim(),onClick:P},{default:V(()=>[S(M(R(U)(`@WORKBENCH:重新解析`)),1)]),_:1},8,[`loading`,`disabled`])])):r(``,!0),o(g,{modelValue:f.value,"onUpdate:modelValue":i[2]||=e=>f.value=e,type:`textarea`,rows:14,placeholder:R(U)(`@WORKBENCH:(暂无输出)`),readonly:ie.value,class:`ai-split-raw-editor`,resize:`none`},null,8,[`modelValue`,`placeholder`,`readonly`])]),_:1}),o(C,{name:`confirm`,disabled:v.value.length===0},{label:V(()=>[_(`span`,null,[S(M(R(U)(`@WORKBENCH:确认入库`))+` `,1),v.value.length>0?(j(),b(`span`,Ne,`(`+M(v.value.length)+`)`,1)):r(``,!0)])]),default:V(()=>[v.value.length===0?(j(),b(`div`,Pe,M(R(U)(`@WORKBENCH:(暂无子任务)`)),1)):(j(),b(`ul`,Fe,[(j(!0),b(h,null,F(v.value,(e,t)=>(j(),b(`li`,{key:t,class:`ai-split-list__item`},[_(`div`,Ie,M(t+1),1),_(`div`,X,[_(`div`,Z,M(e.title),1),_(`div`,Le,M(e.desc),1)])]))),128))]))]),_:1},8,[`disabled`])]),_:1},8,[`modelValue`]),x.value&&s.value===`result`&&v.value.length===0?(j(),b(`div`,Re,[o(u,{color:`#e6a23c`},{default:V(()=>[o(R(p))]),_:1}),_(`span`,null,M(R(U)(`@WORKBENCH:解析失败,未能从模型输出中提取出子任务 — 请查看「原始结果」`)),1)])):r(``,!0)]),_:1},8,[`model-value`,`title`,`close-on-press-escape`,`show-close`])}}}),[[`__scopeId`,`data-v-f8518258`]]),Be={class:`wb-attachments__head`},Ve={class:`wb-attachments__label`},He={class:`wb-attachments__count`},Ue=[`disabled`],We={key:0,class:`wb-attachments__paste-hint`},Ge={key:1,class:`wb-attachments__list`},Ke=[`title`,`onClick`],Q=[`src`,`alt`],qe={key:1},Je={class:`wb-attachment__meta`},Ye=[`title`],Xe={class:`wb-attachment__sub`},Ze=[`onClick`,`title`],Qe=B({__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,i=t,a=u(()=>n.attachments.filter(e=>n.isImage(e))),o=u(()=>a.value.map(e=>`/api/workbench/attachments/${e.id}/raw`)),c=A(0),l=A(!1);function ee(e){if(n.isImage(e)){let t=a.value.findIndex(t=>t.id===e.id);c.value=t>=0?t:0,l.value=!0}else window.open(`/api/workbench/attachments/${e.id}/raw`,`_blank`,`noopener`)}function d(){l.value=!1}return(t,n)=>(j(),b(h,null,[_(`div`,{class:P([`wb-attachments`,{"is-paste-hover":e.isPasteHover}]),onPaste:n[1]||=e=>i(`paste`,e),onDrop:n[2]||=f(e=>i(`drop`,e),[`prevent`]),onDragover:n[3]||=f(e=>i(`dragover`,e),[`prevent`]),onDragenter:n[4]||=f(e=>i(`dragenter`,e),[`prevent`]),onDragleave:n[5]||=e=>i(`dragleave`,e)},[_(`div`,Be,[_(`span`,Ve,[S(M(R(U)(`@WORKBENCH:附件`))+` `,1),_(`span`,He,M(e.attachments.length)+` / `+M(e.maxCount),1)]),_(`button`,{class:`wb-attachments__add wb-soft-btn`,disabled:e.isUploading||e.attachments.length>=e.maxCount,onClick:n[0]||=(...t)=>e.onPick&&e.onPick(...t)},M(e.isUploading?R(U)(`@WORKBENCH:上传中…`):R(U)(`@WORKBENCH:添加附件`)),9,Ue)]),e.isPasteHover?(j(),b(`div`,We,M(R(U)(`@WORKBENCH:粘贴图片以快速添加`)),1)):r(``,!0),e.attachments.length>0?(j(),b(`ul`,Ge,[(j(!0),b(h,null,F(e.attachments,t=>(j(),b(`li`,{key:t.id,class:`wb-attachment`},[_(`button`,{type:`button`,class:`wb-attachment__preview`,title:R(U)(`@WORKBENCH:点击预览`),onClick:e=>ee(t)},[_(`div`,{class:P([`wb-attachment__icon`,{"wb-attachment__icon--img":e.isImage(t)}])},[e.isImage(t)?(j(),b(`img`,{key:0,src:`/api/workbench/attachments/${t.id}/raw`,alt:t.originalName,loading:`lazy`},null,8,Q)):(j(),b(`span`,qe,M(t.ext.toUpperCase()),1))],2),_(`div`,Je,[_(`div`,{class:`wb-attachment__name`,title:t.originalName},M(t.originalName),9,Ye),_(`div`,Xe,M(e.humanSize(t.size))+` · `+M(t.mimeType),1)])],8,Ke),_(`button`,{class:`wb-attachment__del`,onClick:f(n=>e.onRemove(t),[`stop`]),title:R(U)(`@WORKBENCH:删除`)},`×`,8,Ze)]))),128))])):r(``,!0)],34),(j(),H(s,{to:`body`},[l.value&&o.value.length>0?(j(),H(R(E),{key:0,"url-list":o.value,"initial-index":c.value,"hide-on-click-modal":!0,onClose:d},null,8,[`url-list`,`initial-index`])):r(``,!0)]))],64))}}),$e=[`open`],et={class:`wb-log-summary`},tt={class:`wb-log-summary__left`},nt={key:0},rt={key:1},it={key:2},at={class:`wb-log-summary__right`},ot={class:`wb-log-summary__meta`},st=[`title`],ct={key:0,class:`wb-log-section`},lt={class:`wb-log-section__summary`},ut={class:`wb-log-section__tag wb-log-section__tag--user`},dt={class:`wb-log-section__count`},ft=[`title`],pt={class:`wb-log-section__pre wb-log-section__pre--user`},mt={key:1,class:`wb-log-section`},ht={class:`wb-log-section__summary`},gt={class:`wb-log-section__tag wb-log-section__tag--think`},_t={class:`wb-log-section__count`},vt=[`title`],yt={class:`wb-log-section__pre wb-log-section__pre--think`},bt={class:`wb-log-pre__head`},xt={class:`wb-log-pre__label`},St={class:`wb-log-pre__meta`},Ct=[`title`],wt=64*1024,Tt=xe(B({__name:`JobLogDetails`,props:{job:{}},setup(e){let t=e,n=u(()=>t.job.status===`running`||t.job.status===`pending`);function i(){let e=t.job.output||``;return e?e.length<=wt?e:`${U(`@WORKBENCH:…(前文已截断)`)}\n${e.slice(-65536)}`:``}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){m.warning(U(`@WORKBENCH:暂无内容可复制`));return}await a(n)?m.success(U(`@WORKBENCH:已复制到剪贴板`)):m.error(U(`@WORKBENCH:复制失败`))}async function s(){let e=[];if(t.job.prompt&&e.push(`## ${U(`@WORKBENCH:用户提示词`)}\n\n${t.job.prompt}`),t.job.thinking&&e.push(`## ${U(`@WORKBENCH:Claude 思考`)}\n\n${t.job.thinking}`),t.job.output&&e.push(`## ${U(`@WORKBENCH:模型返回`)}\n\n${t.job.output}`),!e.length){m.warning(U(`@WORKBENCH:暂无内容可复制`));return}await a(e.join(`
3
+
4
+ ---
5
+
6
+ `))?m.success(U(`@WORKBENCH:已复制到剪贴板`)):m.error(U(`@WORKBENCH:复制失败`))}let c=A(null);return L(()=>(t.job.output||``).length,async()=>{n.value&&(await w(),c.value&&(c.value.scrollTop=c.value.scrollHeight))}),(t,a)=>(j(),b(`details`,{class:`wb-log-details`,open:n.value},[_(`summary`,et,[_(`span`,tt,[e.job.status===`running`?(j(),b(`span`,nt,`● `+M(R(U)(`@WORKBENCH:正在执行…`)),1)):e.job.status===`pending`?(j(),b(`span`,rt,M(R(U)(`@WORKBENCH:排队中…`)),1)):(j(),b(`span`,it,M(R(U)(`@WORKBENCH:查看执行日志`)),1))]),_(`span`,at,[_(`span`,ot,M((e.job.output||``).length)+` `+M(R(U)(`@WORKBENCH:字符`)),1),_(`button`,{type:`button`,class:`wb-log-copy`,title:R(U)(`@WORKBENCH:复制全部(含提示词与输出)`),onClick:f(s,[`stop`])},` ⧉ `+M(R(U)(`@WORKBENCH:复制全部`)),9,st)])]),e.job.prompt?(j(),b(`details`,ct,[_(`summary`,lt,[_(`span`,ut,M(R(U)(`@WORKBENCH:用户提示词`)),1),_(`span`,dt,M((e.job.prompt||``).length)+` `+M(R(U)(`@WORKBENCH:字符`)),1),_(`button`,{type:`button`,class:`wb-log-copy wb-log-copy--sm`,title:R(U)(`@WORKBENCH:复制用户提示词`),onClick:a[0]||=f(e=>o(`prompt`),[`stop`])},` ⧉ `+M(R(U)(`@WORKBENCH:复制`)),9,ft)]),_(`pre`,pt,M(e.job.prompt),1)])):r(``,!0),e.job.thinking?(j(),b(`details`,mt,[_(`summary`,ht,[_(`span`,gt,M(R(U)(`@WORKBENCH:Claude 思考`)),1),_(`span`,_t,M((e.job.thinking||``).length)+` `+M(R(U)(`@WORKBENCH:字符`)),1),_(`button`,{type:`button`,class:`wb-log-copy wb-log-copy--sm`,title:R(U)(`@WORKBENCH:复制思考内容`),onClick:a[1]||=f(e=>o(`thinking`),[`stop`])},` ⧉ `+M(R(U)(`@WORKBENCH:复制`)),9,vt)]),_(`pre`,yt,M(e.job.thinking),1)])):r(``,!0),_(`div`,bt,[_(`span`,xt,M(R(U)(`@WORKBENCH:模型返回`)),1),_(`span`,St,M((e.job.output||``).length)+` `+M(R(U)(`@WORKBENCH:字符`)),1),_(`button`,{type:`button`,class:`wb-log-copy wb-log-copy--sm`,title:R(U)(`@WORKBENCH:复制模型返回`),onClick:a[2]||=f(e=>o(`output`),[`stop`])},` ⧉ `+M(R(U)(`@WORKBENCH:复制`)),9,Ct)]),_(`pre`,{ref_key:`preRef`,ref:c,class:`wb-log-pre`},M(i()||R(U)(`@WORKBENCH:(暂无输出)`)),513)],8,$e))}}),[[`__scopeId`,`data-v-ae32f993`]]);function Et(e){switch(e){case`todo`:return U(`@WORKBENCH:待执行`);case`running`:return U(`@WORKBENCH:执行中`);case`done`:return U(`@WORKBENCH:已完成`);case`error`:return U(`@WORKBENCH:出错`);case`cancelled`:return U(`@WORKBENCH:已取消`);case`pending`:return U(`@WORKBENCH:排队中`);default:return e}}function Dt(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 Ot={class:`exec-logs`},kt={class:`exec-logs__head`},At={class:`exec-logs__title-block`},jt={class:`exec-logs__title`},Mt={class:`exec-logs__stats`},Nt={class:`exec-logs__head-actions`},Pt={class:`exec-logs__config`},$={class:`exec-logs__config-label`},Ft={class:`exec-logs__config-field`},It={class:`exec-logs__config-name`},Lt={class:`exec-logs__config-field`},Rt={class:`exec-logs__config-name`},zt={class:`exec-logs__filter`},Bt={key:0,class:`exec-logs__batch-meta`},Vt={key:0,class:`exec-logs__batch`},Ht={class:`exec-logs__list`},Ut={key:0,class:`exec-logs__empty`},Wt={class:`exec-logs__empty-art`,"aria-hidden":`true`},Gt={class:`exec-logs__empty-title`},Kt={class:`exec-logs__empty-hint`},qt={class:`exec-card__head`},Jt=[`title`],Yt={class:`exec-card__meta`},Xt={key:0,class:`exec-card__task`},Zt={key:1,class:`exec-card__time`},Qt={key:2,class:`exec-card__exit`},$t=[`title`,`onClick`],en={key:0,class:`exec-card__error`},tn={key:1,class:`exec-logs__pager`},nn=50,rn=xe(B({__name:`ExecutionLogManager`,setup(e){function t(e){return e instanceof Error?e.message:String(e)}let n=A([]),i=A(0),s=ge({count:0,sizeMB:0,byStatus:{}}),c=A(!1),f=A(new Set),p=ge({q:``,status:``,page:1}),te=A({maxCount:500,maxSizeMB:256}),y=ge({maxCount:500,maxSizeMB:256}),x=A(!1),C=[{value:`pending`,label:U(`@WORKBENCH:排队中`)},{value:`running`,label:U(`@WORKBENCH:执行中`)},{value:`done`,label:U(`@WORKBENCH:已完成`)},{value:`error`,label:U(`@WORKBENCH:出错`)},{value:`cancelled`,label:U(`@WORKBENCH:已取消`)}],w=u(()=>n.value.length>0&&n.value.every(e=>f.value.has(e.id))),T=u(()=>n.value.some(e=>f.value.has(e.id))&&!w.value);async function E(){c.value=!0;try{let e=new URLSearchParams;p.q&&e.set(`q`,p.q),p.status&&e.set(`status`,p.status),e.set(`limit`,String(nn)),e.set(`offset`,String((p.page-1)*nn));let t=await fetch(`/api/workbench/jobs/list?${e.toString()}`).then(e=>e.json());if(!t.success)throw Error(t.error||`list failed`);n.value=t.jobs,i.value=t.total,s.count=t.stats.count,s.sizeMB=t.stats.sizeMB,s.byStatus=t.stats.byStatus;let r=new Set(n.value.map(e=>e.id));for(let e of Array.from(f.value))r.has(e)||f.value.delete(e)}catch(e){m.error(U(`@WORKBENCH:加载失败`)+`: `+t(e))}finally{c.value=!1}}async function ne(){try{let e=await fetch(`/api/workbench/jobs/config`).then(e=>e.json());e.success&&(te.value=e.config,y.maxCount=e.config.maxCount,y.maxSizeMB=e.config.maxSizeMB)}catch{}}async function D(){x.value=!0;try{let e=await fetch(`/api/workbench/jobs/config`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({maxCount:y.maxCount,maxSizeMB:y.maxSizeMB})}).then(e=>e.json());if(!e.success)throw Error(e.error||`save failed`);te.value=e.config,m.success(U(`@WORKBENCH:已保存策略`)),await E()}catch(e){m.error(U(`@WORKBENCH:保存失败`)+`: `+t(e))}finally{x.value=!1}}function re(){p.page=1,E()}function ie(){p.q=``,p.status=``,p.page=1,E()}function O(e,t){t?f.value.add(e):f.value.delete(e),f.value=new Set(f.value)}function ce(e){if(e)for(let e of n.value)f.value.add(e.id);else for(let e of n.value)f.value.delete(e.id);f.value=new Set(f.value)}async function le(e){try{await d.confirm(U(`@WORKBENCH:确定要删除所选的 {count} 条日志吗?`,{count:1}),U(`@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`);f.value.delete(e),f.value=new Set(f.value),await E()}catch(e){m.error(U(`@WORKBENCH:保存失败`)+`: `+t(e))}}async function ue(){let e=Array.from(f.value);if(e.length!==0){try{await d.confirm(U(`@WORKBENCH:确定要删除所选的 {count} 条日志吗?`,{count:e.length}),U(`@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`);m.success(U(`@WORKBENCH:成功删除 {count} 条`,{count:t.removed||e.length})),f.value=new Set,await E()}catch(e){m.error(U(`@WORKBENCH:保存失败`)+`: `+t(e))}}}async function N(){let e=s.count;if(e!==0){try{await d.confirm(U(`@WORKBENCH:确定要清空所有 {count} 条执行日志吗?此操作不可恢复。`,{count:e}),U(`@WORKBENCH:清空全部`),{type:`warning`,confirmButtonText:U(`@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`);m.success(U(`@WORKBENCH:成功删除 {count} 条`,{count:t.removed||e})),f.value=new Set,await E()}catch(e){m.error(U(`@WORKBENCH:保存失败`)+`: `+t(e))}}}function L(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 g(()=>{E(),ne()}),(e,t)=>{let u=ae,d=l,m=oe,g=de,te=_e,ne=me,A=ye,fe=z,B=a;return j(),b(`div`,Ot,[_(`header`,kt,[_(`div`,At,[_(`h2`,jt,M(R(U)(`@WORKBENCH:执行日志`)),1),_(`span`,Mt,M(R(U)(`@WORKBENCH:共 {count} 条,占 {size} MB`,{count:s.count,size:s.sizeMB})),1)]),_(`div`,Nt,[o(u,{icon:R(I),size:`small`,loading:c.value,onClick:E},{default:V(()=>[S(M(R(U)(`@WORKBENCH:刷新`)),1)]),_:1},8,[`icon`,`loading`]),o(u,{type:`danger`,plain:``,size:`small`,disabled:s.count===0,onClick:N},{default:V(()=>[S(M(R(U)(`@WORKBENCH:清空全部`)),1)]),_:1},8,[`disabled`])])]),_(`div`,Pt,[_(`span`,$,M(R(U)(`@WORKBENCH:保存策略`)),1),_(`span`,Ft,[_(`span`,It,M(R(U)(`@WORKBENCH:最大条数`)),1),o(d,{modelValue:y.maxCount,"onUpdate:modelValue":t[0]||=e=>y.maxCount=e,min:0,max:1e4,step:50,size:`small`,"controls-position":`right`,style:{width:`130px`}},null,8,[`modelValue`])]),_(`span`,Lt,[_(`span`,Rt,M(R(U)(`@WORKBENCH:最大体积 (MB)`)),1),o(d,{modelValue:y.maxSizeMB,"onUpdate:modelValue":t[1]||=e=>y.maxSizeMB=e,min:0,max:10240,step:32,size:`small`,"controls-position":`right`,style:{width:`140px`}},null,8,[`modelValue`])]),o(u,{type:`primary`,size:`small`,loading:x.value,onClick:D},{default:V(()=>[S(M(R(U)(`@WORKBENCH:保存策略`)),1)]),_:1},8,[`loading`])]),_(`div`,zt,[o(m,{modelValue:p.q,"onUpdate:modelValue":t[2]||=e=>p.q=e,placeholder:R(U)(`@WORKBENCH:搜索标题 / 任务`),clearable:``,size:`small`,style:{width:`240px`},onKeyup:ee(re,[`enter`]),onClear:re},null,8,[`modelValue`,`placeholder`]),o(te,{modelValue:p.status,"onUpdate:modelValue":t[3]||=e=>p.status=e,placeholder:R(U)(`@WORKBENCH:全部状态`),clearable:``,size:`small`,style:{width:`130px`},onChange:re},{default:V(()=>[(j(),b(h,null,F(C,e=>o(g,{key:e.value,label:e.label,value:e.value},null,8,[`label`,`value`])),64))]),_:1},8,[`modelValue`,`placeholder`]),o(u,{size:`small`,onClick:ie},{default:V(()=>[S(M(R(U)(`@WORKBENCH:重置`)),1)]),_:1}),t[5]||=_(`span`,{class:`exec-logs__filter-spacer`},null,-1),f.value.size>0?(j(),b(`span`,Bt,M(R(U)(`@WORKBENCH:已选择 {count} 项`,{count:f.value.size})),1)):r(``,!0)]),f.value.size>0?(j(),b(`div`,Vt,[o(ne,{"model-value":w.value,indeterminate:T.value,onChange:ce},{default:V(()=>[S(M(w.value?R(U)(`@WORKBENCH:取消全选`):R(U)(`@WORKBENCH:全选`)),1)]),_:1},8,[`model-value`,`indeterminate`]),o(u,{type:`danger`,size:`small`,onClick:ue},{default:V(()=>[S(M(R(U)(`@WORKBENCH:批量删除`)),1)]),_:1})])):r(``,!0),k((j(),b(`div`,Ht,[!c.value&&n.value.length===0?(j(),b(`div`,Ut,[_(`div`,Wt,[o(A,null,{default:V(()=>[o(R(v))]),_:1})]),_(`div`,Gt,M(R(U)(`@WORKBENCH:暂无执行日志`)),1),_(`div`,Kt,M(R(U)(`@WORKBENCH:点击「执行任务」开始一次执行,日志会出现在这里。`)),1)])):r(``,!0),(j(!0),b(h,null,F(n.value,e=>(j(),b(`article`,{key:e.id,class:P([`exec-card`,{"is-selected":f.value.has(e.id)}])},[_(`header`,qt,[o(ne,{"model-value":f.value.has(e.id),onChange:t=>O(e.id,t)},null,8,[`model-value`,`onChange`]),_(`span`,{class:`exec-card__status`,style:se({color:R(Dt)(e.status),borderColor:R(Dt)(e.status)})},M(R(Et)(e.status)),5),_(`span`,{class:`exec-card__title`,title:e.title||R(U)(`@WORKBENCH:无标题`)},M(e.title||R(U)(`@WORKBENCH:无标题`)),9,Jt),t[6]||=_(`span`,{class:`exec-card__spacer`},null,-1),_(`span`,Yt,[e.taskTitle?(j(),b(`span`,Xt,`📁 `+M(e.taskTitle),1)):r(``,!0),e.startedAt?(j(),b(`span`,Zt,`⏱ `+M(L(e.startedAt,e.endedAt)),1)):r(``,!0),e.exitCode===null?r(``,!0):(j(),b(`span`,Qt,`exit `+M(e.exitCode),1))]),_(`button`,{type:`button`,class:`exec-card__del`,title:R(U)(`@WORKBENCH:删除`),onClick:t=>le(e.id)},`×`,8,$t)]),e.error?(j(),b(`p`,en,`⚠ `+M(e.error),1)):r(``,!0),o(Tt,{job:e},null,8,[`job`])],2))),128))])),[[B,c.value]]),i.value>nn?(j(),b(`footer`,tn,[o(fe,{"current-page":p.page,"onUpdate:currentPage":t[4]||=e=>p.page=e,"page-size":nn,total:i.value,layout:`prev, pager, next, total`,background:``,small:``,onCurrentChange:E},null,8,[`current-page`,`total`])])):r(``,!0)])}}}),[[`__scopeId`,`data-v-13ab606e`]]),an={class:`workbench`},on={class:`wb-tabs`},sn={key:0,class:`workbench__editor-row`},cn={class:`wb-sidebar`},ln={class:`wb-section`},un={class:`wb-section__head`},dn={class:`wb-section__tag`},fn={class:`wb-section__title`},pn={class:`wb-pill wb-section__count`},mn={class:`wb-task-list`},hn=[`aria-expanded`,`title`,`onClick`,`onKeydown`],gn=[`title`],_n={class:`wb-pill wb-task-group__count`},vn=[`data-icon`,`onClick`],yn=[`data-icon`],bn={class:`wb-task-item__body`},xn=[`title`],Sn={class:`wb-task-item__meta`},Cn=[`title`],wn={class:`wb-pill wb-task-item__num`},Tn=[`title`],En={class:`wb-pill wb-task-item__num`},Dn=[`title`],On=[`title`,`aria-label`,`onClick`],kn=[`title`],An=[`onClick`,`title`,`aria-label`],jn={key:0,class:`wb-empty wb-empty--rich`},Mn={class:`wb-empty__art`,"aria-hidden":`true`},Nn={class:`wb-empty__title`},Pn={class:`wb-empty__hint`},Fn={class:`wb-empty__cta`},In={class:`wb-section`},Ln={class:`wb-section__head`},Rn={class:`wb-section__tag wb-section__tag--accent`},zn={class:`wb-section__title`},Bn={class:`wb-pill wb-section__count`},Vn=[`title`,`aria-label`],Hn={class:`wb-prompt-list`},Un={class:`wb-prompt-item__icon`},Wn=[`onClick`,`title`],Gn=[`title`],Kn=[`onClick`,`title`,`aria-label`],qn={key:0,class:`wb-empty wb-empty--compact`},Jn={class:`wb-split`},Yn={key:0,class:`wb-placeholder`},Xn={class:`wb-split__header`},Zn=[`placeholder`],Qn=[`title`],$n={key:0,class:`wb-meta-save__dot`},er={key:1,class:`wb-meta-save__check`},tr={key:2,class:`wb-meta-save__bang`},nr={key:3,class:`wb-meta-save__dot`},rr={value:null},ir=[`value`],ar=[`placeholder`],or={class:`wb-execution-body`},sr={class:`wb-exec-list`},cr={class:`wb-exec-list__header`},lr={class:`wb-exec-list__title`},ur={class:`wb-split__sub-actions`},dr={key:0,class:`wb-dirty-badge`},fr={class:`wb-exec-sub-list`},pr=[`onClick`],mr={class:`wb-exec-sub-item__row1`},hr=[`title`],gr={key:0,class:`wb-exec-sub-item__dirty-dot`,title:`未保存`},_r={class:`wb-exec-sub-item__row2`},vr={key:0,class:`wb-sub-item__pid`},yr={class:`wb-exec-sub-item__actions`},br=[`title`,`onClick`],xr=[`title`,`onClick`],Sr=[`title`,`disabled`,`onClick`],Cr=[`title`,`disabled`,`onClick`],wr={key:0,class:`wb-empty wb-empty--rich`},Tr={class:`wb-empty__art`,"aria-hidden":`true`},Er={class:`wb-empty__title`},Dr={class:`wb-empty__hint`},Or={class:`wb-empty__cta`},kr=[`disabled`],Ar={class:`wb-exec-list__header`},jr={class:`wb-exec-list__title`},Mr={class:`wb-simple__hint`},Nr={class:`wb-exec-sub-list`},Pr=[`title`],Fr={key:0,class:`wb-simple__meta`},Ir={class:`wb-exec-detail`},Lr={key:0,class:`wb-placeholder`},Rr={class:`wb-exec-detail__head`},zr=[`placeholder`],Br=[`title`],Vr=[`placeholder`],Hr={class:`wb-simple__status-row`},Ur=[`title`],Wr={class:`wb-simple__status-text`},Gr={key:0,class:`wb-simple__meta`},Kr=[`title`],qr={class:`wb-form-item__label wb-simple__override-summary`},Jr=[`title`],Yr=[`placeholder`],Xr={style:{display:`flex`,gap:`8px`,"align-items":`center`}},Zr=`__simple`,Qr=`__no_project__`,$r=`.png,.jpg,.jpeg,.gif,.webp,.bmp,.svg,.pdf,.txt,.md,.csv,.json,.log`,ei=5*1024*1024,ti=xe(B({__name:`WorkbenchView`,setup(n){let a=A([]),s=A([]),l=A([]),p=A(`editor`),y=A(null),w=u(()=>s.value.find(e=>e.id===y.value)||null),E=u(()=>w.value?.type===`simple`),D=A(null),O=u(()=>!w.value||E.value||!D.value?null:w.value.subtasks.find(e=>e.id===D.value)||null),I=A(new Map),z=A({title:``,desc:``,promptId:null,simpleOverride:``});function B(){let e=new Map;if(w.value)for(let t of w.value.subtasks)e.set(t.id,{id:t.id,title:t.title,desc:t.desc,promptOverride:t.promptOverride});I.value=e,w.value?z.value={title:w.value.title,desc:w.value.desc,promptId:w.value.promptId,simpleOverride:w.value.simpleOverride||``}:z.value={title:``,desc:``,promptId:null,simpleOverride:``}}let me=u(()=>{let e=new Set;if(!w.value)return e;for(let t of w.value.subtasks){let n=I.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}),xe=u(()=>me.value.size>0),W=A(`idle`),Ce=A(0),we=null,Te=u(()=>{if(!w.value)return!1;let e=w.value;return z.value.title!==e.title||z.value.desc!==e.desc||z.value.promptId!==e.promptId||z.value.simpleOverride!==(e.simpleOverride||``)});function Ee(){we!==null&&(clearTimeout(we),we=null)}async function De(){if(!w.value)return!1;if(!Te.value)return!0;if(W.value=`saving`,await yt(!1))return Ce.value=Date.now(),W.value=`saved`,setTimeout(()=>{W.value===`saved`&&Date.now()-Ce.value>=4e3&&(W.value=`idle`)},4e3),!0;W.value=`error`;let e=Date.now();return setTimeout(()=>{W.value===`error`&&Date.now()-e>=4e3&&(W.value=`idle`)},4e3),!1}L(()=>w.value?{id:w.value.id,title:w.value.title,desc:w.value.desc,promptId:w.value.promptId,simpleOverride:w.value.simpleOverride||``}:null,(e,t)=>{!e||!t||e.id!==t.id||(we!==null&&clearTimeout(we),we=window.setTimeout(()=>{De()},1500))},{deep:!0}),L(y,async(e,t)=>{Ee(),w.value&&Te.value&&await De()}),L(y,()=>{xt.value=!1});function Oe(e){try{let t=new Blob([JSON.stringify(e)],{type:`application/json`});navigator.sendBeacon?.(`/api/workbench/tasks`,t)}catch{}}function ke(){w.value&&Te.value&&Oe(w.value)}let G=ge({visible:!1,editing:null,name:``,content:``,aiLoading:!1}),K=ge({visible:!1,text:``,loading:!1,saving:!1}),q=ge({visible:!1,editing:null,title:``,desc:``,promptId:null,type:`complex`,simpleOverride:``}),J=null,Ae=Se();function je(){Ae.setRunning(l.value.filter(e=>e.status===`running`).length)}function Y(e){return l.value.find(t=>t.subId===e)||null}function Me(e,t){if(e===`hello`){l.value=t.jobs||[],je();return}if(e===`job:update`){let e=t,n=l.value.findIndex(t=>t.id===e.id);n>=0?l.value[n]=e:l.value.push(e),je();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=l.value.findIndex(e=>e.id===t.id);if(i<0)return;let a=l.value[i][n]||``;l.value[i][n]=a+r;return}if(e===`sub:update`){let e=s.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=s.value.findIndex(e=>e.id===t.id);e>=0&&(s.value[e]=t)}e===`task:error`&&m.error(t.error||U(`@WORKBENCH:执行出错`))}let Ne=[{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 Pe(e){let t=(e||``).trim();if(!t)return`doc`;for(let e of Ne)if(e.patterns.some(e=>e.test(t)))return e.key;return`doc`}let Fe={icon:N(v),image:N(pe),test:N(x),ui:N(e),doc:N(v),idea:N(e)};function Ie(e){return Fe[Pe(e.title)]}function X(e){return e?Y(`${e.id}${Zr}`):null}function Z(e){return e?e.status===`pending`||e.status===`running`?`running`:e.status===`done`?`done`:e.status===`cancelled`?`cancelled`:`error`:`idle`}function Le(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 Re(e){switch(e){case`idle`:return U(`@WORKBENCH:尚未执行`);case`running`:return U(`@WORKBENCH:正在执行…`);case`done`:return U(`@WORKBENCH:已完成`);case`error`:return U(`@WORKBENCH:执行失败`);case`cancelled`:return U(`@WORKBENCH:已停止`)}}function Be(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 Ve(e){return Array.isArray(e.attachments)?e.attachments.length:0}function He(e){return Array.isArray(e.subtasks)?e.subtasks.length:0}function Ue(e){return Array.isArray(e.subtasks)?e.subtasks.filter(e=>e&&e.status===`done`).length:0}function We(e){return Array.isArray(e.subtasks)?e.subtasks.some(e=>e&&e.status===`running`):!1}async function Ge(){a.value=(await fetch(`/api/workbench/prompts`).then(e=>e.json()).catch(()=>({prompts:[]}))).prompts||[]}async function Ke(){s.value=(await fetch(`/api/workbench/tasks`).then(e=>e.json()).catch(()=>({tasks:[]}))).tasks||[],!y.value&&s.value.length>0&&(y.value=s.value[0].id),B()}let Q=A({path:``,name:``});async function qe(){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 Je=A(new Set);function Ye(e){return Je.value.has(e)}function Xe(e){Je.value.has(e)?Je.value.delete(e):Je.value.add(e),Je.value=new Set(Je.value)}let Ze=u(()=>{let e=s.value,t=new Map;for(let n of e){let e=(n.projectPath||``).trim()||Qr;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===Qr?1:t===Qr?-1:e.localeCompare(t));return{groups:r.map(e=>({path:e,label:e===Qr?U(`@WORKBENCH:未关联项目`):e,tasks:t.get(e)})),hasMultiple:r.length>1}});function $e(e){if(!e||e===Qr)return e;let t=e.split(/[\\/]/).filter(Boolean);return t.length<=1?e:t.slice(-2).join(`/`)}L(()=>Ze.value.groups.map(e=>e.path),e=>{let t=Q.value.path,n=new Set(Je.value),r=!1;for(let i of e)i!==t&&!n.has(i)&&(n.add(i),r=!0);r&&(Je.value=n)},{immediate:!0});async function et(){l.value=(await fetch(`/api/workbench/jobs`).then(e=>e.json()).catch(()=>({jobs:[]}))).jobs||[],je()}function tt(){J&&=(J.close(),null),J=new EventSource(`/api/workbench/events`),J.onmessage=e=>{try{let t=JSON.parse(e.data);Me(t.event,t.payload)}catch{}},J.onerror=()=>{J&&=(J.close(),null),setTimeout(tt,3e3)}}function nt(){G.editing=null,G.name=``,G.content=``,G.aiLoading=!1,G.visible=!0}function rt(e){G.editing=e,G.name=e.name,G.content=e.content,G.aiLoading=!1,G.visible=!0}async function it(){if(!G.aiLoading){G.aiLoading=!0;try{let e=await fetch(`/api/workbench/prompts/ai-generate`,{method:`POST`}).then(e=>e.json());e.success?(G.name=e.name||G.name,G.content=e.result||``,m.success(U(`@WORKBENCH:已生成,可继续编辑`))):m.error(e.error||U(`@WORKBENCH:生成失败`))}catch(e){m.error(U(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}finally{G.aiLoading=!1}}}async function at(){K.visible=!0,K.loading=!0;try{let e=await fetch(`/api/workbench/prompts/ai-instruction`).then(e=>e.json());e.success?K.text=e.instruction||``:m.error(e.error||U(`@WORKBENCH:读取指令失败`))}catch(e){m.error(U(`@WORKBENCH:读取指令失败`)+`: `+(e&&e.message||e))}finally{K.loading=!1}}async function ot(){if(!K.text.trim()){m.warning(U(`@WORKBENCH:指令内容不能为空`));return}K.saving=!0;try{let e=await fetch(`/api/workbench/prompts/ai-instruction`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({instruction:K.text})}).then(e=>e.json());e.success?(m.success(U(`@WORKBENCH:已保存指令`)),K.visible=!1):m.error(e.error||U(`@WORKBENCH:保存失败`))}catch(e){m.error(U(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}finally{K.saving=!1}}async function st(){if(!G.name.trim()||!G.content.trim()){m.warning(U(`@WORKBENCH:名称和内容不能为空`));return}let e={id:G.editing?.id,name:G.name.trim(),content:G.content},t=await fetch(`/api/workbench/prompts`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}).then(e=>e.json());t.success?(m.success(U(`@WORKBENCH:已保存`)),G.visible=!1,Ge()):m.error(t.error||U(`@WORKBENCH:保存失败`))}async function ct(e){await d.confirm(U(`@WORKBENCH:删除提示词「{name}」?`,{name:e.name}),U(`@WORKBENCH:确认`),{type:`warning`}),await fetch(`/api/workbench/prompts/${e.id}`,{method:`DELETE`}),Ge();for(let t of s.value)t.promptId===e.id&&(t.promptId=null,await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}));Ke()}function lt(){q.editing=null,q.title=``,q.desc=``,q.promptId=null,q.type=`complex`,q.simpleOverride=``,q.visible=!0}async function ut(){let e={id:q.editing?.id,title:q.title.trim(),desc:q.desc,promptId:q.promptId,type:q.type,simpleOverride:q.type===`simple`?q.simpleOverride:``,subtasks:q.editing?.subtasks||[]};!q.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){m.success(U(`@WORKBENCH:已保存`));let e=!q.editing?.id;q.visible=!1,await Ke(),e&&t.task?.id?(y.value=t.task.id,B()):y.value||=t.task.id}else m.error(t.error||U(`@WORKBENCH:保存失败`))}async function dt(e){let t=e.type===`simple`?`complex`:`simple`,n=e.type===`complex`&&t===`simple`&&(e.subtasks?.length??0)>0;if(n)try{await d.confirm(U(`@WORKBENCH:任务「{title}」当前有 {n} 个子任务,切换为简单任务后会清空这些子任务,确认继续?`,{title:e.title,n:e.subtasks.length}),U(`@WORKBENCH:切换任务类型`),{type:`warning`,confirmButtonText:U(`@WORKBENCH:切换并清空`),cancelButtonText:U(`@WORKBENCH:取消`)})}catch{return}let r={id:e.id,title:e.title,desc:e.desc,promptId:e.promptId,type:t,simpleOverride:e.simpleOverride||``,subtasks:n?[]:e.subtasks||[]},i=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(r)}).then(e=>e.json());if(!i.success){m.error(i.error||U(`@WORKBENCH:保存失败`));return}await Ke(),m.success(U(t===`simple`?`@WORKBENCH:已切换为简单任务`:`@WORKBENCH:已切换为复杂任务`))}async function ft(e){await d.confirm(U(`@WORKBENCH:删除任务「{title}」及其所有子任务?`,{title:e.title}),U(`@WORKBENCH:确认`),{type:`warning`}),await fetch(`/api/workbench/tasks/${e.id}`,{method:`DELETE`}),y.value===e.id&&(y.value=null),Ke()}async function pt(e){y.value!==e.id&&(Ee(),w.value&&Te.value&&await De(),y.value=e.id,B())}L(()=>w.value,e=>{if(!e||e.type===`simple`){D.value=null;return}D.value=e.subtasks.find(e=>e.status===`running`)?.id||e.subtasks[0]?.id||null},{immediate:!0}),L(()=>w.value?.subtasks?.length,()=>{!w.value||E.value||(!D.value||!w.value.subtasks.find(e=>e.id===D.value))&&(D.value=w.value.subtasks[0]?.id||null)});let mt=A(new Set);function ht(e){return mt.value.has(e)}function gt(e,t){t?mt.value.add(e):mt.value.delete(e),mt.value=new Set(mt.value)}async function _t(){if(!w.value)return;let e={id:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`,title:U(`@WORKBENCH:新子任务`),desc:``,status:`todo`,promptOverride:``};w.value.subtasks.push(e),gt(e.id,!0);try{await yt(!1)}finally{gt(e.id,!1)}}async function vt(e){if(w.value){w.value.subtasks=w.value.subtasks.filter(t=>t.id!==e.id),gt(e.id,!0);try{await yt(!1)}finally{gt(e.id,!1)}}}async function yt(e){if(!w.value)return!1;let t=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(w.value)}).then(e=>e.json());return t.success?(e&&m.success(U(`@WORKBENCH:已保存拆分`)),await Ke(),!0):(m.error(t.error||U(`@WORKBENCH:保存失败`)),!1)}async function bt(){await yt(!0)}let xt=A(!1);function St(){if(w.value){if(!(w.value.title||``).trim()){m.warning(U(`@WORKBENCH:请先填写任务标题`));return}xt.value=!0}}function Ct(e){if(w.value){for(let t of e)w.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:[]});m.success(U(`@WORKBENCH:已生成 {n} 个子任务,请审阅后保存`,{n:e.length}))}}async function wt(e){if(e.type===`simple`)return Ot(e);if(!e.subtasks||e.subtasks.length===0){m.warning(U(`@WORKBENCH:请先拆分任务`));return}if(w.value&&w.value.id===e.id){let t=s.value.find(t=>t.id===e.id);if((!t||t.title!==w.value.title||t.desc!==w.value.desc||JSON.stringify(t.subtasks)!==JSON.stringify(w.value.subtasks)||t.promptId!==w.value.promptId)&&!await yt(!1))return}let t=await fetch(`/api/workbench/tasks/${e.id}/run`,{method:`POST`}).then(e=>e.json());t.success?m.success(t.message||U(`@WORKBENCH:已加入执行队列`)):m.error(t.error||U(`@WORKBENCH:执行失败`))}async function Ot(e){if(w.value&&w.value.id===e.id){let t=s.value.find(t=>t.id===e.id);if((!t||t.title!==w.value.title||t.desc!==w.value.desc||t.promptId!==w.value.promptId||(t.simpleOverride||``)!==(w.value.simpleOverride||``))&&!await yt(!1))return}let t=await fetch(`/api/workbench/tasks/${e.id}/run-simple`,{method:`POST`}).then(e=>e.json());t.success?m.success(t.message||U(`@WORKBENCH:已加入执行队列`)):m.error(t.error||U(`@WORKBENCH:执行失败`))}async function kt(e){if(!w.value)return;let t=w.value,n=Y(e.id);if(n&&(n.status===`running`||n.status===`pending`)){m.warning(U(`@WORKBENCH:该子任务正在执行中`));return}let r=s.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 yt(!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?m.success(i.message||U(`@WORKBENCH:已开始执行子任务`)):m.error(i.error||U(`@WORKBENCH:执行失败`))}function At(e){if(e.status===`done`)return!1;let t=Y(e.id);return!(t&&(t.status===`running`||t.status===`pending`))}async function jt(e){if(w.value&&!ht(e.id)){gt(e.id,!0);try{let t=I.value.get(e.id);t&&I.value.set(e.id,{...t,status:`todo`}),e.status=`todo`,await yt(!1)}finally{gt(e.id,!1)}}}async function Mt(e){try{await d.confirm(U(`@WORKBENCH:确认停止执行?已输出的内容会保留。`),U(`@WORKBENCH:停止执行`),{confirmButtonText:U(`@WORKBENCH:停止`),cancelButtonText:U(`@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?m.success(U(`@WORKBENCH:已发送停止信号`)):m.error(t.error||U(`@WORKBENCH:停止失败`))}g(async()=>{await Promise.all([Ge(),Ke(),qe(),et()]),tt(),window.addEventListener(`beforeunload`,ke)}),ne(()=>{J&&=(J.close(),null),window.removeEventListener(`beforeunload`,ke),w.value&&Te.value&&Oe(w.value)});let Nt=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`]),Pt=A({}),$=A(null);function Ft(e){return!!Pt.value[e]}function It(e,t){if(e instanceof File)return e;let n=e.type||`application/octet-stream`;return new File([e],t,{type:n})}function Lt(e){return e.kind===`task`?`task-${e.task?.id??``}`:`sub-${e.sub.id}`}function Rt(e){let t=e.kind===`task`?e.task?.attachments:e.sub.attachments;return Array.isArray(t)?t:[]}function zt(e,t){e.kind===`task`?e.task&&(e.task.attachments=t):e.sub.attachments=t}function Bt(e){return e.kind===`task`?`/api/workbench/tasks/${e.task?.id??``}/attachments`:`/api/workbench/subtasks/${e.sub.id}/attachments`}function Vt(e,t){return e.kind===`task`?`/api/workbench/tasks/${e.task?.id??``}/attachments/${t}`:`/api/workbench/subtasks/${e.sub.id}/attachments/${t}`}function Ht(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`);Wt(t,It(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&&Wt(t,It(n,n.name||`pasted-file`))}}}function Ut(e,t){$.value=null,Array.from(e.dataTransfer?.files||[]).forEach(e=>Wt(t,e))}async function Wt(e,t){if(t.size>ei){m.error(`「${t.name}」${U(`@WORKBENCH:超过 5MB 限制`)}`);return}if(!Nt.has(t.type)&&!t.name.match(/\.(png|jpg|jpeg|gif|webp|bmp|svg|pdf|txt|md|markdown|csv|json|log)$/i)){m.error(`${U(`@WORKBENCH:不支持的文件类型`)}(${t.name})`);return}let n=Rt(e);if(n.length>=9){m.error(U(`@WORKBENCH:单个任务最多 9 个附件`));return}if(n.find(e=>e.originalName===t.name&&e.size===t.size)){m.info(`${t.name} ${U(`@WORKBENCH:已存在,已复用`)}`);return}let r=Lt(e);Pt.value[r]=!0;try{let n=await fetch(Bt(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=Rt(e);r.push(n.attachment),zt(e,r),m.success(`${U(`@WORKBENCH:已添加:`)}${t.name}`)}else m.error(n.error||U(`@WORKBENCH:上传失败`))}catch(e){m.error(U(`@WORKBENCH:上传失败`)+`:`+(e&&e.message||e))}finally{Pt.value[r]=!1}}async function Gt(e,t){try{await d.confirm(U(`@WORKBENCH:删除附件「{name}」?`,{name:t.originalName}),U(`@WORKBENCH:确认`),{type:`warning`})}catch{return}let n=await fetch(Vt(e,t.id),{method:`DELETE`}).then(e=>e.json());n.success?(zt(e,Rt(e).filter(e=>e.id!==t.id)),m.success(U(`@WORKBENCH:已删除`))):m.error(n.error||U(`@WORKBENCH:删除失败`))}function Kt(e){let t=document.createElement(`input`);t.type=`file`,t.accept=$r,t.multiple=!0,t.onchange=()=>{Array.from(t.files||[]).forEach(t=>Wt(e,t))},t.click()}let qt=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`bmp`,`svg`]);function Jt(e){return qt.has(String(e.ext||``).toLowerCase())}function Yt(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(2)} MB`}return(n,l)=>{let u=ye,d=ae,m=oe,g=be,v=ve,x=he,ne=ie,A=fe,N=de,I=_e;return j(),b(`div`,an,[_(`header`,on,[_(`button`,{type:`button`,class:P([`wb-tab`,{"is-active":p.value===`editor`}]),onClick:l[0]||=e=>p.value=`editor`},M(R(U)(`@WORKBENCH:任务执行`)),3),_(`button`,{type:`button`,class:P([`wb-tab`,{"is-active":p.value===`logs`}]),onClick:l[1]||=e=>p.value=`logs`},M(R(U)(`@WORKBENCH:执行日志`)),3)]),p.value===`editor`?(j(),b(`div`,sn,[_(`aside`,cn,[_(`section`,ln,[_(`header`,un,[_(`span`,dn,M(R(U)(`@WORKBENCH:任务`)),1),_(`h3`,fn,M(R(U)(`@WORKBENCH:任务列表`)),1),_(`span`,pn,M(s.value.length),1)]),_(`button`,{class:`wb-new-btn`,onClick:lt},[o(u,{class:`wb-new-btn__icon`},{default:V(()=>[o(R(ce))]),_:1}),_(`span`,null,M(R(U)(`@WORKBENCH:新建任务`)),1),l[39]||=_(`span`,{class:`wb-new-btn__shortcut`},`N`,-1)]),_(`ul`,mn,[(j(!0),b(h,null,F(Ze.value.groups,t=>(j(),b(h,{key:t.path},[Ze.value.hasMultiple?(j(),b(`li`,{key:0,class:P([`wb-task-group__head`,{"is-current":t.path===Q.value.path,"is-collapsed":Ye(t.path)}]),role:`button`,tabindex:`0`,"aria-expanded":!Ye(t.path),title:Ye(t.path)?R(U)(`@WORKBENCH:展开`):R(U)(`@WORKBENCH:收起`),onClick:e=>Xe(t.path),onKeydown:[ee(f(e=>Xe(t.path),[`prevent`]),[`enter`]),ee(f(e=>Xe(t.path),[`prevent`]),[`space`])]},[o(u,{class:`wb-task-group__caret`},{default:V(()=>[(j(),H(re(Ye(t.path)?R(i):R(te))))]),_:2},1024),o(u,{class:`wb-task-group__icon`},{default:V(()=>[o(R(C))]),_:1}),_(`span`,{class:`wb-task-group__name`,title:t.path===Q.value.path?Q.value.path:t.label},M(t.path===Q.value.path?Q.value.name:$e(t.label)),9,gn),_(`span`,_n,M(t.tasks.length),1)],42,hn)):r(``,!0),Ye(t.path)?r(``,!0):(j(!0),b(h,{key:1},F(t.tasks,t=>(j(),b(`li`,{key:t.id,class:P([`wb-task-item`,{active:t.id===y.value,"has-attachment":Ve(t)>0,"is-other-project":t.projectPath&&t.projectPath!==Q.value.path,"is-running":We(t)}]),"data-icon":Pe(t.title),onClick:e=>pt(t)},[_(`div`,{class:`wb-task-item__avatar`,"data-icon":Pe(t.title)},[o(u,null,{default:V(()=>[(j(),H(re(Ie(t))))]),_:2},1024)],8,yn),_(`div`,bn,[_(`div`,{class:`wb-task-item__title`,title:t.title},M(t.title||R(U)(`@WORKBENCH:未命名任务`)),9,xn),_(`div`,Sn,[He(t)>0?(j(),b(`span`,{key:0,class:P([`wb-task-item__meta-item`,{"wb-task-item__meta-item--running":We(t)}]),title:R(U)(`@WORKBENCH:个子任务`)},[o(u,{class:`wb-task-item__meta-icon`},{default:V(()=>[o(R(T))]),_:1}),_(`span`,wn,M(Ue(t))+`/`+M(He(t)),1)],10,Cn)):r(``,!0),Ve(t)>0?(j(),b(`span`,{key:1,class:`wb-task-item__meta-item`,title:R(U)(`@WORKBENCH:附件`)},[o(u,{class:`wb-task-item__meta-icon`},{default:V(()=>[o(R(pe))]),_:1}),_(`span`,En,M(Ve(t)),1)],8,Tn)):r(``,!0),t.promptId?(j(),b(`span`,{key:2,class:`wb-task-item__meta-item wb-task-item__meta-item--accent`,title:R(U)(`@WORKBENCH:已绑定预置提示词`)},[o(u,{class:`wb-task-item__meta-icon`},{default:V(()=>[o(R(e))]),_:1})],8,Dn)):r(``,!0),_(`button`,{type:`button`,class:P([`wb-task-item__meta-item wb-task-item__type-toggle`,t.type===`simple`?`wb-task-item__meta-item--simple`:`wb-task-item__meta-item--complex`]),title:t.type===`simple`?R(U)(`@WORKBENCH:简单任务 - 点击切换为复杂任务`):R(U)(`@WORKBENCH:复杂任务 - 点击切换为简单任务`),"aria-label":t.type===`simple`?R(U)(`@WORKBENCH:切换为复杂任务`):R(U)(`@WORKBENCH:切换为简单任务`),onClick:f(e=>dt(t),[`stop`])},M(t.type===`simple`?R(U)(`@WORKBENCH:简单`):R(U)(`@WORKBENCH:复杂`)),11,On),t.projectPath&&t.projectPath!==Q.value.path?(j(),b(`span`,{key:3,class:`wb-task-item__meta-item wb-task-item__meta-item--project`,title:t.projectPath},M($e(t.projectPath)),9,kn)):r(``,!0)])]),_(`button`,{class:`wb-task-item__del`,onClick:f(e=>ft(t),[`stop`]),title:R(U)(`@WORKBENCH:删除`),"aria-label":R(U)(`@WORKBENCH:删除`)},[o(u,null,{default:V(()=>[o(R(le))]),_:1})],8,An)],10,vn))),128))],64))),128)),s.value.length===0?(j(),b(`li`,jn,[_(`div`,Mn,[o(u,null,{default:V(()=>[o(R(c))]),_:1})]),_(`div`,Nn,M(R(U)(`@WORKBENCH:暂无任务`)),1),_(`div`,Pn,M(R(U)(`@WORKBENCH:点击上方按钮新建`)),1),_(`div`,Fn,[o(d,{type:`primary`,size:`small`,icon:R(ce),onClick:lt},{default:V(()=>[S(M(R(U)(`@WORKBENCH:新建任务`)),1)]),_:1},8,[`icon`])])])):r(``,!0)])]),_(`section`,In,[_(`header`,Ln,[_(`span`,Rn,M(R(U)(`@WORKBENCH:提示`)),1),_(`h3`,zn,M(R(U)(`@WORKBENCH:预置提示词`)),1),_(`span`,Bn,M(a.value.length),1),_(`button`,{class:`wb-section__action`,onClick:nt,title:R(U)(`@WORKBENCH:新建提示词`),"aria-label":R(U)(`@WORKBENCH:新建提示词`)},[o(u,null,{default:V(()=>[o(R(ce))]),_:1})],8,Vn)]),_(`ul`,Hn,[(j(!0),b(h,null,F(a.value,t=>(j(),b(`li`,{key:t.id,class:`wb-prompt-item`},[_(`div`,Un,[o(u,null,{default:V(()=>[o(R(e))]),_:1})]),_(`span`,{class:`wb-prompt-item__name`,onClick:e=>rt(t),title:t.content},M(t.name),9,Wn),Q.value.name?(j(),b(`span`,{key:0,class:`wb-prompt-item__project`,title:R(U)(`@WORKBENCH:适用于当前项目`)+`:`+Q.value.path},M(Q.value.name),9,Gn)):r(``,!0),_(`button`,{class:`wb-prompt-item__del`,onClick:e=>ct(t),title:R(U)(`@WORKBENCH:删除`),"aria-label":R(U)(`@WORKBENCH:删除`)},[o(u,null,{default:V(()=>[o(R(le))]),_:1})],8,Kn)]))),128)),a.value.length===0?(j(),b(`li`,qn,M(R(U)(`@WORKBENCH:暂无提示词`)),1)):r(``,!0)])])]),_(`section`,Jn,[w.value?(j(),b(h,{key:1},[_(`div`,Xn,[k(_(`input`,{class:`wb-input wb-input--title`,"onUpdate:modelValue":l[2]||=e=>w.value.title=e,placeholder:R(U)(`@WORKBENCH:任务标题`)},null,8,Zn),[[t,w.value.title]]),W.value!==`idle`||Te.value?(j(),b(`span`,{key:0,class:P([`wb-meta-save`,{"is-saving":W.value===`saving`,"is-saved":W.value===`saved`,"is-error":W.value===`error`,"is-dirty":Te.value&&W.value===`idle`}]),title:W.value===`saving`?R(U)(`@WORKBENCH:保存中…`):W.value===`error`?R(U)(`@WORKBENCH:保存失败`):W.value===`saved`?R(U)(`@WORKBENCH:已保存`):``},[W.value===`saving`?(j(),b(`span`,$n)):W.value===`saved`?(j(),b(`span`,er,`✓`)):W.value===`error`?(j(),b(`span`,tr,`!`)):(j(),b(`span`,nr)),S(` `+M(W.value===`saving`?R(U)(`@WORKBENCH:保存中…`):W.value===`saved`?R(U)(`@WORKBENCH:已保存`):W.value===`error`?R(U)(`@WORKBENCH:保存失败`):R(U)(`@WORKBENCH:有未保存的更改`)),1)],10,Qn)):r(``,!0),k(_(`select`,{class:`wb-select`,"onUpdate:modelValue":l[3]||=e=>w.value.promptId=e},[_(`option`,rr,M(R(U)(`@WORKBENCH:不绑定预置提示词`)),1),(j(!0),b(h,null,F(a.value,e=>(j(),b(`option`,{key:e.id,value:e.id},M(e.name),9,ir))),128))],512),[[ue,w.value.promptId]]),E.value?r(``,!0):(j(),H(d,{key:1,type:`info`,plain:``,disabled:!w.value.title||!w.value.title.trim(),onClick:St},{default:V(()=>[S(M(R(U)(`@WORKBENCH:AI 拆分`)),1)]),_:1},8,[`disabled`])),o(d,{type:`primary`,loading:!1,onClick:l[4]||=e=>wt(w.value)},{default:V(()=>[S(M(E.value?R(U)(`@WORKBENCH:执行`):R(U)(`@WORKBENCH:执行任务`)),1)]),_:1})]),k(_(`textarea`,{class:`wb-textarea`,"onUpdate:modelValue":l[5]||=e=>w.value.desc=e,placeholder:R(U)(`@WORKBENCH:任务描述(可选)`),rows:`2`,onPaste:l[6]||=e=>Ht(e,{kind:`task`,task:w.value})},null,40,ar),[[t,w.value.desc]]),o(Qe,{attachments:w.value.attachments||[],"is-image":Jt,"human-size":Yt,"is-uploading":Ft(`task-`+w.value.id),"is-paste-hover":$.value===`task-`+w.value.id,"max-count":9,"on-pick":()=>Kt({kind:`task`,task:w.value}),"on-remove":e=>Gt({kind:`task`,task:w.value},e),onPaste:l[7]||=e=>Ht(e,{kind:`task`,task:w.value}),onDrop:l[8]||=f(e=>Ut(e,{kind:`task`,task:w.value}),[`prevent`]),onDragover:l[9]||=f(e=>$.value=`task-`+w.value.id,[`prevent`]),onDragenter:l[10]||=f(e=>$.value=`task-`+w.value.id,[`prevent`]),onDragleave:l[11]||=e=>$.value=$.value===`task-`+w.value.id?null:$.value},null,8,[`attachments`,`is-uploading`,`is-paste-hover`,`on-pick`,`on-remove`]),_(`div`,or,[_(`div`,sr,[E.value?(j(),b(h,{key:1},[_(`div`,Ar,[_(`h4`,jr,M(R(U)(`@WORKBENCH:简单任务`)),1),_(`span`,Mr,M(R(U)(`@WORKBENCH:无需拆分子任务;点执行后直接用上方描述驱动 Claude`)),1)]),_(`ul`,Nr,[_(`li`,{class:P([`wb-exec-sub-item is-selected`,{"is-running":Z(X(w.value))===`running`,"is-done":Z(X(w.value))===`done`}])},[_(`span`,{class:`wb-sub-item__status`,style:se({background:Le(Z(X(w.value)))})},[l[40]||=_(`span`,{class:`wb-simple__status-dot`,"aria-hidden":`true`},null,-1),S(` `+M(Re(Z(X(w.value)))),1)],4),_(`span`,{class:`wb-exec-sub-item__title`,title:w.value.title},M(w.value.title||R(U)(`@WORKBENCH:未命名任务`)),9,Pr),X(w.value)?.endedAt&&Z(X(w.value))===`done`?(j(),b(`span`,Fr,M(Be(X(w.value)?.endedAt)),1)):r(``,!0)],2)])],64)):(j(),b(h,{key:0},[_(`div`,cr,[_(`h4`,lr,M(R(U)(`@WORKBENCH:子任务拆分`)),1),_(`div`,ur,[o(d,{size:`small`,plain:``,icon:R(ce),disabled:w.value.subtasks.length===0,onClick:_t},{default:V(()=>[S(M(R(U)(`@WORKBENCH:添加子任务`)),1)]),_:1},8,[`icon`,`disabled`]),o(d,{size:`small`,type:xe.value?`primary`:`default`,disabled:w.value.subtasks.length===0,onClick:bt},{default:V(()=>[S(M(R(U)(`@WORKBENCH:保存拆分`))+` `,1),xe.value?(j(),b(`span`,dr,M(me.value.size),1)):r(``,!0)]),_:1},8,[`type`,`disabled`])])]),_(`ul`,fr,[(j(!0),b(h,null,F(w.value.subtasks,e=>(j(),b(`li`,{key:e.id,class:P([`wb-exec-sub-item`,{"is-selected":D.value===e.id,"is-running":e.status===`running`,"is-done":e.status===`done`,"is-dirty":me.value.has(e.id),"is-persisting":ht(e.id)}]),onClick:t=>D.value=e.id},[_(`div`,mr,[_(`span`,{class:`wb-sub-item__status`,style:se({background:R(Dt)(e.status)})},M(R(Et)(e.status)),5),_(`span`,{class:`wb-exec-sub-item__title`,title:e.title},M(e.title||R(U)(`@WORKBENCH:未命名子任务`)),9,hr),me.value.has(e.id)?(j(),b(`span`,gr)):r(``,!0)]),_(`div`,_r,[Y(e.id)?(j(),b(`span`,vr,`PID: `+M(Y(e.id)?.pid),1)):r(``,!0),_(`span`,yr,[At(e)?(j(),b(`button`,{key:0,class:`wb-exec-sub-btn wb-exec-sub-btn--run`,title:R(U)(`@WORKBENCH:单独执行此子任务`),onClick:f(t=>kt(e),[`stop`])},M(R(U)(`@WORKBENCH:执行`)),9,br)):r(``,!0),Y(e.id)&&(Y(e.id)?.status===`running`||Y(e.id)?.status===`pending`)?(j(),b(`button`,{key:1,class:`wb-exec-sub-btn wb-exec-sub-btn--stop`,title:R(U)(`@WORKBENCH:停止执行`),onClick:f(t=>Mt(Y(e.id)),[`stop`])},M(R(U)(`@WORKBENCH:停止`)),9,xr)):r(``,!0),e.status===`done`?(j(),b(`button`,{key:2,class:`wb-exec-sub-btn wb-exec-sub-btn--undo`,title:R(U)(`@WORKBENCH:取消完成`),disabled:ht(e.id),onClick:f(t=>jt(e),[`stop`])},M(R(U)(`@WORKBENCH:取消完成`)),9,Sr)):r(``,!0),_(`button`,{class:`wb-exec-sub-btn wb-exec-sub-btn--del`,title:R(U)(`@WORKBENCH:删除`),disabled:ht(e.id),onClick:f(t=>vt(e),[`stop`])},`×`,8,Cr)])])],10,pr))),128)),w.value.subtasks.length===0?(j(),b(`li`,wr,[_(`div`,Tr,[o(u,null,{default:V(()=>[o(R(T))]),_:1})]),_(`div`,Er,M(R(U)(`@WORKBENCH:拆分任务,逐项执行`)),1),_(`div`,Dr,M(R(U)(`@WORKBENCH:手动添加子任务,或让 AI 帮你自动拆分`)),1),_(`div`,Or,[o(d,{type:`primary`,size:`small`,icon:R(ce),onClick:_t},{default:V(()=>[S(M(R(U)(`@WORKBENCH:添加子任务`)),1)]),_:1},8,[`icon`]),_(`button`,{type:`button`,class:`wb-empty__link`,disabled:!w.value.title||!w.value.title.trim(),onClick:St},M(R(U)(`@WORKBENCH:用 AI 自动拆分`)),9,kr)])])):r(``,!0)])],64))]),_(`div`,Ir,[E.value?(j(),b(h,{key:1},[_(`div`,Hr,[_(`span`,{class:`wb-simple__status`,style:se({background:Le(Z(X(w.value)))}),title:R(U)(`@WORKBENCH:任务完成状态`)},[l[41]||=_(`span`,{class:`wb-simple__status-dot`,"aria-hidden":`true`},null,-1),_(`span`,Wr,M(Re(Z(X(w.value)))),1)],12,Ur),X(w.value)?.endedAt&&Z(X(w.value))===`done`?(j(),b(`span`,Gr,` · `+M(R(U)(`@WORKBENCH:完成时间`))+` `+M(Be(X(w.value)?.endedAt)),1)):X(w.value)?.error&&Z(X(w.value))===`error`?(j(),b(`span`,{key:1,class:`wb-simple__meta wb-simple__meta--error`,title:X(w.value)?.error||``},` — `+M(X(w.value)?.error),9,Kr)):r(``,!0)]),_(`details`,{class:P([`wb-simple__override`,{"has-content":!!(w.value.simpleOverride&&w.value.simpleOverride.trim())}])},[_(`summary`,qr,[o(u,{class:`wb-simple__override-caret`},{default:V(()=>[o(R(i))]),_:1}),_(`span`,null,M(R(U)(`@WORKBENCH:覆盖预置提示词(可选)`)),1),w.value.simpleOverride&&w.value.simpleOverride.trim()?(j(),b(`span`,{key:0,class:`wb-simple__override-tag`,title:R(U)(`@WORKBENCH:已填写覆盖内容`)},M(R(U)(`@WORKBENCH:已填写`)),9,Jr)):r(``,!0)]),k(_(`textarea`,{class:`wb-textarea`,"onUpdate:modelValue":l[22]||=e=>w.value.simpleOverride=e,placeholder:R(U)(`@WORKBENCH:留空则使用上方选定的「预置提示词」模板;可用变量同子任务:{{task.title}} {{task.desc}} {{repo.path}} {{branch}}`),rows:`6`},null,8,Yr),[[t,w.value.simpleOverride]])],2),Y(`${w.value.id}__simple`)?(j(),H(Tt,{key:0,job:Y(`${w.value.id}__simple`)},null,8,[`job`])):r(``,!0)],64)):(j(),b(h,{key:0},[O.value?(j(),b(h,{key:1},[_(`div`,Rr,[k(_(`input`,{class:`wb-input`,"onUpdate:modelValue":l[12]||=e=>O.value.title=e,placeholder:R(U)(`@WORKBENCH:子任务标题`),onClick:l[13]||=f(()=>{},[`stop`]),onPaste:l[14]||=e=>Ht(e,{kind:`sub`,task:w.value,sub:O.value})},null,40,zr),[[t,O.value.title]]),me.value.has(O.value.id)?(j(),b(`span`,{key:0,class:`wb-sub-item__dirty`,title:R(U)(`@WORKBENCH:有未保存的更改`)},M(R(U)(`@WORKBENCH:未保存`)),9,Br)):r(``,!0)]),k(_(`textarea`,{class:`wb-textarea wb-textarea--sm`,"onUpdate:modelValue":l[15]||=e=>O.value.desc=e,placeholder:R(U)(`@WORKBENCH:子任务描述 / 独立提示词覆盖`),rows:`3`,onPaste:l[16]||=e=>Ht(e,{kind:`sub`,task:w.value,sub:O.value})},null,40,Vr),[[t,O.value.desc]]),Y(O.value.id)?(j(),H(Tt,{key:0,job:Y(O.value.id)},null,8,[`job`])):r(``,!0),o(Qe,{attachments:O.value.attachments||[],"is-image":Jt,"human-size":Yt,"is-uploading":Ft(`sub-`+O.value.id),"is-paste-hover":$.value===O.value.id,"max-count":9,"on-pick":()=>Kt({kind:`sub`,task:w.value,sub:O.value}),"on-remove":e=>Gt({kind:`sub`,task:w.value,sub:O.value},e),onPaste:l[17]||=e=>Ht(e,{kind:`sub`,task:w.value,sub:O.value}),onDrop:l[18]||=f(e=>Ut(e,{kind:`sub`,task:w.value,sub:O.value}),[`prevent`]),onDragover:l[19]||=f(e=>$.value=O.value.id,[`prevent`]),onDragenter:l[20]||=f(e=>$.value=O.value.id,[`prevent`]),onDragleave:l[21]||=e=>$.value=$.value===O.value.id?null:$.value},null,8,[`attachments`,`is-uploading`,`is-paste-hover`,`on-pick`,`on-remove`])],64)):(j(),b(`div`,Lr,[_(`p`,null,M(w.value.subtasks.length===0?R(U)(`@WORKBENCH:手动添加子任务,或让 AI 帮你自动拆分`):R(U)(`@WORKBENCH:左侧选择子任务查看详情`)),1)]))],64))])])],64)):(j(),b(`div`,Yn,[_(`p`,null,M(R(U)(`@WORKBENCH:左侧选择任务,或新建一个任务开始`)),1)]))])])):(j(),H(rn,{key:1})),o(x,{modelValue:G.visible,"onUpdate:modelValue":l[26]||=e=>G.visible=e,title:G.editing?R(U)(`@WORKBENCH:编辑提示词`):R(U)(`@WORKBENCH:新建提示词`),width:`640px`},{footer:V(()=>[o(d,{onClick:l[25]||=e=>G.visible=!1},{default:V(()=>[S(M(R(U)(`@WORKBENCH:取消`)),1)]),_:1}),o(d,{type:`primary`,onClick:st},{default:V(()=>[S(M(R(U)(`@WORKBENCH:保存`)),1)]),_:1})]),default:V(()=>[o(v,{"label-position":`top`},{default:V(()=>[o(g,{label:R(U)(`@WORKBENCH:名称`)},{default:V(()=>[o(m,{modelValue:G.name,"onUpdate:modelValue":l[23]||=e=>G.name=e,placeholder:R(U)(`@WORKBENCH:如:代码审查 / 写测试`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`]),o(g,null,{default:V(()=>[_(`div`,Xr,[o(d,{type:`primary`,plain:``,loading:G.aiLoading,onClick:it},{default:V(()=>[S(M(R(U)(`@WORKBENCH:AI 生成项目架构说明`)),1)]),_:1},8,[`loading`]),o(d,{onClick:at},{default:V(()=>[S(M(R(U)(`@WORKBENCH:编辑指令`)),1)]),_:1})])]),_:1}),o(g,{label:R(U)(`@WORKBENCH:内容`)},{default:V(()=>[o(m,{modelValue:G.content,"onUpdate:modelValue":l[24]||=e=>G.content=e,type:`textarea`,rows:10,placeholder:R(U)(`@WORKBENCH:可用变量:`)+`{{task.title}} {{task.desc}} {{sub.title}} {{sub.desc}} {{repo.path}} {{branch}}`},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])]),_:1})]),_:1},8,[`modelValue`,`title`]),o(x,{modelValue:K.visible,"onUpdate:modelValue":l[29]||=e=>K.visible=e,title:R(U)(`@WORKBENCH:编辑生成指令`),width:`720px`,"append-to-body":``},{footer:V(()=>[o(d,{onClick:l[28]||=e=>K.visible=!1},{default:V(()=>[S(M(R(U)(`@WORKBENCH:取消`)),1)]),_:1}),o(d,{type:`primary`,loading:K.saving,onClick:ot},{default:V(()=>[S(M(R(U)(`@WORKBENCH:保存`)),1)]),_:1},8,[`loading`])]),default:V(()=>[o(v,{"label-position":`top`},{default:V(()=>[o(g,{label:R(U)(`@WORKBENCH:指令内容`)},{default:V(()=>[o(m,{modelValue:K.text,"onUpdate:modelValue":l[27]||=e=>K.text=e,type:`textarea`,rows:18,placeholder:R(U)(`@WORKBENCH:指令内容`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])]),_:1})]),_:1},8,[`modelValue`,`title`]),o(x,{modelValue:q.visible,"onUpdate:modelValue":l[37]||=e=>q.visible=e,title:q.editing?R(U)(`@WORKBENCH:编辑任务`):R(U)(`@WORKBENCH:新建任务`),width:`600px`},{footer:V(()=>[o(d,{onClick:l[36]||=e=>q.visible=!1},{default:V(()=>[S(M(R(U)(`@WORKBENCH:取消`)),1)]),_:1}),o(d,{type:`primary`,onClick:ut},{default:V(()=>[S(M(R(U)(`@WORKBENCH:保存`)),1)]),_:1})]),default:V(()=>[o(v,{"label-position":`top`},{default:V(()=>[o(g,{label:R(U)(`@WORKBENCH:标题`)},{default:V(()=>[o(m,{modelValue:q.title,"onUpdate:modelValue":l[30]||=e=>q.title=e},null,8,[`modelValue`])]),_:1},8,[`label`]),o(g,{label:R(U)(`@WORKBENCH:类型`)},{default:V(()=>[o(A,{modelValue:q.type,"onUpdate:modelValue":l[31]||=e=>q.type=e},{default:V(()=>[o(ne,{value:`complex`},{default:V(()=>[S(M(R(U)(`@WORKBENCH:复杂任务(需要拆分子任务)`)),1)]),_:1}),o(ne,{value:`simple`},{default:V(()=>[S(M(R(U)(`@WORKBENCH:简单任务(直接执行)`)),1)]),_:1})]),_:1},8,[`modelValue`])]),_:1},8,[`label`]),q.type===`simple`?(j(),H(g,{key:0,label:R(U)(`@WORKBENCH:描述`)},{default:V(()=>[o(m,{modelValue:q.desc,"onUpdate:modelValue":l[32]||=e=>q.desc=e,type:`textarea`,rows:4,placeholder:R(U)(`@WORKBENCH:把要做的事直接写在这里,执行时会把这段描述作为 prompt 喂给 Claude`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])):(j(),H(g,{key:1,label:R(U)(`@WORKBENCH:描述`)},{default:V(()=>[o(m,{modelValue:q.desc,"onUpdate:modelValue":l[33]||=e=>q.desc=e,type:`textarea`,rows:3},null,8,[`modelValue`])]),_:1},8,[`label`])),q.type===`simple`?(j(),H(g,{key:2,label:R(U)(`@WORKBENCH:覆盖预置提示词(可选)`)},{default:V(()=>[o(m,{modelValue:q.simpleOverride,"onUpdate:modelValue":l[34]||=e=>q.simpleOverride=e,type:`textarea`,rows:5,placeholder:R(U)(`@WORKBENCH:留空则使用「预置提示词」下拉里选定的模板;可用变量同子任务覆盖。`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])):r(``,!0),o(g,{label:R(U)(`@WORKBENCH:预置提示词`)},{default:V(()=>[o(I,{modelValue:q.promptId,"onUpdate:modelValue":l[35]||=e=>q.promptId=e,clearable:``,placeholder:R(U)(`@WORKBENCH:不绑定`),style:{width:`100%`}},{default:V(()=>[(j(!0),b(h,null,F(a.value,e=>(j(),H(N,{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`]),w.value?(j(),H(ze,{key:2,modelValue:xt.value,"onUpdate:modelValue":l[38]||=e=>xt.value=e,title:w.value.title,desc:w.value.desc,"task-id":w.value.id,"prompt-id":w.value.promptId,onConfirm:Ct},null,8,[`modelValue`,`title`,`desc`,`task-id`,`prompt-id`])):r(``,!0)])}}}),[[`__scopeId`,`data-v-fb5a3542`]]);export{ti as default};