zen-gitsync 2.13.9 → 2.13.11

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 (36) hide show
  1. package/README.md +34 -7
  2. package/package.json +2 -1
  3. package/scripts/dev-ping.cjs +61 -0
  4. package/src/ui/public/assets/EditorView-CdNgAtwl.js +0 -0
  5. package/src/ui/public/assets/{EditorView-Dvg7sMyU.css → EditorView-noBxnUk5.css} +1 -1
  6. package/src/ui/public/assets/SourceMapView-DsL2l02A.js +3 -0
  7. package/src/ui/public/assets/WorkbenchView-D0eGFIZx.js +6 -0
  8. package/src/ui/public/assets/WorkbenchView-DCGi3Ef1.css +1 -0
  9. package/src/ui/public/assets/__vite-optional-peer-dep_katex_markstream-vue-Bg9-FXxr.js +1 -0
  10. package/src/ui/public/assets/__vite-optional-peer-dep_mermaid_markstream-vue-cPZl55sA.js +1 -0
  11. package/src/ui/public/assets/__vite-optional-peer-dep_stream-markdown_markstream-vue-Dhgp-lRL.js +1 -0
  12. package/src/ui/public/assets/__vite-optional-peer-dep_stream-monaco_markstream-vue-Cr1d6De7.js +1 -0
  13. package/src/ui/public/assets/{_plugin-vue_export-helper-BMDM_R2D.js → _plugin-vue_export-helper-CNd9lWx2.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/d2_markstream-vue-xMoF3M5G.js +1 -0
  16. package/src/ui/public/assets/{html.worker-CQP8QQsS.js → html.worker-BO6WuOEO.js} +1 -1
  17. package/src/ui/public/assets/index-CrcxldZ2.css +1 -0
  18. package/src/ui/public/assets/index-DvRkCEGg.js +66 -0
  19. package/src/ui/public/assets/{json.worker-DzV-CpCQ.js → json.worker-BkJRGcCJ.js} +1 -1
  20. package/src/ui/public/assets/mhchem_markstream-vue-tp86PqxG.js +1 -0
  21. package/src/ui/public/assets/{ts.worker-Dth06zuC.js → ts.worker-B0J26iPs.js} +15 -15
  22. package/src/ui/public/assets/vendor-CgFFAa1w.js +1508 -0
  23. package/src/ui/public/assets/vendor-irUC_mD1.css +1 -0
  24. package/src/ui/public/index.html +6 -6
  25. package/src/ui/server/routes/npm.js +11 -0
  26. package/src/ui/server/routes/workbench.js +33 -3
  27. package/src/ui/public/assets/EditorView-eQBqgBEd.js +0 -0
  28. package/src/ui/public/assets/SourceMapView-BLkrjBFW.js +0 -3
  29. package/src/ui/public/assets/WorkbenchView-BMtAZx07.css +0 -1
  30. package/src/ui/public/assets/WorkbenchView-D2eEOP1R.js +0 -6
  31. package/src/ui/public/assets/index-BaFDF44N.js +0 -66
  32. package/src/ui/public/assets/index-BvzxdkDp.css +0 -1
  33. package/src/ui/public/assets/vendor-CDAfMQIV.js +0 -1343
  34. package/src/ui/public/assets/vendor-CIeR0bF6.css +0 -1
  35. /package/src/ui/public/assets/{editor.worker-Bd9IXS8d.js → editor.worker-Cn2oRESe.js} +0 -0
  36. /package/src/ui/public/assets/{rolldown-runtime-BM3Ffeng.js → rolldown-runtime-CMxvf4Kt.js} +0 -0
package/README.md CHANGED
@@ -244,19 +244,24 @@ A dedicated view (fourth icon in the activity bar) for batch-running Claude agai
244
244
 
245
245
  | Feature | Description |
246
246
  |---|---|
247
- | Task list | Create, edit, delete tasks; each shows its subtask count |
247
+ | Task list | Create, edit, delete tasks; each shows its subtask count; click the **Simple / Complex** badge on any task to flip its type in place (Complex → Simple with subtasks asks for confirmation and clears them; Simple → Complex is instant) |
248
+ | Top-bar type switch | A segmented control (Complex / Simple) lives in the task header, right next to **Run task**, so you can flip the current task's type without going back to the sidebar; the same confirmation rule (Complex → Simple with subtasks) applies |
249
+ | AI split (promoted) | The "AI split" action is now a dedicated accent button with a sparkle icon and a subtle pulse, sitting between the type switcher and the primary **Run task** button — it is always enabled for complex tasks with a non-empty title |
250
+ | Description collapsible by default | Selecting a task collapses the description + attachment area into a one-line summary "Task description (optional)" to free up vertical space; click the summary to expand. When the description is filled or attachments are present, an "Filled" badge and the attachment count appear on the right of the summary |
251
+ | Minimal task & chat layout | The task execution view is now stripped of redundant borders / shadows: a flatter sidebar, transparent title input and textarea, and a clean left/right execution body. Visual reference follows the Claude Code desktop app |
248
252
  | Subtask breakdown | Add / edit / remove subtasks per task, with per-subtask status; the empty state ships a centered illustration card with a primary "Add subtask" CTA and a secondary "Split with AI" shortcut |
249
- | Subtask attachments | Attach up to 9 files per subtask (image / PDF / text / Markdown / CSV / JSON / log, ≤ 5 MB each); their absolute paths are appended to the prompt so Claude reads them directly |
253
+ | Subtask attachments | Attach up to 9 files per subtask (image / PDF / text / Markdown / CSV / JSON / log, ≤ 5 MB each); their absolute paths are appended to the prompt so Claude reads them directly. Right-click an image attachment to copy it to the system clipboard (`image/png` / `jpeg` / `webp` / `gif`) |
250
254
  | Prompt presets | Reusable prompt templates with `{{task.title}}` / `{{task.desc}}` / `{{sub.title}}` / `{{sub.desc}}` / `{{repo.path}}` / `{{branch}}` variable interpolation |
251
255
  | AI prompt generation | "New / Edit preset" dialog has an **AI Generate** button — the server reads the current project tree (depth 2) + README + manifests (package.json / pyproject.toml / go.mod / Cargo.toml / …) and asks the configured LLM to draft a project-aware preset (name + body) |
252
256
  | Per-subtask override | Override the preset's content for a specific subtask in its description field |
253
257
  | Sequential execution | Runs subtasks in declared order; the next one starts only after the previous process exits |
254
258
  | Pipe-mode launcher | Spawns `claude -p "<prompt>" --output-format text --permission-mode bypassPermissions --dangerously-skip-permissions` with stdout/stderr piped to the server — no external terminal window is opened, so output streams directly into the UI |
255
259
  | Isolated windows | Every subtask runs as its own detached process with fresh context, so memory and conversation state never accumulate across subtasks |
256
- | Live log | Each running subtask has an expandable "执行日志 / Execution log" panel that auto-scrolls and shows accumulated `stdout` + `stderr` (capped at 256 KB server-side, last 64 KB rendered client-side) |
260
+ | Live log | Each subtask has a "执行日志 / Execution log" panel that **opens by default** and auto-scrolls, showing accumulated `stdout` + `stderr` (capped at 256 KB server-side, last 64 KB rendered client-side) |
257
261
  | Live status | Subtask status (todo / pending / running / done / error) and PID stream in real time over SSE |
258
262
  | Running animation | Subtasks in `running` state get a breathing primary-color glow + a sliding progress bar on top of the card; the status badge uses a shimmer gradient with a pulsing white dot and outer halo, easing back to neutral on completion |
259
263
  | Cross-view indicator | While any Workbench subtask is running, a pulsing dot appears on the Workbench icon in the Activity Bar so you can see job state from the Git or Editor view |
264
+ | Execution log manager (dialog) | The "Execution logs" button in the workbench top bar (replaces the previous standalone tab) opens a dialog with the list / filter / batch delete / clear / retention-policy UI; the task execution view stays mounted so no work-in-progress state is dropped |
260
265
 
261
266
  Prompt presets and tasks are persisted to `~/.zen-gitsync/prompts.json` and `~/.zen-gitsync/tasks.json` (cross-project, shared across repos).
262
267
 
@@ -275,6 +280,14 @@ Prompt presets and tasks are persisted to `~/.zen-gitsync/prompts.json` and `~/.
275
280
 
276
281
  ---
277
282
 
283
+ ### Self-Upgrade
284
+
285
+ The footer version chip in the GUI checks npm for newer releases once per session. When an update is available, a **Upgrade** button appears next to the version; clicking it streams `npm install -g zen-gitsync` output into a modal dialog. On success, the dialog switches to a "Restart and reload now" CTA that calls `POST /api/app-restart` (which gracefully exits the Node process — your launcher / desktop shell brings it back up) and then reloads the browser tab so the new SPA bundle takes effect. The footer version also updates instantly to the new number so you can see the bump even before restarting.
286
+
287
+ On macOS / Linux, the global install is run under `sudo -n` (non-interactive); if sudo can't authenticate non-interactively, re-launch the GUI with admin rights and try again.
288
+
289
+ ---
290
+
278
291
  ## Development Notes
279
292
 
280
293
  ### Line endings
@@ -624,21 +637,27 @@ Activity Bar 第四个视图,用于在当前仓库上批量调度 Claude:定
624
637
 
625
638
  | 功能 | 说明 |
626
639
  |---|---|
627
- | 任务列表 | 新建、编辑、删除任务;每条任务显示子任务数量;简单任务左侧带绿色「简单」徽标 |
640
+ | 任务列表 | 新建、编辑、删除任务;每条任务显示子任务数量;点击徽标可在「简单(绿色)/ 复杂(紫色)」间即时切换,复杂→简单且带子任务时弹窗确认并清空子任务 |
641
+ | 顶部类型切换器 | 任务头部增加 segmented control(复杂 / 简单),无需回到左侧即可切换当前任务类型;切换逻辑与左侧徽标共享,复杂→简单且带子任务时同样弹窗确认 |
642
+ | AI 拆分(升级) | AI 拆分升级为带 sparkle 图标 + 轻微 pulse 动效的 accent 按钮,位置紧贴主「执行任务」按钮;只要标题非空,复杂任务下始终可点 |
643
+ | 任务描述默认折叠 | 选中任务后默认仅显示一行「任务描述(可选)」摘要,节省首屏纵向空间;点击 summary 展开后即可看到描述输入框和附件区;已填写描述或挂有附件时摘要右侧会出现「已填写」徽标和附件数量 |
644
+ | 极简任务 / 对话样式 | 任务执行视图整体极简化:减少冗余边框与阴影、标题 / 描述输入框透明化、执行主体左右两段式分列;视觉参考 Claude Code 桌面版 |
645
+ | 执行中状态点 pill | 任务行 / 详情区 pill 退化为 8px 彩色圆点(无文字),running 时由外层行边框跑马灯 + 圆点呼吸两层动效传达"进行中",避免文字 pill 与动效叠加产生视觉歧义 |
628
646
  | 任务字段自动保存 | 标题 / 描述 / 预置提示词 / 简单任务覆盖 改动后 1.5s 防抖落盘,标题右侧显示「保存中 / 已保存 / 有未保存的更改」状态徽标;切换任务或关页面前自动 flush(含 `navigator.sendBeacon` 兜底) |
629
- | 简单任务 | 新建任务时选「简单(直接执行)」即跳过子任务拆分;执行时把 task.desc 拼成单 sub 走 `/tasks/:id/run-simple`;可填「覆盖预置提示词」独立覆写预置模板;主任务附件 + 描述 + 覆盖三者合并驱动 Claude |
647
+ | 简单任务 | 新建任务时选「简单(直接执行)」即跳过子任务拆分;执行时把 task.desc 拼成单 sub 走 `/tasks/:id/run-simple`;可填「覆盖预置提示词」独立覆写预置模板;主任务附件 + 描述 + 覆盖三者合并驱动 Claude;运行中详情区状态条末尾带「停止」按钮(带二次确认),与复杂任务子任务停止按钮对齐 |
630
648
  | 子任务拆分 | 增删改子任务,实时显示每个子任务的执行状态;空态提供居中插画卡片、主 CTA「添加子任务」与「用 AI 自动拆分」次级入口(仅复杂任务显示) |
631
- | 子任务附件 | 每个子任务最多挂 9 个附件(图片 / PDF / 文本 / Markdown / CSV / JSON / log,单个 ≤ 5 MB);同 `originalName + size` 已存在则直接复用,跳过重复上传;执行时绝对路径会自动追加到 prompt 末尾,Claude 直接按路径读取 |
649
+ | 子任务附件 | 每个子任务最多挂 9 个附件(图片 / PDF / 文本 / Markdown / CSV / JSON / log,单个 ≤ 5 MB);同 `originalName + size` 已存在则直接复用,跳过重复上传;执行时绝对路径会自动追加到 prompt 末尾,Claude 直接按路径读取。**右键图片附件可一键复制到系统剪贴板**(支持 png / jpeg / webp / gif) |
632
650
  | 提示词预置 | 可复用提示词模板,支持 `{{task.title}}` / `{{task.desc}}` / `{{sub.title}}` / `{{sub.desc}}` / `{{repo.path}}` / `{{branch}}` 变量插值 |
633
651
  | AI 生成预置 | 「新建 / 编辑预置」对话框内置 **AI 生成项目架构说明** 按钮 + **编辑指令** 按钮:服务端递归识别当前项目里的所有子项目(含 `.git` 或 9 种 manifest 之一的目录),为每个子项目独立读取关键文件(manifest 20 KB / README 8 KB / 2 层目录树),并发调 LLM 产出各子项目架构说明,多子项目场景再合并成一份整体说明;用户可点「编辑指令」自定义生成策略(持久化到 `~/.zen-gitsync/ai-instruction.json`);`max_tokens=4000`,单次请求最多 20 分钟 |
634
652
  | 子任务覆盖 | 在子任务描述框可独立覆盖预置提示词的内容 |
635
653
  | 顺序执行 | 按声明顺序依次执行子任务;上一个进程退出后才启动下一个 |
636
654
  | 管道模式启动 | 直接以 `claude -p "<prompt>" --output-format text --permission-mode bypassPermissions --dangerously-skip-permissions` 拉起进程,stdout / stderr 通过管道回传服务端,不再弹外部终端窗口 |
637
655
  | 独立上下文 | 每个子任务都是独立的 detached 进程,上下文与状态不会跨子任务累积 |
638
- | 实时日志 | 正在执行的子任务可展开「执行日志」面板,自动滚到底,展示累积的 stdout / stderr(服务端缓存 256 KB,客户端渲染最近 64 KB) |
656
+ | 实时日志 | 子任务的「执行日志」面板**默认展开**(不再仅在运行中展开),方便随时回看上次执行结果;面板内自动滚到底,展示累积的 stdout / stderr(服务端缓存 256 KB,客户端渲染最近 64 KB) |
639
657
  | 实时状态 | 子任务状态(todo / pending / running / done / error)和 PID 通过 SSE 实时推送 |
640
658
  | 执行中动效 | 状态为 `running` 的子任务卡片整体呈现蓝色呼吸光晕 + 顶部流动进度光带;状态徽章为渐变 shimmer + 脉冲白点 + 外发光,停下后平滑恢复 |
641
659
  | 跨视图指示 | 任意子任务运行中时,Activity Bar 上的工作台图标会显示脉动小圆点;切换到 Git 或编辑器视图也能看到运行状态 |
660
+ | 执行日志管理(弹窗) | 顶部「执行日志」按钮(替代原独立 tab)唤起弹窗:列表 / 过滤 / 批量删除 / 清空 / 保留策略全部可在此一次性管理;弹窗关闭后任务执行视图常驻,避免切换时不必要的卸载 |
642
661
 
643
662
  提示词预置与任务数据持久化到 `~/.zen-gitsync/prompts.json` 和 `~/.zen-gitsync/tasks.json`(跨项目共享)。子任务附件落盘在 `~/.zen-gitsync/workbench-images/<subId>/`。
644
663
 
@@ -657,6 +676,14 @@ Activity Bar 第四个视图,用于在当前仓库上批量调度 Claude:定
657
676
 
658
677
  ---
659
678
 
679
+ ### 自升级
680
+
681
+ GUI 底栏版本号每个会话会向 npm 查询一次最新版本。检测到更新时版本旁会出现 **升级** 按钮,点击后在弹窗里实时回传 `npm install -g zen-gitsync` 的输出;升级成功后弹窗会切换为「**立即重启并刷新**」主 CTA,调用 `POST /api/app-restart` 让 Node 进程优雅退出(外层 launcher / desktop 壳会自动拉起新版本),再 reload 当前 tab 让新 SPA 资源生效。同时底栏版本号会立刻刷新到新版本号,重启前就能看到。
682
+
683
+ > macOS / Linux 上全局安装需要 sudo,前端会用 `sudo -n` 非交互式尝试;如非免密 sudo,请以管理员权限重启 GUI 后再试。
684
+
685
+ ---
686
+
660
687
  ## 开发约定
661
688
 
662
689
  ### 行尾规范
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zen-gitsync",
3
- "version": "2.13.9",
3
+ "version": "2.13.11",
4
4
  "description": "Auto commit, scheduled sync, and visual GUI for Git. Run `g` in any repo for one-key commit & push, AI commit messages, scheduled background sync, and a drag-and-drop workflow builder.",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -12,6 +12,7 @@
12
12
  "pull": "git pull",
13
13
  "dev:server": "nodemon server.js --no-open",
14
14
  "dev": "concurrently \"npm run dev:server\" \"npm run start:vue\"",
15
+ "dev:ping": "node scripts/dev-ping.cjs",
15
16
  "start:server:no-open": "node server.js --no-open",
16
17
  "start:vue": "cd ./src/ui/client && npm run dev",
17
18
  "release": "node ./scripts/release.js",
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ // 一次性探测 dev server 状态。
3
+ // 用法: npm run dev:ping
4
+ // 后端默认 5545,vite 默认 5544。后端 port 会写进 .port 文件,本脚本读 .port 取真实端口。
5
+
6
+ const http = require('node:http')
7
+ const fs = require('node:fs')
8
+ const path = require('node:path')
9
+
10
+ function readBackendPort() {
11
+ try {
12
+ const portFile = path.resolve(__dirname, '..', '.port')
13
+ if (fs.existsSync(portFile)) {
14
+ const p = parseInt(fs.readFileSync(portFile, 'utf8').trim(), 10)
15
+ if (!Number.isNaN(p)) return p
16
+ }
17
+ } catch { /* 忽略,落回默认 */ }
18
+ return 5545
19
+ }
20
+
21
+ function probe(host, port, urlPath, timeoutMs = 2000) {
22
+ return new Promise((resolve) => {
23
+ const req = http.get({ host, port, path: urlPath, timeout: timeoutMs }, (res) => {
24
+ res.resume() // 消费掉响应体,避免 socket hang
25
+ resolve({ ok: true, status: res.statusCode })
26
+ })
27
+ req.on('error', (e) => resolve({ ok: false, error: e.code || e.message }))
28
+ req.on('timeout', () => {
29
+ req.destroy()
30
+ resolve({ ok: false, error: 'TIMEOUT' })
31
+ })
32
+ })
33
+ }
34
+
35
+ function statusIcon(ok, status) {
36
+ if (!ok) return '[ DOWN ]'
37
+ if (status >= 200 && status < 400) return '[ OK ]'
38
+ return `[ ${status} ]`
39
+ }
40
+
41
+ ;(async () => {
42
+ const backendPort = readBackendPort()
43
+ console.log('dev server status:')
44
+
45
+ const backend = await probe('127.0.0.1', backendPort, '/api/app-version')
46
+ console.log(` ${statusIcon(backend.ok, backend.status)} backend 127.0.0.1:${backendPort}/api/app-version`)
47
+
48
+ const vite = await probe('127.0.0.1', 5544, '/@vite/client')
49
+ console.log(` ${statusIcon(vite.ok, vite.status)} vite 127.0.0.1:5544/@vite/client`)
50
+
51
+ console.log('')
52
+ if (!backend.ok) {
53
+ console.log(`! backend 没起: cd 项目根 → npm run dev:server`)
54
+ }
55
+ if (!vite.ok) {
56
+ console.log(`! vite 没起: cd 项目根 → npm run start:vue (或整体 npm run dev)`)
57
+ }
58
+ if (backend.ok && vite.ok) {
59
+ console.log('一切正常,可以开始改前端代码。')
60
+ }
61
+ })()
@@ -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{$n as t,Bn as n,F as r,Gn as i,Hn as a,In as o,Kn as s,Mn as c,Nn as l,Pn as ee,Qn as u,Un as d,Yn as f,_ as te,_r as p,b as ne,c as m,cr as h,er as re,f as ie,g as ae,gr as g,h as oe,hr as _,ir as v,lr as y,m as se,mr as ce,nr as b,p as le,pr as x,qn as S,t as ue,ur as C,v as de,vr as w,vt as fe,y as pe,zn as T}from"./vendor-CgFFAa1w.js";import{n as E,t as D}from"./_plugin-vue_export-helper-CNd9lWx2.js";import{i as me,o as he}from"./index-DvRkCEGg.js";var ge=e(ie(),1),_e={class:`source-map-view`},ve={class:`sm-toolbar`},ye={class:`sm-toolbar-left`},be={class:`sm-title`},xe={class:`sm-toolbar-center`},Se=[`placeholder`,`disabled`],Ce=[`disabled`],we={class:`sm-toolbar-right`},Te={class:`sm-body`},Ee={class:`sm-panel-header sm-panel-header--tabs`},De={key:0,class:`sm-badge`},Oe={class:`sm-panel-body sm-file-tree`},ke=[`onClick`],Ae={key:1,class:`sm-tree-arrow-spacer`},je={key:2,class:`sm-tree-icon mit-icon`,"aria-hidden":`true`},Me=[`xlink:href`],Ne={key:3,class:`sm-tree-icon mit-icon`,"aria-hidden":`true`},Pe=[`xlink:href`],Fe=[`title`],Ie={key:1,class:`sm-tree-empty`},Le={class:`sm-panel-body sm-outline-body`},Re={class:`sm-badge`,style:{"margin-left":`auto`}},ze=[`onClick`],Be=[`title`],Ve={key:0,class:`sm-outline-desc`},He={key:1,class:`sm-tree-empty`},Ue={class:`sm-panel sm-panel-graph`},We={key:0,class:`sm-project-info`},Ge={class:`sm-lang-badge`},Ke={class:`sm-summary-text`},qe={class:`sm-graph-container`},Je={class:`sm-layout-btn-wrap`},Ye=[`disabled`],Xe=[`title`],Ze={class:`sm-fn-label`},Qe={key:0,class:`sm-fn-desc`},$e={key:0,class:`sm-graph-empty`},et={viewBox:`0 0 24 24`,width:`48`,height:`48`,fill:`none`,stroke:`currentColor`,"stroke-width":`1`,style:{opacity:`0.3`}},tt={key:1,class:`sm-graph-loading`},nt={class:`sm-log-header`},rt={key:0,class:`sm-log-indicator`},it={class:`sm-log-body`,ref:`logBodyRef`},at={key:0,class:`sm-empty`},ot={class:`sm-panel-header`},st={key:0,class:`sm-badge sm-badge-amber`},ct={key:0,class:`sm-node-detail`},lt={class:`sm-node-name`},ut={class:`sm-node-file`},dt={key:0},ft={key:0,class:`sm-node-desc`},pt={class:`sm-panel-body sm-source-body`},mt={key:0,class:`sm-source-overlay`},ht={key:1,class:`sm-source-overlay sm-source-placeholder`},O=D(f({__name:`SourceMapView`,setup(e){let f=x(document.documentElement.getAttribute(`data-theme`)===`dark`?`dark`:`light`);function ie(){f.value=document.documentElement.getAttribute(`data-theme`)===`dark`?`dark`:`light`}let D=null,O=he(),k=x(O.currentDirectory||``),A=x(`idle`),j=x([]),gt=0,M=x(null),N=x(null),P=x(`files`),F=x(``),I=x(``),L=x(!1),R=x([]),z=x(new Set),B=x({files:!0,graph:!0,source:!0}),V=x(!1),H=x(220),U=x(360),W=x(140),G=null,K=0,_t=0,q=0;function J(e,t){G=e,K=t.clientX,_t=t.clientY,q=e===`files`?H.value:e===`source`?U.value:W.value,document.addEventListener(`mousemove`,vt),document.addEventListener(`mouseup`,Y),t.preventDefault()}function vt(e){G&&(G===`files`?H.value=Math.max(120,Math.min(480,q+e.clientX-K)):G===`source`?U.value=Math.max(200,Math.min(700,q+K-e.clientX)):W.value=Math.max(60,Math.min(500,q+_t-e.clientY)))}function Y(){G=null,document.removeEventListener(`mousemove`,vt),document.removeEventListener(`mouseup`,Y)}let yt=x(null),X=ce(null),{fitView:bt,setNodes:xt,setEdges:St,getNodes:Ct,getEdges:wt,updateNodeInternals:Tt}=ne(),Z=T(()=>A.value===`scanning`||A.value===`analyzing`),Et=T(()=>f.value===`dark`?`#334155`:`#cbd5e1`),Q=T(()=>M.value?.nodes.find(e=>e.id===N.value)??null),Dt=T(()=>{if(!M.value)return[];let e=new Map;for(let t of M.value.nodes){let n=t.subsystem??`__default__`;if(!e.has(n)){let r=M.value.subsystems?.find(e=>e.name===n);e.set(n,{displayName:r?.displayName||t.subsystem||E(`@SRCMAP:默认`),color:t.subsystemColor||kt[0],nodes:[]})}e.get(n).nodes.push(t)}return[...e.entries()].map(([,e])=>e)});function $(e,t=`info`){j.value.push({id:++gt,message:e,type:t,timestamp:Date.now()}),j.value.length>200&&j.value.splice(0,j.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(){!yt.value||X.value||(X.value=m.create(yt.value,{value:``,language:`plaintext`,theme:f.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}}))}h(f,e=>{X.value&&m.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:ae.ArrowClosed}}))}}async function Pt(){let e=Ct.value,t=wt.value;if(e.length!==0){V.value=!0;try{await u(),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 ge.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)}),ge.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 u(),bt({padding:.18})}finally{V.value=!1}}}async function Ft(){if(!k.value.trim()){r.warning(E(`@SRCMAP:请先输入项目路径`));return}if(!Z.value){j.value=[],M.value=null,N.value=null,F.value=``,I.value=``,xt([]),St([]),A.value=`scanning`,$(E(`@SRCMAP:开始分析项目...`),`info`);try{let e=await fetch(`/api/code-analysis/analyze`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:k.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=``;A.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){$(`${E(`@SRCMAP:分析失败`)}: ${e.message}`,`error`),A.value=`error`}}}function It(e,t){if(e===`log`)$(t.message,t.type||`info`);else if(e===`files`)R.value=Ot(t.files||[]),R.value.forEach(e=>{e.kind===`dir`&&z.value.add(e.path)});else if(e===`result`){M.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(M.value.nodes,M.value.edges);xt(e),St(n),u(()=>Pt())}else e===`done`&&(t.error?($(`${E(`@SRCMAP:分析失败`)}: ${t.error}`,`error`),A.value=`error`):A.value=`done`)}async function Lt(e){if(!(!e||L.value)&&I.value!==e){L.value=!0,I.value=e,F.value=``;try{let t=await(await fetch(`/api/code-analysis/file-content?path=${encodeURIComponent(k.value)}&file=${encodeURIComponent(e)}`)).json();if(t.error)throw Error(t.error);F.value=t.content||``}catch(e){F.value=`// ${E(`@SRCMAP:加载失败`)}: ${e.message}`}finally{L.value=!1}}}function Rt(e){let t=e.node.data;N.value=t.id,t.file&&Lt(t.file)}function zt(e){z.value.has(e)?z.value.delete(e):z.value.add(e)}let Bt=T(()=>{let e=[];function t(n,r){for(let i of n){let n=z.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(R.value,0),e});return h(()=>O.currentDirectory,e=>{e&&!k.value&&(k.value=e)}),h([F,I],([e,t])=>{let n=X.value;if(!n)return;let r=jt(t||``),i=n.getModel(),a=m.createModel(e||``,r);n.setModel(a),i?.dispose(),n.setScrollPosition({scrollTop:0,scrollLeft:0})}),re(()=>{Mt(),!k.value&&O.currentDirectory&&(k.value=O.currentDirectory),D=new MutationObserver(()=>ie()),D.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-theme`]})}),t(()=>{X.value?.getModel()?.dispose(),X.value?.dispose(),Y(),D?.disconnect(),D=null}),(e,t)=>{let r=fe;return b(),d(`div`,_e,[n(`div`,ve,[n(`div`,ye,[t[9]||=n(`svg`,{viewBox:`0 0 24 24`,width:`18`,height:`18`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,class:`sm-icon-map`},[n(`polygon`,{points:`3 6 9 3 15 6 21 3 21 18 15 21 9 18 3 21`}),n(`line`,{x1:`9`,y1:`3`,x2:`9`,y2:`18`}),n(`line`,{x1:`15`,y1:`6`,x2:`15`,y2:`21`})],-1),n(`span`,be,w(_(E)(`@SRCMAP:源码地图`)),1)]),n(`div`,xe,[C(n(`input`,{"onUpdate:modelValue":t[0]||=e=>k.value=e,class:`sm-path-input`,placeholder:_(E)(`@SRCMAP:输入项目目录路径`),disabled:Z.value,onKeydown:ee(Ft,[`enter`])},null,40,Se),[[c,k.value]]),n(`button`,{class:`sm-btn sm-btn-primary`,disabled:Z.value,onClick:Ft},[Z.value?(b(),d(o,{key:0},[t[10]||=n(`span`,{class:`sm-spinner`},null,-1),s(` `+w(_(E)(`@SRCMAP:分析中...`)),1)],64)):(b(),d(o,{key:1},[s(w(A.value===`done`?_(E)(`@SRCMAP:重新分析`):_(E)(`@SRCMAP:开始分析`)),1)],64))],8,Ce)]),n(`div`,we,[S(r,{content:_(E)(`@SRCMAP:文件列表`),placement:`bottom`},{default:y(()=>[n(`button`,{class:g([`sm-panel-btn`,{active:B.value.files}]),onClick:t[1]||=e=>B.value.files=!B.value.files},[...t[11]||=[n(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[n(`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`]),S(r,{content:_(E)(`@SRCMAP:调用图`),placement:`bottom`},{default:y(()=>[n(`button`,{class:g([`sm-panel-btn`,{active:B.value.graph}]),onClick:t[2]||=e=>B.value.graph=!B.value.graph},[...t[12]||=[n(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[n(`circle`,{cx:`12`,cy:`12`,r:`3`}),n(`circle`,{cx:`3`,cy:`6`,r:`2`}),n(`circle`,{cx:`21`,cy:`6`,r:`2`}),n(`circle`,{cx:`3`,cy:`18`,r:`2`}),n(`circle`,{cx:`21`,cy:`18`,r:`2`}),n(`line`,{x1:`5`,y1:`6`,x2:`9`,y2:`11`}),n(`line`,{x1:`19`,y1:`6`,x2:`15`,y2:`11`}),n(`line`,{x1:`5`,y1:`18`,x2:`9`,y2:`13`}),n(`line`,{x1:`19`,y1:`18`,x2:`15`,y2:`13`})],-1)]],2)]),_:1},8,[`content`]),S(r,{content:_(E)(`@SRCMAP:源码面板`),placement:`bottom`},{default:y(()=>[n(`button`,{class:g([`sm-panel-btn`,{active:B.value.source}]),onClick:t[3]||=e=>B.value.source=!B.value.source},[...t[13]||=[n(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[n(`polyline`,{points:`16 18 22 12 16 6`}),n(`polyline`,{points:`8 6 2 12 8 18`})],-1)]],2)]),_:1},8,[`content`])])]),n(`div`,Te,[C(n(`div`,{class:`sm-panel sm-panel-files`,style:p({width:H.value+`px`})},[n(`div`,Ee,[n(`button`,{class:g([`sm-tab-btn`,{active:P.value===`files`}]),onClick:t[4]||=e=>P.value=`files`},[t[14]||=n(`svg`,{viewBox:`0 0 24 24`,width:`12`,height:`12`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[n(`path`,{d:`M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z`})],-1),s(` `+w(_(E)(`@SRCMAP:文件列表`))+` `,1),M.value?(b(),d(`span`,De,w(M.value.allFiles.length),1)):a(``,!0)],2),n(`button`,{class:g([`sm-tab-btn`,{active:P.value===`outline`}]),onClick:t[5]||=e=>P.value=`outline`},[t[15]||=i(`<svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.8" data-v-71d3569e><line x1="8" y1="6" x2="21" y2="6" data-v-71d3569e></line><line x1="8" y1="12" x2="21" y2="12" data-v-71d3569e></line><line x1="8" y1="18" x2="21" y2="18" data-v-71d3569e></line><line x1="3" y1="6" x2="3.01" y2="6" data-v-71d3569e></line><line x1="3" y1="12" x2="3.01" y2="12" data-v-71d3569e></line><line x1="3" y1="18" x2="3.01" y2="18" data-v-71d3569e></line></svg>`,1),s(` `+w(_(E)(`@SRCMAP:大纲`)),1)],2)]),C(n(`div`,Oe,[Bt.value.length>0?(b(!0),d(o,{key:0},v(Bt.value,e=>(b(),d(`div`,{key:e.path,class:g([`sm-tree-node`,{"sm-tree-node--dir":e.kind===`dir`,"sm-tree-node--active":e.kind===`file`&&I.value===e.path}]),style:p({paddingLeft:10+e.depth*14+`px`}),onClick:t=>e.kind===`dir`?zt(e.path):Lt(e.path)},[e.kind===`dir`?(b(),d(`span`,{key:0,class:g([`sm-tree-arrow`,{expanded:e.expanded}])},[...t[16]||=[n(`svg`,{viewBox:`0 0 24 24`,width:`10`,height:`10`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[n(`polyline`,{points:`9 18 15 12 9 6`})],-1)]],2)):(b(),d(`span`,Ae)),e.kind===`dir`?(b(),d(`svg`,je,[n(`use`,{"xlink:href":`#${_(me)(e.name)||`icon-folder`}`},null,8,Me)])):(b(),d(`svg`,Ne,[n(`use`,{"xlink:href":`#${_(me)(e.name)}`},null,8,Pe)])),n(`span`,{class:`sm-tree-name`,title:e.path},w(e.name),9,Fe)],14,ke))),128)):(b(),d(`div`,Ie,w(_(E)(`@SRCMAP:暂无文件,请先开始分析`)),1))],512),[[l,P.value===`files`]]),C(n(`div`,Le,[Dt.value.length>0?(b(!0),d(o,{key:0},v(Dt.value,e=>(b(),d(`div`,{key:e.displayName,class:`sm-outline-group`},[n(`div`,{class:`sm-outline-group-header`,style:p({color:e.color})},[t[17]||=n(`svg`,{viewBox:`0 0 24 24`,width:`8`,height:`8`,fill:`currentColor`},[n(`circle`,{cx:`12`,cy:`12`,r:`6`})],-1),s(` `+w(e.displayName)+` `,1),n(`span`,Re,w(e.nodes.length),1)],4),(b(!0),d(o,null,v(e.nodes,t=>(b(),d(`div`,{key:t.id,class:g([`sm-outline-node`,{"sm-outline-node--active":N.value===t.id}]),onClick:e=>{N.value=t.id,t.file&&Lt(t.file)}},[n(`span`,{class:`sm-outline-dot`,style:p({background:e.color})},null,4),n(`span`,{class:`sm-outline-label`,title:t.file||t.label},w(t.label),9,Be),t.description?(b(),d(`span`,Ve,w(t.description.length>18?t.description.slice(0,18)+`…`:t.description),1)):a(``,!0)],10,ze))),128))]))),128)):(b(),d(`div`,He,w(_(E)(`@SRCMAP:暂无分析结果`)),1))],512),[[l,P.value===`outline`]])],4),[[l,B.value.files]]),C(n(`div`,{class:`sm-resizer sm-resizer-v`,onMousedown:t[6]||=e=>J(`files`,e)},null,544),[[l,B.value.files&&B.value.graph]]),C(n(`div`,Ue,[M.value?(b(),d(`div`,We,[n(`span`,Ge,w(M.value.language),1),M.value.subsystems&&M.value.subsystems.length>1?(b(!0),d(o,{key:0},v(M.value.subsystems,e=>(b(),d(`span`,{key:e.name,class:`sm-subsystem-tag`,style:p({borderColor:e.color,color:e.color})},`● `+w(e.displayName||e.name),5))),128)):(b(!0),d(o,{key:1},v(M.value.techStack.slice(0,4),e=>(b(),d(`span`,{key:e,class:`sm-tech-tag`},w(e),1))),128)),n(`span`,Ke,w(M.value.summary),1)])):a(``,!0),n(`div`,qe,[n(`div`,Je,[n(`button`,{class:`sm-layout-btn`,disabled:V.value||!M.value,onClick:Pt},[t[18]||=i(`<svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.8" data-v-71d3569e><rect x="3" y="3" width="7" height="7" rx="1" data-v-71d3569e></rect><rect x="14" y="3" width="7" height="7" rx="1" data-v-71d3569e></rect><rect x="3" y="14" width="7" height="7" rx="1" data-v-71d3569e></rect><rect x="14" y="14" width="7" height="7" rx="1" data-v-71d3569e></rect></svg>`,1),s(` `+w(V.value?_(E)(`@SRCMAP:布局中...`):_(E)(`@SRCMAP:优化布局`)),1)],8,Ye)]),S(_(de),{class:`sm-vue-flow`,"default-viewport":{zoom:1},"min-zoom":.2,"max-zoom":4,"fit-view-on-init":``,onNodeClick:Rt},{"node-default":y(({data:e,label:t})=>[S(_(pe),{type:`target`,position:_(te).Top},null,8,[`position`]),n(`div`,{class:`sm-fn-inner`,title:`${t}${e?.description?`
3
+ `+e.description:``}`},[n(`div`,Ze,w(t),1),e?.description?(b(),d(`div`,Qe,w(e.description.length>22?e.description.slice(0,22)+`…`:e.description),1)):a(``,!0)],8,Xe),S(_(pe),{type:`source`,position:_(te).Bottom},null,8,[`position`])]),default:y(()=>[S(_(oe),{variant:_(se).Dots,gap:20,size:1,"pattern-color":Et.value},null,8,[`variant`,`pattern-color`]),S(_(le)),S(_(ue),{"node-color":`#3b82f6`,"mask-color":f.value===`dark`?`rgba(0,0,0,0.55)`:`rgba(15,23,42,0.06)`},null,8,[`mask-color`])]),_:1}),!M.value&&!Z.value?(b(),d(`div`,$e,[(b(),d(`svg`,et,[...t[19]||=[n(`polygon`,{points:`3 6 9 3 15 6 21 3 21 18 15 21 9 18 3 21`},null,-1),n(`line`,{x1:`9`,y1:`3`,x2:`9`,y2:`18`},null,-1),n(`line`,{x1:`15`,y1:`6`,x2:`15`,y2:`21`},null,-1)]])),n(`p`,null,w(_(E)(`@SRCMAP:输入项目路径后点击开始分析`)),1)])):a(``,!0),Z.value&&!M.value?(b(),d(`div`,tt,[t[20]||=n(`span`,{class:`sm-spinner sm-spinner-lg`},null,-1),n(`p`,null,w(_(E)(`@SRCMAP:AI 正在分析项目结构...`)),1)])):a(``,!0)]),n(`div`,{class:`sm-resizer sm-resizer-h`,onMousedown:t[7]||=e=>J(`log`,e)},null,32),n(`div`,{class:`sm-log-panel`,style:p({height:W.value+`px`})},[n(`div`,nt,[t[21]||=n(`svg`,{viewBox:`0 0 24 24`,width:`12`,height:`12`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[n(`polyline`,{points:`4 17 10 11 4 5`}),n(`line`,{x1:`12`,y1:`19`,x2:`20`,y2:`19`})],-1),s(` `+w(_(E)(`@SRCMAP:Agent 日志`))+` `,1),Z.value?(b(),d(`span`,rt)):a(``,!0)]),n(`div`,it,[(b(!0),d(o,null,v(j.value.slice(-50),e=>(b(),d(`div`,{key:e.id,class:g([`sm-log-entry`,`sm-log-entry--${e.type}`])},w(e.message),3))),128)),j.value.length===0?(b(),d(`div`,at,w(_(E)(`@SRCMAP:等待开始分析`)),1)):a(``,!0)],512)],4)],512),[[l,B.value.graph]]),C(n(`div`,{class:`sm-resizer sm-resizer-v`,onMousedown:t[8]||=e=>J(`source`,e)},null,544),[[l,B.value.graph&&B.value.source]]),C(n(`div`,{class:`sm-panel sm-panel-source`,style:p({width:U.value+`px`})},[n(`div`,ot,[t[22]||=n(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`},[n(`polyline`,{points:`16 18 22 12 16 6`}),n(`polyline`,{points:`8 6 2 12 8 18`})],-1),s(` `+w(I.value||_(E)(`@SRCMAP:源码面板`))+` `,1),Q.value?(b(),d(`span`,st,w(Q.value.label),1)):a(``,!0)]),Q.value?(b(),d(`div`,ct,[n(`div`,lt,w(Q.value.label),1),n(`div`,ut,[s(w(Q.value.file),1),Q.value.line?(b(),d(`span`,dt,` :`+w(Q.value.line),1)):a(``,!0)]),Q.value.description?(b(),d(`div`,ft,w(Q.value.description),1)):a(``,!0)])):a(``,!0),n(`div`,pt,[L.value?(b(),d(`div`,mt,[...t[23]||=[n(`span`,{class:`sm-spinner`},null,-1)]])):a(``,!0),!L.value&&!F.value?(b(),d(`div`,ht,w(_(E)(`@SRCMAP:点击调用图中的节点查看源码`)),1)):a(``,!0),n(`div`,{ref_key:`monacoContainerRef`,ref:yt,class:`sm-monaco-container`},null,512)])],4),[[l,B.value.source]])])])}}}),[[`__scopeId`,`data-v-71d3569e`]]);export{O as default};
@@ -0,0 +1,6 @@
1
+ import"./rolldown-runtime-CMxvf4Kt.js";import{$n as e,Bn as t,Ct as n,F as r,Fn as i,Gt as a,H as o,Hn as s,Ht as c,I as l,In as u,J as d,Kn as f,Lt as p,Mn as m,Mt as h,Nn as g,P as _,Pn as v,Qn as y,Qt as b,Rn as x,St as ee,Un as S,V as C,Vn as w,X as T,Y as E,Yn as D,Zt as O,_r as te,_t as ne,an as k,bt as re,cn as A,cr as j,ct as ie,dr as M,dt as ae,en as N,er as oe,fr as P,gr as F,hr as I,in as se,ir as L,jn as ce,kt as le,l as ue,lr as R,nr as z,nt as de,ot as fe,pr as B,pt as pe,qn as V,sn as H,sr as me,st as he,tr as ge,ur as _e,ut as ve,vr as U,wt as ye,xt as be,yt as xe,zn as W,zt as Se}from"./vendor-CgFFAa1w.js";import{n as G,t as K}from"./_plugin-vue_export-helper-CNd9lWx2.js";import{n as Ce}from"./index-DvRkCEGg.js";var we={key:0,class:`ai-split-status`},Te={key:1,class:`ai-split-status is-error`},Ee={key:2,class:`ai-split-idle`},De={class:`ai-split-idle__title`},q={class:`ai-split-idle__desc`},J={class:`ai-split-prompt-actions`},Oe={key:0,class:`ai-split-prompt-editor`},Y={class:`ai-split-prompt-editor__actions`},X={key:1,class:`ai-split-pre`},ke={class:`ai-split-subhead`},Ae={class:`ai-split-pre`},Z={key:0,class:`ai-split-tab-count`},je={class:`ai-split-pre ai-split-pre--think`},Me={key:0,class:`ai-split-tab-count`},Ne={class:`ai-split-parse-error__detail`},Pe={class:`ai-split-parse-error__hint`},Fe={class:`ai-split-parse-error__actions`},Ie={key:1,class:`ai-split-raw-toolbar`},Le={class:`ai-split-raw-tip`},Re={key:0,class:`ai-split-tab-count`},ze={key:0,class:`ai-split-empty`},Be={key:1,class:`ai-split-list`},Ve={class:`ai-split-list__no`},He={class:`ai-split-list__body`},Ue={class:`ai-split-list__title`},Q={class:`ai-split-list__desc`},We={key:4,class:`ai-split-footer-hint`},Ge=K(D({__name:`AISplitDialog`,props:{modelValue:{type:Boolean},title:{},desc:{},taskId:{},promptId:{}},emits:[`update:modelValue`,`confirm`],setup(e,{emit:n}){let i=e,a=n,c=B(`idle`),l=B(`prompt`),d=B(``),p=B(``),m=B(``),h=B(``),g=B(``),_=B([]),v=B(``),y=B(``),x=B(``),T=null,E=0,D=W(()=>m.value.length),O=W(()=>h.value.length),te=W(()=>c.value===`result`&&_.value.length>0),k=W(()=>c.value===`running`);function re(){A(),ie(),a(`update:modelValue`,!1)}function A(){T&&=(T.abort(),null)}function ie(){A(),c.value=`idle`,l.value=`prompt`,d.value=``,p.value=``,m.value=``,h.value=``,g.value=``,_.value=[],v.value=``,y.value=``,x.value=``}async function M(){if(!i.title.trim()){r.warning(G(`@WORKBENCH:请先填写任务标题`));return}ie();let e=++E;c.value=`running`,l.value=`thinking`,T=new AbortController;let t=T;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!==E)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=``,s=null;for(;;){let{value:t,done:n}=await r.read();if(e!==E)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`:d.value=r.prompt?.system||``,p.value=r.prompt?.user||``;break;case`thinking`:m.value+=String(r.delta||``);break;case`content`:h.value+=String(r.delta||``);break;case`done`:s=r;break;case`error`:throw Error(r.error||`AI 拆分失败`)}}}if(e!==E)return;if(!s)throw Error(G(`@WORKBENCH:AI 未返回结果`));_.value=Array.isArray(s.subtasks)?s.subtasks:[],g.value=s.raw||h.value,y.value=String(s.parseError||``),x.value=String(s.parseStage||``),m.value||=G(`@WORKBENCH:(当前模型未返回独立的思考内容,可切换到「原始结果」查看完整输出)`),c.value=`result`,l.value=_.value.length>0?`confirm`:(y.value,`raw`)}catch(n){if(console.log(`[AI Split] catch err:`,{name:n?.name,msg:n?.message,aborted:t.signal.aborted,nonce:{mine:e,cur:E}}),e!==E||n?.name===`AbortError`||t.signal.aborted)return;c.value=`error`,v.value=n?.message||String(n)}finally{e===E&&(T=null)}}function ae(){te.value&&(a(`confirm`,_.value.slice()),a(`update:modelValue`,!1))}function N(){M()}let oe=B(!1);async function P(){if(!h.value.trim()){r.warning(G(`@WORKBENCH:原始结果为空,无法解析`));return}oe.value=!0;try{let e=await fetch(`/api/workbench/tasks/parse-subtasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({raw:h.value})}).then(e=>e.json());if(!e.success){r.error(e.error||G(`@WORKBENCH:解析失败`));return}_.value=Array.isArray(e.subtasks)?e.subtasks:[],y.value=String(e.parseError||``),x.value=String(e.parseStage||``),g.value=h.value,_.value.length>0?(r.success(G(`@WORKBENCH:解析成功,已识别 {n} 个子任务`,{n:_.value.length})),l.value=`confirm`):r.warning(G(`@WORKBENCH:仍未解析到子任务,请继续修改原始结果`))}catch(e){r.error(G(`@WORKBENCH:解析失败: `)+(e?.message||e))}finally{oe.value=!1}}j(()=>i.modelValue,e=>{e&&c.value===`idle`&&(l.value=`prompt`)}),j(()=>i.taskId,()=>{ie()});let F=B(!1),se=B(``),ce=B(!1);function ue(){se.value=d.value,F.value=!0}async function fe(){if(!se.value.trim()){r.warning(G(`@WORKBENCH:指令内容不能为空`));return}ce.value=!0;try{let e=await fetch(`/api/workbench/tasks/ai-subtask-instruction`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({instruction:se.value})}).then(e=>e.json());e.success?(r.success(G(`@WORKBENCH:已保存指令`)),F.value=!1,N()):r.error(e.error||G(`@WORKBENCH:保存失败`))}catch(e){r.error(G(`@WORKBENCH:保存失败: `)+(e?.message||e))}finally{ce.value=!1}}function me(){F.value=!1}return(n,r)=>{let i=ee,g=pe,x=ne,T=C,E=be,A=o,j=de;return z(),w(j,{"model-value":e.modelValue,"onUpdate:modelValue":r[4]||=e=>a(`update:modelValue`,e),title:I(G)(`@WORKBENCH:AI 拆分任务`),width:`800px`,"close-on-click-modal":!1,"close-on-press-escape":!k.value,"show-close":!k.value,onClose:re},{footer:R(()=>[c.value===`error`||c.value===`result`&&y.value&&_.value.length===0?(z(),w(g,{key:0,onClick:N},{default:R(()=>[f(U(I(G)(`@WORKBENCH:重新生成`)),1)]),_:1})):s(``,!0),V(g,{onClick:re},{default:R(()=>[f(U(I(G)(`@WORKBENCH:取消`)),1)]),_:1}),V(g,{type:`primary`,disabled:!te.value,onClick:ae},{default:R(()=>[f(U(I(G)(`@WORKBENCH:确认入库`))+` (`+U(_.value.length)+`) `,1)]),_:1},8,[`disabled`])]),default:R(()=>[k.value?(z(),S(`div`,we,[V(i,{class:`is-loading`},{default:R(()=>[V(I(b))]),_:1}),t(`span`,null,U(I(G)(`@WORKBENCH:AI 正在拆分…`)),1)])):c.value===`error`?(z(),S(`div`,Te,[V(i,{color:`#f56c6c`},{default:R(()=>[V(I(le))]),_:1}),t(`span`,null,U(v.value),1)])):c.value===`idle`?(z(),S(`div`,Ee,[r[5]||=t(`div`,{class:`ai-split-idle__icon`,"aria-hidden":`true`},[t(`svg`,{viewBox:`0 0 24 24`,width:`36`,height:`36`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[t(`path`,{d:`M12 3v3`}),t(`path`,{d:`M12 18v3`}),t(`path`,{d:`M3 12h3`}),t(`path`,{d:`M18 12h3`}),t(`path`,{d:`M5.6 5.6l2.1 2.1`}),t(`path`,{d:`M16.3 16.3l2.1 2.1`}),t(`path`,{d:`M5.6 18.4l2.1-2.1`}),t(`path`,{d:`M16.3 7.7l2.1-2.1`}),t(`circle`,{cx:`12`,cy:`12`,r:`4`})])],-1),t(`div`,De,U(I(G)(`@WORKBENCH:准备用 AI 拆分任务`)),1),t(`div`,q,U(I(G)(`@WORKBENCH:点击下方按钮开始生成。生成期间可切换到「思考 / 原始结果」实时查看模型输出。`)),1),V(g,{type:`primary`,icon:I(H),onClick:M},{default:R(()=>[f(U(I(G)(`@WORKBENCH:开始拆分`)),1)]),_:1},8,[`icon`])])):s(``,!0),c.value===`idle`?s(``,!0):(z(),w(A,{key:3,modelValue:l.value,"onUpdate:modelValue":r[3]||=e=>l.value=e,class:`ai-split-tabs`},{default:R(()=>[V(T,{label:I(G)(`@WORKBENCH:提示词`),name:`prompt`},{default:R(()=>[t(`div`,J,[V(g,{size:`small`,disabled:k.value,onClick:ue},{default:R(()=>[f(U(I(G)(`@WORKBENCH:编辑指令`)),1)]),_:1},8,[`disabled`])]),F.value?(z(),S(`div`,Oe,[V(x,{modelValue:se.value,"onUpdate:modelValue":r[0]||=e=>se.value=e,type:`textarea`,rows:12,placeholder:I(G)(`@WORKBENCH:指令内容`)},null,8,[`modelValue`,`placeholder`]),t(`div`,Y,[V(g,{size:`small`,onClick:me},{default:R(()=>[f(U(I(G)(`@WORKBENCH:取消`)),1)]),_:1}),V(g,{size:`small`,type:`primary`,loading:ce.value,onClick:fe},{default:R(()=>[f(U(I(G)(`@WORKBENCH:保存并重跑`)),1)]),_:1},8,[`loading`])])])):(z(),S(`pre`,X,U(d.value||`(等待 LLM 启动…)`),1)),t(`h4`,ke,U(I(G)(`@WORKBENCH:用户提示词(拼装后)`)),1),t(`pre`,Ae,U(p.value||`(等待 LLM 启动…)`),1)]),_:1},8,[`label`]),V(T,{name:`thinking`},{label:R(()=>[t(`span`,null,[f(U(I(G)(`@WORKBENCH:思考`))+` `,1),D.value>0?(z(),S(`span`,Z,`(`+U(D.value)+`)`,1)):s(``,!0)])]),default:R(()=>[t(`pre`,je,U(m.value||I(G)(`@WORKBENCH:(暂无输出)`)),1)]),_:1}),V(T,{name:`raw`},{label:R(()=>[t(`span`,null,[f(U(I(G)(`@WORKBENCH:原始结果`))+` `,1),O.value>0?(z(),S(`span`,Me,`(`+U(O.value)+`)`,1)):s(``,!0)])]),default:R(()=>[y.value&&c.value===`result`?(z(),w(E,{key:0,type:`warning`,"show-icon":``,closable:!1,class:`ai-split-parse-error`},{title:R(()=>[f(U(I(G)(`@WORKBENCH:模型返回内容解析失败,无法识别为有效的子任务 JSON`)),1)]),default:R(()=>[t(`div`,Ne,U(y.value),1),t(`div`,Pe,U(I(G)(`@WORKBENCH:常见原因:desc 内夹杂了 ASCII 双引号、出现尾随逗号,或输出被截断。可在下方文本框中手动修改后点「重新解析」,或重新生成。`)),1),t(`div`,Fe,[V(g,{size:`small`,type:`primary`,loading:oe.value,onClick:P},{default:R(()=>[f(U(I(G)(`@WORKBENCH:重新解析`)),1)]),_:1},8,[`loading`]),V(g,{size:`small`,onClick:N},{default:R(()=>[f(U(I(G)(`@WORKBENCH:重新生成`)),1)]),_:1}),V(g,{size:`small`,onClick:r[1]||=e=>l.value=`prompt`},{default:R(()=>[f(U(I(G)(`@WORKBENCH:去编辑指令`)),1)]),_:1})])]),_:1})):s(``,!0),c.value===`result`||h.value?(z(),S(`div`,Ie,[t(`span`,Le,U(I(G)(`@WORKBENCH:可直接编辑下方文本,修正后点「重新解析」即可入库`)),1),V(g,{size:`small`,type:`primary`,loading:oe.value,disabled:!h.value.trim(),onClick:P},{default:R(()=>[f(U(I(G)(`@WORKBENCH:重新解析`)),1)]),_:1},8,[`loading`,`disabled`])])):s(``,!0),V(x,{modelValue:h.value,"onUpdate:modelValue":r[2]||=e=>h.value=e,type:`textarea`,rows:14,placeholder:I(G)(`@WORKBENCH:(暂无输出)`),readonly:k.value,class:`ai-split-raw-editor`,resize:`none`},null,8,[`modelValue`,`placeholder`,`readonly`])]),_:1}),V(T,{name:`confirm`,disabled:_.value.length===0},{label:R(()=>[t(`span`,null,[f(U(I(G)(`@WORKBENCH:确认入库`))+` `,1),_.value.length>0?(z(),S(`span`,Re,`(`+U(_.value.length)+`)`,1)):s(``,!0)])]),default:R(()=>[_.value.length===0?(z(),S(`div`,ze,U(I(G)(`@WORKBENCH:(暂无子任务)`)),1)):(z(),S(`ul`,Be,[(z(!0),S(u,null,L(_.value,(e,n)=>(z(),S(`li`,{key:n,class:`ai-split-list__item`},[t(`div`,Ve,U(n+1),1),t(`div`,He,[t(`div`,Ue,U(e.title),1),t(`div`,Q,U(e.desc),1)])]))),128))]))]),_:1},8,[`disabled`])]),_:1},8,[`modelValue`])),y.value&&c.value===`result`&&_.value.length===0?(z(),S(`div`,We,[V(i,{color:`#e6a23c`},{default:R(()=>[V(I(le))]),_:1}),t(`span`,null,U(I(G)(`@WORKBENCH:解析失败,未能从模型输出中提取出子任务 — 请查看「原始结果」`)),1)])):s(``,!0)]),_:1},8,[`model-value`,`title`,`close-on-press-escape`,`show-close`])}}}),[[`__scopeId`,`data-v-77465992`]]),Ke={class:`wb-attachments__head`},qe={class:`wb-attachments__label`},Je={class:`wb-attachments__count`},Ye=[`disabled`],Xe={key:0,class:`wb-attachments__paste-hint`},Ze={key:1,class:`wb-attachments__list`},Qe=[`title`,`onClick`,`onContextmenu`],$e=[`src`,`alt`],et={key:1},tt={class:`wb-attachment__meta`},nt=[`title`],rt=[`onClick`,`title`],it=K(D({__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(n,{emit:a}){let o=n,c=a,l=W(()=>o.attachments.filter(e=>o.isImage(e))),d=W(()=>l.value.map(e=>`/api/workbench/attachments/${e.id}/raw`)),p=B(0),m=B(!1);function h(e){if(o.isImage(e)){let t=l.value.findIndex(t=>t.id===e.id);p.value=t>=0?t:0,m.value=!0}else window.open(`/api/workbench/attachments/${e.id}/raw`,`_blank`,`noopener`)}function g(){m.value=!1}let _=B({visible:!1,x:0,y:0,att:null}),v=B(!1);function y(e,t){if(!o.isImage(e))return;t.preventDefault();let n=window.innerWidth-180,r=window.innerHeight-120;_.value={visible:!0,x:Math.min(t.clientX,n),y:Math.min(t.clientY,r),att:e}}function b(){_.value.visible&&(_.value.visible=!1)}async function ee(){let e=_.value.att;if(!(!e||v.value)){if(b(),!navigator.clipboard||typeof ClipboardItem>`u`){r({type:`warning`,message:G(`@WORKBENCH:当前浏览器不支持复制图片`)});return}v.value=!0;try{let t=await fetch(`/api/workbench/attachments/${e.id}/raw`,{credentials:`same-origin`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.blob(),i=[`image/png`,`image/jpeg`,`image/webp`,`image/gif`].includes(n.type)?n.type:`image/png`,a=new ClipboardItem({[i]:n});await navigator.clipboard.write([a]),r({type:`success`,message:G(`@WORKBENCH:图片已复制到剪贴板`),duration:1800})}catch(e){r({type:`error`,message:G(`@WORKBENCH:复制失败 {error}`,{error:e?.message||``})})}finally{v.value=!1}}}return typeof window<`u`&&(window.addEventListener(`click`,b),window.addEventListener(`scroll`,b,!0),window.addEventListener(`blur`,b)),e(()=>{typeof window>`u`||(window.removeEventListener(`click`,b),window.removeEventListener(`scroll`,b,!0),window.removeEventListener(`blur`,b))}),(e,r)=>(z(),S(u,null,[t(`div`,{class:F([`wb-attachments`,{"is-paste-hover":n.isPasteHover}]),onPaste:r[1]||=e=>c(`paste`,e),onDrop:r[2]||=i(e=>c(`drop`,e),[`prevent`]),onDragover:r[3]||=i(e=>c(`dragover`,e),[`prevent`]),onDragenter:r[4]||=i(e=>c(`dragenter`,e),[`prevent`]),onDragleave:r[5]||=e=>c(`dragleave`,e)},[t(`div`,Ke,[t(`span`,qe,[f(U(I(G)(`@WORKBENCH:附件`))+` `,1),t(`span`,Je,U(n.attachments.length)+` / `+U(n.maxCount),1)]),t(`button`,{class:`wb-attachments__add wb-soft-btn`,disabled:n.isUploading||n.attachments.length>=n.maxCount,onClick:r[0]||=(...e)=>n.onPick&&n.onPick(...e)},U(n.isUploading?I(G)(`@WORKBENCH:上传中…`):I(G)(`@WORKBENCH:添加附件`)),9,Ye)]),n.isPasteHover?(z(),S(`div`,Xe,U(I(G)(`@WORKBENCH:粘贴图片以快速添加`)),1)):s(``,!0),n.attachments.length>0?(z(),S(`ul`,Ze,[(z(!0),S(u,null,L(n.attachments,e=>(z(),S(`li`,{key:e.id,class:`wb-attachment`},[t(`button`,{type:`button`,class:`wb-attachment__preview`,title:I(G)(`@WORKBENCH:点击预览`),onClick:t=>h(e),onContextmenu:t=>y(e,t)},[t(`div`,{class:F([`wb-attachment__icon`,{"wb-attachment__icon--img":n.isImage(e)}])},[n.isImage(e)?(z(),S(`img`,{key:0,src:`/api/workbench/attachments/${e.id}/raw`,alt:e.originalName,loading:`lazy`},null,8,$e)):(z(),S(`span`,et,U(e.ext.toUpperCase()),1))],2),t(`div`,tt,[t(`div`,{class:`wb-attachment__name`,title:`${e.originalName} (${n.humanSize(e.size)})`},U(e.originalName),9,nt)])],40,Qe),t(`button`,{class:`wb-attachment__del`,onClick:i(t=>n.onRemove(e),[`stop`]),title:I(G)(`@WORKBENCH:删除`)},`×`,8,rt)]))),128))])):s(``,!0)],34),(z(),w(x,{to:`body`},[m.value&&d.value.length>0?(z(),w(I(T),{key:0,"url-list":d.value,"initial-index":p.value,"hide-on-click-modal":!0,onClose:g},null,8,[`url-list`,`initial-index`])):s(``,!0)])),(z(),w(x,{to:`body`},[_.value.visible&&_.value.att&&n.isImage(_.value.att)?(z(),S(`ul`,{key:0,class:`wb-ctx-menu`,style:te({top:_.value.y+`px`,left:_.value.x+`px`}),onContextmenu:r[6]||=i(()=>{},[`prevent`])},[t(`li`,{class:F([`wb-ctx-menu__item`,{"is-disabled":v.value}]),onClick:ee},[r[7]||=t(`span`,{class:`wb-ctx-menu__icon`,"aria-hidden":`true`},[t(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[t(`rect`,{x:`9`,y:`9`,width:`11`,height:`11`,rx:`2`}),t(`path`,{d:`M5 15V5a2 2 0 0 1 2-2h10`})])],-1),t(`span`,null,U(I(G)(`@WORKBENCH:复制图片`)),1)],2)],36)):s(``,!0)]))],64))}}),[[`__scopeId`,`data-v-9e1ed466`]]),at=[`aria-expanded`],ot={class:`wb-log-summary__left`},st={key:0,class:`wb-log-summary__status wb-log-summary__status--running`},ct={class:`wb-log-summary__label`},lt={key:0,class:`wb-log-summary__elapsed`},ut={key:1,class:`wb-log-summary__status wb-log-summary__status--pending`},dt={class:`wb-log-summary__label`},ft={key:2,class:`wb-log-summary__status wb-log-summary__status--done`},pt={key:0,class:`wb-log-summary__icon`},mt={key:1,class:`wb-log-summary__icon`},ht={class:`wb-log-summary__label`},gt={key:2,class:`wb-log-summary__elapsed`},_t={key:3},vt={class:`wb-log-summary__right`},yt={class:`wb-log-summary__meta`},bt=[`title`],xt={class:`wb-log-details__body`},St=[`open`],Ct={class:`wb-log-section__summary`},wt={class:`wb-log-section__tag wb-log-section__tag--user`},Tt={class:`wb-log-section__count`},Et=[`title`],Dt={class:`wb-log-section__pre wb-log-section__pre--user`},Ot=[`open`],kt={class:`wb-log-section__summary`},At={class:`wb-log-section__tag wb-log-section__tag--think`},jt={class:`wb-log-section__count`},$=[`title`],Mt={class:`wb-log-section__pre wb-log-section__pre--think`},Nt={class:`wb-log-pre__head`},Pt={class:`wb-log-pre__label`},Ft={class:`wb-log-pre__meta`},It=[`title`],Lt=[`title`,`disabled`],Rt={key:1,class:`wb-log-pre__empty`},zt={key:1,class:`wb-log-fullscreen__empty`},Bt=64*1024,Vt=60,Ht=K(D({__name:`JobLogDetails`,props:{job:{}},setup(e){let n=e,a=B(!1);function o(){a.value=!a.value}function c(){let e=n.job.output||``;return e?e.length<=Bt?e:`${G(`@WORKBENCH:…(前文已截断)`)}\n${e.slice(-65536)}`:``}async function l(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 u(e){let t=n.job[e]||``;if(!t){r.warning(G(`@WORKBENCH:暂无内容可复制`));return}await l(t)?r.success(G(`@WORKBENCH:已复制到剪贴板`)):r.error(G(`@WORKBENCH:复制失败`))}async function d(){let e=[];if(n.job.prompt&&e.push(`## ${G(`@WORKBENCH:用户提示词`)}\n\n${n.job.prompt}`),n.job.thinking&&e.push(`## ${G(`@WORKBENCH:Claude 思考`)}\n\n${n.job.thinking}`),n.job.output&&e.push(`## ${G(`@WORKBENCH:模型返回`)}\n\n${n.job.output}`),!e.length){r.warning(G(`@WORKBENCH:暂无内容可复制`));return}await l(e.join(`
3
+
4
+ ---
5
+
6
+ `))?r.success(G(`@WORKBENCH:已复制到剪贴板`)):r.error(G(`@WORKBENCH:复制失败`))}let f=W(()=>c()),p=W(()=>n.job.status===`running`||n.job.status===`pending`),m=W(()=>{let e=n.job.status;return e===`done`||e===`error`||e===`cancelled`}),h=B(0),_=null;function v(){b(),_=setInterval(()=>{let e=f.value.length;if(e===0){h.value=0,b();return}let t=Math.max(1,Math.ceil(Vt/30));h.value<e&&(h.value=Math.min(e,h.value+t)),h.value>=e&&b()},33)}function b(){_&&=(clearInterval(_),null)}j(()=>[n.job.output?.length||0,n.job.status],([e,t])=>{t===`done`||t===`error`||t===`cancelled`?(b(),h.value=e):h.value<e&&!_&&v()},{immediate:!0}),ge(()=>b());let x=W(()=>f.value.slice(0,h.value)),ee=W(()=>(n.job.output||``).slice(0,h.value)),C=W(()=>h.value>=(n.job.output||``).length),T=B(null);j(()=>n.job.status,(e,t)=>{e===`running`&&t!==`running`&&(T.value=T.value??Date.now())});let E=W(()=>{if(!T.value)return``;let e=T.value,t=n.job.endedAt?new Date(n.job.endedAt).getTime():Date.now(),r=Math.max(0,Math.floor((t-e)/1e3));return r<60?`${r}s`:`${Math.floor(r/60)}分${(r%60).toString().padStart(2,`0`)}秒`}),D=B(null),O=!1,te=B(!1);function ne(){if(O)return;let e=n.job.status;e===`running`||e===`pending`?te.value=(n.job.thinking||``).length>0:te.value=!1}function k(e){let t=e.target;O=!0,te.value=t.open}j(()=>n.job.status,(e,t)=>{!(t===`running`||t===`pending`)&&(e===`running`||e===`pending`)&&(O=!1),ne()}),j(()=>(n.job.thinking||``).length,()=>ne(),{immediate:!0});let re=!1,A=B(!0);function ie(e){let t=e.target;re=!0,A.value=t.open}j(()=>n.job.status,(e,t)=>{!(t===`running`||t===`pending`)&&(e===`running`||e===`pending`)?(re=!1,A.value=!0):re||(A.value=!0)}),j(()=>(n.job.output||``).length,async()=>{a.value||(await y(),D.value&&(D.value.scrollTop=D.value.scrollHeight))});let M=B(!1),ae=W(()=>!!(n.job.output&&n.job.output.length)),N=B(null);j(M,async e=>{e&&(await y(),N.value&&(N.value.scrollTop=N.value.scrollHeight))}),j(()=>(n.job.output||``).length,async()=>{M.value&&(await y(),N.value&&(N.value.scrollTop=N.value.scrollHeight))});function oe(){}return(n,r)=>{let c=de;return z(),S(`div`,{class:F([`wb-log-details`,{"is-running":p.value,"is-pending":e.job.status===`pending`,"is-finished":m.value}])},[t(`div`,{class:`wb-log-summary`,onClick:o,role:`button`,"aria-expanded":!a.value},[t(`span`,ot,[e.job.status===`running`?(z(),S(`span`,st,[t(`span`,ct,U(I(G)(`@WORKBENCH:正在执行…`)),1),r[5]||=t(`span`,{class:`wb-log-dots`,"aria-hidden":`true`},[t(`span`,{class:`wb-log-dots__dot`}),t(`span`,{class:`wb-log-dots__dot`}),t(`span`,{class:`wb-log-dots__dot`})],-1),E.value?(z(),S(`span`,lt,U(E.value),1)):s(``,!0)])):e.job.status===`pending`?(z(),S(`span`,ut,[t(`span`,dt,U(I(G)(`@WORKBENCH:排队中…`)),1),r[6]||=t(`span`,{class:`wb-log-dots`,"aria-hidden":`true`},[t(`span`,{class:`wb-log-dots__dot`}),t(`span`,{class:`wb-log-dots__dot`}),t(`span`,{class:`wb-log-dots__dot`})],-1)])):m.value?(z(),S(`span`,ft,[e.job.status===`error`?(z(),S(`span`,pt,`✗`)):(z(),S(`span`,mt,`✓`)),t(`span`,ht,U(e.job.status===`error`?I(G)(`@WORKBENCH:执行出错`):I(G)(`@WORKBENCH:执行完成`)),1),E.value?(z(),S(`span`,gt,U(E.value),1)):s(``,!0)])):(z(),S(`span`,_t,U(I(G)(`@WORKBENCH:查看执行日志`)),1))]),t(`span`,vt,[t(`span`,yt,U((e.job.output||``).length)+` `+U(I(G)(`@WORKBENCH:字符`)),1),t(`button`,{type:`button`,class:`wb-log-copy`,title:I(G)(`@WORKBENCH:复制全部(含提示词与输出)`),onClick:i(d,[`stop`])},` ⧉ `+U(I(G)(`@WORKBENCH:复制全部`)),9,bt)])],8,at),_e(t(`div`,xt,[e.job.prompt?(z(),S(`details`,{key:0,class:`wb-log-section`,open:A.value,onToggle:ie},[t(`summary`,Ct,[t(`span`,wt,U(I(G)(`@WORKBENCH:用户提示词`)),1),t(`span`,Tt,U((e.job.prompt||``).length)+` `+U(I(G)(`@WORKBENCH:字符`)),1),t(`button`,{type:`button`,class:`wb-log-copy wb-log-copy--sm`,title:I(G)(`@WORKBENCH:复制用户提示词`),onClick:r[0]||=i(e=>u(`prompt`),[`stop`])},` ⧉ `+U(I(G)(`@WORKBENCH:复制`)),9,Et)]),t(`pre`,Dt,U(e.job.prompt),1)],40,St)):s(``,!0),e.job.thinking?(z(),S(`details`,{key:1,class:`wb-log-section`,open:te.value,onToggle:k},[t(`summary`,kt,[t(`span`,At,U(I(G)(`@WORKBENCH:Claude 思考`)),1),t(`span`,jt,U((e.job.thinking||``).length)+` `+U(I(G)(`@WORKBENCH:字符`)),1),t(`button`,{type:`button`,class:`wb-log-copy wb-copy--sm`,title:I(G)(`@WORKBENCH:复制思考内容`),onClick:r[1]||=i(e=>u(`thinking`),[`stop`])},` ⧉ `+U(I(G)(`@WORKBENCH:复制`)),9,$)]),t(`pre`,Mt,U(e.job.thinking),1)],40,Ot)):s(``,!0),t(`div`,Nt,[t(`span`,Pt,U(I(G)(`@WORKBENCH:模型返回`)),1),t(`span`,Ft,U((e.job.output||``).length)+` `+U(I(G)(`@WORKBENCH:字符`)),1),t(`button`,{type:`button`,class:`wb-log-copy wb-log-copy--sm`,title:I(G)(`@WORKBENCH:复制模型返回`),onClick:r[2]||=i(e=>u(`output`),[`stop`])},` ⧉ `+U(I(G)(`@WORKBENCH:复制`)),9,It),t(`button`,{type:`button`,class:`wb-log-copy wb-log-copy--sm`,title:I(G)(`@WORKBENCH:全屏查看模型返回`),disabled:!ae.value,onClick:r[3]||=i(e=>M.value=!0,[`stop`])},` ⛶ `+U(I(G)(`@WORKBENCH:全屏`)),9,Lt)]),t(`div`,{ref_key:`preRef`,ref:D,class:`wb-log-pre`},[ae.value?(z(),w(I(ue),{key:0,content:x.value,final:C.value,typewriter:!1,class:`wb-log-pre__render`},null,8,[`content`,`final`])):(z(),S(`div`,Rt,U(I(G)(`@WORKBENCH:(暂无输出)`)),1))],512),V(c,{modelValue:M.value,"onUpdate:modelValue":r[4]||=e=>M.value=e,title:I(G)(`@WORKBENCH:模型返回 - 全屏查看`),fullscreen:``,"close-on-click-modal":!1,class:`wb-log-fullscreen-dialog`,onClosed:oe},{default:R(()=>[t(`div`,{ref_key:`fullscreenContainerRef`,ref:N,class:`wb-log-fullscreen`},[ae.value?(z(),w(I(ue),{key:0,content:ee.value,final:C.value,typewriter:!1,class:`wb-log-fullscreen__render`},null,8,[`content`,`final`])):(z(),S(`div`,zt,U(I(G)(`@WORKBENCH:(暂无输出)`)),1))],512)]),_:1},8,[`modelValue`,`title`])],512),[[g,!a.value]])],2)}}}),[[`__scopeId`,`data-v-70385c0f`]]);function Ut(e){switch(e){case`todo`:return G(`@WORKBENCH:待执行`);case`running`:return G(`@WORKBENCH:执行中`);case`done`:return G(`@WORKBENCH:已完成`);case`error`:return G(`@WORKBENCH:出错`);case`cancelled`:return G(`@WORKBENCH:已取消`);case`pending`:return G(`@WORKBENCH:排队中`);default:return e}}function Wt(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 Gt={class:`exec-logs`},Kt={class:`exec-logs__head`},qt={class:`exec-logs__title-block`},Jt={class:`exec-logs__stats`},Yt={class:`exec-logs__head-actions`},Xt={class:`exec-logs__config`},Zt={class:`exec-logs__config-label`},Qt={class:`exec-logs__config-field`},$t={class:`exec-logs__config-name`},en={class:`exec-logs__config-field`},tn={class:`exec-logs__config-name`},nn={class:`exec-logs__filter`},rn={key:0,class:`exec-logs__batch-meta`},an={key:0,class:`exec-logs__batch`},on={class:`exec-logs__list`},sn={key:0,class:`exec-logs__empty`},cn={class:`exec-logs__empty-art`,"aria-hidden":`true`},ln={class:`exec-logs__empty-title`},un={class:`exec-logs__empty-hint`},dn={class:`exec-card__head`},fn=[`title`],pn={class:`exec-card__meta`},mn={key:0,class:`exec-card__task`},hn={key:1,class:`exec-card__time`},gn={key:2,class:`exec-card__exit`},_n=[`title`,`onClick`],vn={key:0,class:`exec-card__error`},yn={key:1,class:`exec-logs__pager`},bn=50,xn=K(D({__name:`ExecutionLogManager`,setup(e){function n(e){return e instanceof Error?e.message:String(e)}let i=B([]),a=B(0),o=P({count:0,sizeMB:0,byStatus:{}}),c=B(!1),p=B(new Set),m=P({q:``,status:``,page:1}),h=B({maxCount:500,maxSizeMB:256}),g=P({maxCount:500,maxSizeMB:256}),y=B(!1),b=[{value:`pending`,label:G(`@WORKBENCH:排队中`)},{value:`running`,label:G(`@WORKBENCH:执行中`)},{value:`done`,label:G(`@WORKBENCH:已完成`)},{value:`error`,label:G(`@WORKBENCH:出错`)},{value:`cancelled`,label:G(`@WORKBENCH:已取消`)}],x=W(()=>i.value.length>0&&i.value.every(e=>p.value.has(e.id))),C=W(()=>i.value.some(e=>p.value.has(e.id))&&!x.value);async function w(){c.value=!0;try{let e=new URLSearchParams;m.q&&e.set(`q`,m.q),m.status&&e.set(`status`,m.status),e.set(`limit`,String(bn)),e.set(`offset`,String((m.page-1)*bn));let t=await fetch(`/api/workbench/jobs/list?${e.toString()}`).then(e=>e.json());if(!t.success)throw Error(t.error||`list failed`);i.value=t.jobs,a.value=t.total,o.count=t.stats.count,o.sizeMB=t.stats.sizeMB,o.byStatus=t.stats.byStatus;let n=new Set(i.value.map(e=>e.id));for(let e of Array.from(p.value))n.has(e)||p.value.delete(e)}catch(e){r.error(G(`@WORKBENCH:加载失败`)+`: `+n(e))}finally{c.value=!1}}async function T(){try{let e=await fetch(`/api/workbench/jobs/config`).then(e=>e.json());e.success&&(h.value=e.config,g.maxCount=e.config.maxCount,g.maxSizeMB=e.config.maxSizeMB)}catch{}}async function D(){y.value=!0;try{let e=await fetch(`/api/workbench/jobs/config`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({maxCount:g.maxCount,maxSizeMB:g.maxSizeMB})}).then(e=>e.json());if(!e.success)throw Error(e.error||`save failed`);h.value=e.config,r.success(G(`@WORKBENCH:已保存策略`)),await w()}catch(e){r.error(G(`@WORKBENCH:保存失败`)+`: `+n(e))}finally{y.value=!1}}function O(){m.page=1,w()}function k(){m.q=``,m.status=``,m.page=1,w()}function re(e,t){t?p.value.add(e):p.value.delete(e),p.value=new Set(p.value)}function j(e){if(e)for(let e of i.value)p.value.add(e.id);else for(let e of i.value)p.value.delete(e.id);p.value=new Set(p.value)}async function M(e){try{await _.confirm(G(`@WORKBENCH:确定要删除所选的 {count} 条日志吗?`,{count:1}),G(`@WORKBENCH:删除`),{type:`warning`})}catch{return}try{let t=await fetch(`/api/workbench/jobs/${e}`,{method:`DELETE`}).then(e=>e.json());if(!t.success)throw Error(t.error||`delete failed`);p.value.delete(e),p.value=new Set(p.value),await w()}catch(e){r.error(G(`@WORKBENCH:保存失败`)+`: `+n(e))}}async function N(){let e=Array.from(p.value);if(e.length!==0){try{await _.confirm(G(`@WORKBENCH:确定要删除所选的 {count} 条日志吗?`,{count:e.length}),G(`@WORKBENCH:批量删除`),{type:`warning`})}catch{return}try{let t=await fetch(`/api/workbench/jobs/batch-delete`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({ids:e})}).then(e=>e.json());if(!t.success)throw Error(t.error||`batch delete failed`);r.success(G(`@WORKBENCH:成功删除 {count} 条`,{count:t.removed||e.length})),p.value=new Set,await w()}catch(e){r.error(G(`@WORKBENCH:保存失败`)+`: `+n(e))}}}async function se(){let e=o.count;if(e!==0){try{await _.confirm(G(`@WORKBENCH:确定要清空所有 {count} 条执行日志吗?此操作不可恢复。`,{count:e}),G(`@WORKBENCH:清空全部`),{type:`warning`,confirmButtonText:G(`@WORKBENCH:清空全部`)})}catch{return}try{let t=await fetch(`/api/workbench/jobs/clear`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({confirm:!0})}).then(e=>e.json());if(!t.success)throw Error(t.error||`clear failed`);r.success(G(`@WORKBENCH:成功删除 {count} 条`,{count:t.removed||e})),p.value=new Set,await w()}catch(e){r.error(G(`@WORKBENCH:保存失败`)+`: `+n(e))}}}function ce(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 oe(()=>{w(),T()}),(e,n)=>{let r=pe,h=E,_=ne,T=ve,oe=ae,P=ie,le=ee,ue=d,de=l;return z(),S(`div`,Gt,[t(`header`,Kt,[t(`div`,qt,[t(`span`,Jt,U(I(G)(`@WORKBENCH:共 {count} 条,占 {size} MB`,{count:o.count,size:o.sizeMB})),1)]),t(`div`,Yt,[V(r,{icon:I(A),size:`small`,loading:c.value,onClick:w},{default:R(()=>[f(U(I(G)(`@WORKBENCH:刷新`)),1)]),_:1},8,[`icon`,`loading`]),V(r,{type:`danger`,plain:``,size:`small`,disabled:o.count===0,onClick:se},{default:R(()=>[f(U(I(G)(`@WORKBENCH:清空全部`)),1)]),_:1},8,[`disabled`])])]),t(`div`,Xt,[t(`span`,Zt,U(I(G)(`@WORKBENCH:保存策略`)),1),t(`span`,Qt,[t(`span`,$t,U(I(G)(`@WORKBENCH:最大条数`)),1),V(h,{modelValue:g.maxCount,"onUpdate:modelValue":n[0]||=e=>g.maxCount=e,min:0,max:1e4,step:50,size:`small`,"controls-position":`right`,style:{width:`130px`}},null,8,[`modelValue`])]),t(`span`,en,[t(`span`,tn,U(I(G)(`@WORKBENCH:最大体积 (MB)`)),1),V(h,{modelValue:g.maxSizeMB,"onUpdate:modelValue":n[1]||=e=>g.maxSizeMB=e,min:0,max:10240,step:32,size:`small`,"controls-position":`right`,style:{width:`140px`}},null,8,[`modelValue`])]),V(r,{type:`primary`,size:`small`,loading:y.value,onClick:D},{default:R(()=>[f(U(I(G)(`@WORKBENCH:保存策略`)),1)]),_:1},8,[`loading`])]),t(`div`,nn,[V(_,{modelValue:m.q,"onUpdate:modelValue":n[2]||=e=>m.q=e,placeholder:I(G)(`@WORKBENCH:搜索标题 / 任务`),clearable:``,size:`small`,style:{width:`240px`},onKeyup:v(O,[`enter`]),onClear:O},null,8,[`modelValue`,`placeholder`]),V(oe,{modelValue:m.status,"onUpdate:modelValue":n[3]||=e=>m.status=e,placeholder:I(G)(`@WORKBENCH:全部状态`),clearable:``,size:`small`,style:{width:`130px`},onChange:O},{default:R(()=>[(z(),S(u,null,L(b,e=>V(T,{key:e.value,label:e.label,value:e.value},null,8,[`label`,`value`])),64))]),_:1},8,[`modelValue`,`placeholder`]),V(r,{size:`small`,onClick:k},{default:R(()=>[f(U(I(G)(`@WORKBENCH:重置`)),1)]),_:1}),n[5]||=t(`span`,{class:`exec-logs__filter-spacer`},null,-1),p.value.size>0?(z(),S(`span`,rn,U(I(G)(`@WORKBENCH:已选择 {count} 项`,{count:p.value.size})),1)):s(``,!0)]),p.value.size>0?(z(),S(`div`,an,[V(P,{"model-value":x.value,indeterminate:C.value,onChange:j},{default:R(()=>[f(U(x.value?I(G)(`@WORKBENCH:取消全选`):I(G)(`@WORKBENCH:全选`)),1)]),_:1},8,[`model-value`,`indeterminate`]),V(r,{type:`danger`,size:`small`,onClick:N},{default:R(()=>[f(U(I(G)(`@WORKBENCH:批量删除`)),1)]),_:1})])):s(``,!0),_e((z(),S(`div`,on,[!c.value&&i.value.length===0?(z(),S(`div`,sn,[t(`div`,cn,[V(le,null,{default:R(()=>[V(I(Se))]),_:1})]),t(`div`,ln,U(I(G)(`@WORKBENCH:暂无执行日志`)),1),t(`div`,un,U(I(G)(`@WORKBENCH:点击「执行任务」开始一次执行,日志会出现在这里。`)),1)])):s(``,!0),(z(!0),S(u,null,L(i.value,e=>(z(),S(`article`,{key:e.id,class:F([`exec-card`,{"is-selected":p.value.has(e.id)}])},[t(`header`,dn,[V(P,{"model-value":p.value.has(e.id),onChange:t=>re(e.id,t)},null,8,[`model-value`,`onChange`]),t(`span`,{class:`exec-card__status`,style:te({color:I(Wt)(e.status),borderColor:I(Wt)(e.status)})},U(I(Ut)(e.status)),5),t(`span`,{class:`exec-card__title`,title:e.title||I(G)(`@WORKBENCH:无标题`)},U(e.title||I(G)(`@WORKBENCH:无标题`)),9,fn),n[6]||=t(`span`,{class:`exec-card__spacer`},null,-1),t(`span`,pn,[e.taskTitle?(z(),S(`span`,mn,`📁 `+U(e.taskTitle),1)):s(``,!0),e.startedAt?(z(),S(`span`,hn,`⏱ `+U(ce(e.startedAt,e.endedAt)),1)):s(``,!0),e.exitCode===null?s(``,!0):(z(),S(`span`,gn,`exit `+U(e.exitCode),1))]),t(`button`,{type:`button`,class:`exec-card__del`,title:I(G)(`@WORKBENCH:删除`),onClick:t=>M(e.id)},`×`,8,_n)]),e.error?(z(),S(`p`,vn,`⚠ `+U(e.error),1)):s(``,!0),V(Ht,{job:e},null,8,[`job`])],2))),128))])),[[de,c.value]]),a.value>bn?(z(),S(`footer`,yn,[V(ue,{"current-page":m.page,"onUpdate:currentPage":n[4]||=e=>m.page=e,"page-size":bn,total:a.value,layout:`prev, pager, next, total`,background:``,small:``,onCurrentChange:w},null,8,[`current-page`,`total`])])):s(``,!0)])}}}),[[`__scopeId`,`data-v-174a9b87`]]),Sn={class:`workbench`},Cn={class:`workbench__editor-row`},wn={class:`wb-sidebar`},Tn={class:`wb-section`},En={class:`wb-section__head`},Dn={class:`wb-section__tag`},On={class:`wb-section__title`},kn={class:`wb-pill wb-section__count`},An={class:`wb-task-list`},jn=[`aria-expanded`,`title`,`onClick`,`onKeydown`],Mn=[`title`],Nn={class:`wb-pill wb-task-group__count`},Pn=[`data-icon`,`onClick`],Fn=[`data-icon`],In={class:`wb-task-item__body`},Ln=[`title`],Rn={class:`wb-task-item__meta`},zn=[`title`],Bn={class:`wb-pill wb-task-item__num`},Vn=[`title`],Hn={class:`wb-pill wb-task-item__num`},Un=[`title`],Wn=[`title`,`aria-label`],Gn=[`title`],Kn=[`onClick`,`title`,`aria-label`],qn={key:0,class:`wb-empty wb-empty--rich`},Jn={class:`wb-empty__art`,"aria-hidden":`true`},Yn={class:`wb-empty__title`},Xn={class:`wb-empty__hint`},Zn={class:`wb-empty__cta`},Qn={class:`wb-section`},$n={class:`wb-section__head`},er={class:`wb-section__tag wb-section__tag--accent`},tr={class:`wb-section__title`},nr={class:`wb-pill wb-section__count`},rr=[`title`,`aria-label`],ir={class:`wb-prompt-list`},ar={class:`wb-prompt-item__icon`},or=[`onClick`,`title`],sr=[`title`],cr=[`onClick`,`title`,`aria-label`],lr={key:0,class:`wb-empty wb-empty--compact`},ur={class:`wb-split`},dr={key:0,class:`wb-placeholder`},fr={class:`wb-split__header`},pr=[`placeholder`],mr=[`title`],hr={key:0,class:`wb-meta-save__dot`},gr={key:1,class:`wb-meta-save__check`},_r={key:2,class:`wb-meta-save__bang`},vr={key:3,class:`wb-meta-save__dot`},yr={value:null},br=[`value`],xr=[`aria-label`],Sr=[`aria-selected`],Cr=[`aria-selected`],wr=[`disabled`,`title`],Tr=[`title`,`aria-label`],Er=[`open`],Dr={class:`wb-task-desc__summary`},Or={class:`wb-task-desc__label`},kr={key:0,class:`wb-task-desc__tag`},Ar={key:0},jr={key:1,class:`wb-task-desc__tag-attachment`},Mr=[`placeholder`],Nr={key:0,class:`wb-exec-list`},Pr={class:`wb-exec-list__header`},Fr={class:`wb-exec-list__title`},Ir={class:`wb-split__sub-actions`},Lr={key:0,class:`wb-dirty-badge`},Rr={class:`wb-exec-sub-list`},zr=[`onClick`],Br={class:`wb-exec-sub-item__row1`},Vr=[`title`],Hr=[`title`],Ur={key:0,class:`wb-exec-sub-item__dirty-dot`,title:`未保存`},Wr={class:`wb-exec-sub-item__row2`},Gr={key:0,class:`wb-sub-item__pid`},Kr={class:`wb-exec-sub-item__actions`},qr=[`title`,`onClick`],Jr=[`title`,`onClick`],Yr=[`title`,`disabled`,`onClick`],Xr=[`title`,`disabled`,`onClick`],Zr={key:0,class:`wb-empty wb-empty--rich`},Qr={class:`wb-empty__art`,"aria-hidden":`true`},$r={class:`wb-empty__title`},ei={class:`wb-empty__hint`},ti={class:`wb-empty__cta`},ni=[`disabled`],ri={class:`wb-exec-detail`},ii={key:0,class:`wb-placeholder`},ai={class:`wb-exec-detail__head`},oi=[`placeholder`],si=[`title`],ci=[`placeholder`],li={class:`wb-form-item__label wb-simple__override-summary`},ui=[`title`],di=[`disabled`],fi=[`placeholder`],pi={style:{display:`flex`,gap:`8px`,"align-items":`center`}},mi=`__simple`,hi=`__no_project__`,gi=`.png,.jpg,.jpeg,.gif,.webp,.bmp,.svg,.pdf,.txt,.md,.csv,.json,.log`,_i=5*1024*1024,vi=K(D({__name:`WorkbenchView`,setup(o){let l=B([]),d=B([]),g=B([]),y=B(!1),b=B(null),x=W(()=>d.value.find(e=>e.id===b.value)||null),C=W(()=>x.value?.type===`simple`),T=B(null),E=W(()=>!x.value||C.value||!T.value?null:x.value.subtasks.find(e=>e.id===T.value)||null),D=B(new Map),A=B({title:``,desc:``,promptId:null,simpleOverride:``});function ie(){let e=new Map;if(x.value)for(let t of x.value.subtasks)e.set(t.id,{id:t.id,title:t.title,desc:t.desc,promptOverride:t.promptOverride});D.value=e,x.value?A.value={title:x.value.title,desc:x.value.desc,promptId:x.value.promptId,simpleOverride:x.value.simpleOverride||``}:A.value={title:``,desc:``,promptId:null,simpleOverride:``}}let le=W(()=>{let e=new Set;if(!x.value)return e;for(let t of x.value.subtasks){let n=D.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}),ue=W(()=>le.value.size>0),H=B(`idle`),ge=B(0),be=null,K=W(()=>{if(!x.value)return!1;let e=x.value;return A.value.title!==e.title||A.value.desc!==e.desc||A.value.promptId!==e.promptId||A.value.simpleOverride!==(e.simpleOverride||``)});function we(){be!==null&&(clearTimeout(be),be=null)}async function Te(){if(!x.value)return!1;if(!K.value)return!0;if(H.value=`saving`,await yt(!1))return ge.value=Date.now(),H.value=`saved`,setTimeout(()=>{H.value===`saved`&&Date.now()-ge.value>=4e3&&(H.value=`idle`)},4e3),!0;H.value=`error`;let e=Date.now();return setTimeout(()=>{H.value===`error`&&Date.now()-e>=4e3&&(H.value=`idle`)},4e3),!1}j(()=>x.value?{id:x.value.id,title:x.value.title,desc:x.value.desc,promptId:x.value.promptId,simpleOverride:x.value.simpleOverride||``}:null,(e,t)=>{!e||!t||e.id!==t.id||(be!==null&&clearTimeout(be),be=window.setTimeout(()=>{Te()},1500))},{deep:!0}),j(b,async(e,t)=>{we(),x.value&&K.value&&await Te()}),j(b,()=>{xt.value=!1});function Ee(e){try{let t=new Blob([JSON.stringify(e)],{type:`application/json`});navigator.sendBeacon?.(`/api/workbench/tasks`,t)}catch{}}function De(){x.value&&K.value&&Ee(x.value)}let q=P({visible:!1,editing:null,name:``,content:``,aiLoading:!1}),J=P({visible:!1,text:``,loading:!1,saving:!1}),Oe=B(!1),Y=P({visible:!1,editing:null,title:``,desc:``,promptId:null,type:`complex`,simpleOverride:``}),X=null,ke=Ce();function Ae(){ke.setRunning(g.value.filter(e=>e.status===`running`).length)}function Z(e){return g.value.find(t=>t.subId===e)||null}function je(e,t){if(e===`hello`){g.value=t.jobs||[],Ae();return}if(e===`job:update`){let e=t,n=g.value.findIndex(t=>t.id===e.id);n>=0?g.value[n]=e:g.value.push(e),Ae();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=g.value.findIndex(e=>e.id===t.id);if(i<0)return;let a=g.value[i][n]||``;g.value[i][n]=a+r;return}if(e===`sub:update`){let e=d.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=d.value.findIndex(e=>e.id===t.id);e>=0&&(d.value[e]=t)}e===`task:error`&&r.error(t.error||G(`@WORKBENCH:执行出错`))}let Me=[{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 Ne(e){let t=(e||``).trim();if(!t)return`doc`;for(let e of Me)if(e.patterns.some(e=>e.test(t)))return e.key;return`doc`}let Pe={icon:M(Se),image:M(se),test:M(c),ui:M(N),doc:M(Se),idea:M(N)};function Fe(e){return Pe[Ne(e.title)]}function Ie(e){return e?Z(`${e.id}${mi}`):null}function Le(e){return e?e.status===`pending`||e.status===`running`?`running`:e.status===`done`?`done`:e.status===`cancelled`?`cancelled`:`error`:`idle`}function Re(e){return Array.isArray(e.attachments)?e.attachments.length:0}function ze(e){return Array.isArray(e.subtasks)?e.subtasks.length:0}function Be(e){return Array.isArray(e.subtasks)?e.subtasks.filter(e=>e&&e.status===`done`).length:0}function Ve(e){return Array.isArray(e.subtasks)?e.subtasks.some(e=>e&&e.status===`running`):!1}async function He(){l.value=(await fetch(`/api/workbench/prompts`).then(e=>e.json()).catch(()=>({prompts:[]}))).prompts||[]}async function Ue(){d.value=(await fetch(`/api/workbench/tasks`).then(e=>e.json()).catch(()=>({tasks:[]}))).tasks||[],!b.value&&d.value.length>0&&(b.value=d.value[0].id),ie()}let Q=B({path:``,name:``});async function We(){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 Ke=B(new Set);function qe(e){return Ke.value.has(e)}function Je(e){Ke.value.has(e)?Ke.value.delete(e):Ke.value.add(e),Ke.value=new Set(Ke.value)}let Ye=W(()=>{let e=d.value,t=new Map;for(let n of e){let e=(n.projectPath||``).trim()||hi;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===hi?1:t===hi?-1:e.localeCompare(t));return{groups:r.map(e=>({path:e,label:e===hi?G(`@WORKBENCH:未关联项目`):e,tasks:t.get(e)})),hasMultiple:r.length>1}});function Xe(e){if(!e||e===hi)return e;let t=e.split(/[\\/]/).filter(Boolean);return t.length<=1?e:t.slice(-2).join(`/`)}j(()=>Ye.value.groups.map(e=>e.path),e=>{let t=Q.value.path,n=new Set(Ke.value),r=!1;for(let i of e)i!==t&&!n.has(i)&&(n.add(i),r=!0);r&&(Ke.value=n)},{immediate:!0});async function Ze(){g.value=(await fetch(`/api/workbench/jobs`).then(e=>e.json()).catch(()=>({jobs:[]}))).jobs||[],Ae()}async function Qe(e){try{let t=await fetch(`/api/workbench/jobs/by-task/${encodeURIComponent(e)}`,{method:`DELETE`}).then(e=>e.json());return t?.success?(g.value=g.value.filter(t=>t.taskId!==e),Ae(),t.removed||0):(console.warn(`[clearJobsByTask] failed:`,t?.error),0)}catch(e){return console.warn(`[clearJobsByTask] error:`,e),0}}function $e(){X&&=(X.close(),null),X=new EventSource(`/api/workbench/events`),X.onmessage=e=>{try{let t=JSON.parse(e.data);je(t.event,t.payload)}catch{}},X.onerror=()=>{X&&=(X.close(),null),setTimeout($e,3e3)}}function et(){q.editing=null,q.name=``,q.content=``,q.aiLoading=!1,q.visible=!0}function tt(e){q.editing=e,q.name=e.name,q.content=e.content,q.aiLoading=!1,q.visible=!0}async function nt(){if(!q.aiLoading){q.aiLoading=!0;try{let e=await fetch(`/api/workbench/prompts/ai-generate`,{method:`POST`}).then(e=>e.json());e.success?(q.name=e.name||q.name,q.content=e.result||``,r.success(G(`@WORKBENCH:已生成,可继续编辑`))):r.error(e.error||G(`@WORKBENCH:生成失败`))}catch(e){r.error(G(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}finally{q.aiLoading=!1}}}async function rt(){J.visible=!0,J.loading=!0;try{let e=await fetch(`/api/workbench/prompts/ai-instruction`).then(e=>e.json());e.success?J.text=e.instruction||``:r.error(e.error||G(`@WORKBENCH:读取指令失败`))}catch(e){r.error(G(`@WORKBENCH:读取指令失败`)+`: `+(e&&e.message||e))}finally{J.loading=!1}}async function at(){if(!J.text.trim()){r.warning(G(`@WORKBENCH:指令内容不能为空`));return}J.saving=!0;try{let e=await fetch(`/api/workbench/prompts/ai-instruction`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({instruction:J.text})}).then(e=>e.json());e.success?(r.success(G(`@WORKBENCH:已保存指令`)),J.visible=!1):r.error(e.error||G(`@WORKBENCH:保存失败`))}catch(e){r.error(G(`@WORKBENCH:网络错误: `)+(e&&e.message||e))}finally{J.saving=!1}}async function ot(){if(!q.name.trim()||!q.content.trim()){r.warning(G(`@WORKBENCH:名称和内容不能为空`));return}let e={id:q.editing?.id,name:q.name.trim(),content:q.content},t=await fetch(`/api/workbench/prompts`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}).then(e=>e.json());t.success?(r.success(G(`@WORKBENCH:已保存`)),q.visible=!1,He()):r.error(t.error||G(`@WORKBENCH:保存失败`))}async function st(e){await _.confirm(G(`@WORKBENCH:删除提示词「{name}」?`,{name:e.name}),G(`@WORKBENCH:确认`),{type:`warning`}),await fetch(`/api/workbench/prompts/${e.id}`,{method:`DELETE`}),He();for(let t of d.value)t.promptId===e.id&&(t.promptId=null,await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}));Ue()}function ct(){Y.editing=null,Y.title=``,Y.desc=``,Y.promptId=null,Y.type=`simple`,Y.simpleOverride=``,Y.visible=!0}async function lt(){let e={id:Y.editing?.id,title:Y.title.trim(),desc:Y.desc,promptId:Y.promptId,type:Y.type,simpleOverride:Y.type===`simple`?Y.simpleOverride:``,subtasks:Y.editing?.subtasks||[]};!Y.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){r.success(G(`@WORKBENCH:已保存`));let e=!Y.editing?.id;Y.visible=!1,await Ue(),e&&t.task?.id?(b.value=t.task.id,ie()):b.value||=t.task.id}else r.error(t.error||G(`@WORKBENCH:保存失败`))}async function ut(e,t){if(e.type===t)return;let n=e.type===`complex`&&t===`simple`&&(e.subtasks?.length??0)>0;if(n)try{await _.confirm(G(`@WORKBENCH:任务「{title}」当前有 {n} 个子任务,切换为简单任务后会清空这些子任务,确认继续?`,{title:e.title,n:e.subtasks.length}),G(`@WORKBENCH:切换任务类型`),{type:`warning`,confirmButtonText:G(`@WORKBENCH:切换并清空`),cancelButtonText:G(`@WORKBENCH:取消`)})}catch{return}let i={id:e.id,title:e.title,desc:e.desc,promptId:e.promptId,type:t,simpleOverride:e.simpleOverride||``,subtasks:n?[]:e.subtasks||[]},a=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(i)}).then(e=>e.json());if(!a.success){r.error(a.error||G(`@WORKBENCH:保存失败`));return}await Ue(),r.success(G(t===`simple`?`@WORKBENCH:已切换为简单任务`:`@WORKBENCH:已切换为复杂任务`))}async function dt(e){x.value&&await ut(x.value,e)}async function ft(e){await _.confirm(G(`@WORKBENCH:删除任务「{title}」及其所有子任务?`,{title:e.title}),G(`@WORKBENCH:确认`),{type:`warning`}),await fetch(`/api/workbench/tasks/${e.id}`,{method:`DELETE`}),b.value===e.id&&(b.value=null),Ue()}async function pt(e){b.value!==e.id&&(we(),x.value&&K.value&&await Te(),b.value=e.id,ie())}j(()=>x.value,e=>{if(!e||e.type===`simple`){T.value=null;return}T.value=e.subtasks.find(e=>e.status===`running`)?.id||e.subtasks[0]?.id||null},{immediate:!0}),j(()=>x.value?.subtasks?.length,()=>{!x.value||C.value||(!T.value||!x.value.subtasks.find(e=>e.id===T.value))&&(T.value=x.value.subtasks[0]?.id||null)});let mt=B(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(!x.value)return;let e={id:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`,title:G(`@WORKBENCH:新子任务`),desc:``,status:`todo`,promptOverride:``};x.value.subtasks.push(e),gt(e.id,!0);try{await yt(!1)}finally{gt(e.id,!1)}}async function vt(e){if(x.value){x.value.subtasks=x.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(!x.value)return!1;let t=await fetch(`/api/workbench/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(x.value)}).then(e=>e.json());return t.success?(e&&r.success(G(`@WORKBENCH:已保存拆分`)),await Ue(),!0):(r.error(t.error||G(`@WORKBENCH:保存失败`)),!1)}async function bt(){await yt(!0)}let xt=B(!1);function St(){if(x.value){if(!(x.value.title||``).trim()){r.warning(G(`@WORKBENCH:请先填写任务标题`));return}xt.value=!0}}function Ct(e){if(x.value){for(let t of e)x.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:[]});r.success(G(`@WORKBENCH:已生成 {n} 个子任务,请审阅后保存`,{n:e.length}))}}async function wt(e){if(e.type===`simple`)return Tt(e);if(!e.subtasks||e.subtasks.length===0){r.warning(G(`@WORKBENCH:请先拆分任务`));return}if(x.value&&x.value.id===e.id){let t=d.value.find(t=>t.id===e.id);if((!t||t.title!==x.value.title||t.desc!==x.value.desc||JSON.stringify(t.subtasks)!==JSON.stringify(x.value.subtasks)||t.promptId!==x.value.promptId)&&!await yt(!1))return}await Qe(e.id);let t=await fetch(`/api/workbench/tasks/${e.id}/run`,{method:`POST`}).then(e=>e.json());t.success?r.success(t.message||G(`@WORKBENCH:已加入执行队列`)):r.error(t.error||G(`@WORKBENCH:执行失败`))}async function Tt(e){if(x.value&&x.value.id===e.id){let t=d.value.find(t=>t.id===e.id);if((!t||t.title!==x.value.title||t.desc!==x.value.desc||t.promptId!==x.value.promptId||(t.simpleOverride||``)!==(x.value.simpleOverride||``))&&!await yt(!1))return}await Qe(e.id);let t=await fetch(`/api/workbench/tasks/${e.id}/run-simple`,{method:`POST`}).then(e=>e.json());t.success?r.success(t.message||G(`@WORKBENCH:已加入执行队列`)):r.error(t.error||G(`@WORKBENCH:执行失败`))}async function Et(e){if(!x.value)return;let t=x.value,n=Z(e.id);if(n&&(n.status===`running`||n.status===`pending`)){r.warning(G(`@WORKBENCH:该子任务正在执行中`));return}let i=d.value.find(e=>e.id===t.id);if((!i||i.title!==t.title||i.desc!==t.desc||JSON.stringify(i.subtasks)!==JSON.stringify(t.subtasks)||i.promptId!==t.promptId)&&!await yt(!1))return;let a=await fetch(`/api/workbench/subtasks/${e.id}/run`,{method:`POST`}).then(e=>e.json()).catch(e=>({success:!1,error:e?.message||String(e)}));a.success?r.success(a.message||G(`@WORKBENCH:已开始执行子任务`)):r.error(a.error||G(`@WORKBENCH:执行失败`))}function Dt(e){if(e.status===`done`)return!1;let t=Z(e.id);return!(t&&(t.status===`running`||t.status===`pending`))}async function Ot(e){if(x.value&&!ht(e.id)){gt(e.id,!0);try{let t=D.value.get(e.id);t&&D.value.set(e.id,{...t,status:`todo`}),e.status=`todo`,await yt(!1)}finally{gt(e.id,!1)}}}async function kt(e){try{await _.confirm(G(`@WORKBENCH:确认停止执行?已输出的内容会保留。`),G(`@WORKBENCH:停止执行`),{confirmButtonText:G(`@WORKBENCH:停止`),cancelButtonText:G(`@WORKBENCH:取消`),type:`warning`})}catch{return}let t=await fetch(`/api/workbench/jobs/${e.id}/cancel`,{method:`POST`}).then(e=>e.json()).catch(e=>({success:!1,error:e?.message||String(e)}));t.success?r.success(G(`@WORKBENCH:已发送停止信号`)):r.error(t.error||G(`@WORKBENCH:停止失败`))}oe(async()=>{await Promise.all([He(),Ue(),We(),Ze()]),$e(),window.addEventListener(`beforeunload`,De)}),e(()=>{X&&=(X.close(),null),window.removeEventListener(`beforeunload`,De),x.value&&K.value&&Ee(x.value)});let At=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`]),jt=B({}),$=B(null);function Mt(e){return!!jt.value[e]}function Nt(e,t){if(e instanceof File)return e;let n=e.type||`application/octet-stream`;return new File([e],t,{type:n})}function Pt(e){return e.kind===`task`?`task-${e.task?.id??``}`:`sub-${e.sub.id}`}function Ft(e){let t=e.kind===`task`?e.task?.attachments:e.sub.attachments;return Array.isArray(t)?t:[]}function It(e,t){e.kind===`task`?e.task&&(e.task.attachments=t):e.sub.attachments=t}function Lt(e){return e.kind===`task`?`/api/workbench/tasks/${e.task?.id??``}/attachments`:`/api/workbench/subtasks/${e.sub.id}/attachments`}function Rt(e,t){return e.kind===`task`?`/api/workbench/tasks/${e.task?.id??``}/attachments/${t}`:`/api/workbench/subtasks/${e.sub.id}/attachments/${t}`}function zt(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`);Vt(t,Nt(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&&Vt(t,Nt(n,n.name||`pasted-file`))}}}function Bt(e,t){$.value=null,Array.from(e.dataTransfer?.files||[]).forEach(e=>Vt(t,e))}async function Vt(e,t){if(t.size>_i){r.error(`「${t.name}」${G(`@WORKBENCH:超过 5MB 限制`)}`);return}if(!At.has(t.type)&&!t.name.match(/\.(png|jpg|jpeg|gif|webp|bmp|svg|pdf|txt|md|markdown|csv|json|log)$/i)){r.error(`${G(`@WORKBENCH:不支持的文件类型`)}(${t.name})`);return}let n=Ft(e);if(n.length>=9){r.error(G(`@WORKBENCH:单个任务最多 9 个附件`));return}if(n.find(e=>e.originalName===t.name&&e.size===t.size)){r.info(`${t.name} ${G(`@WORKBENCH:已存在,已复用`)}`);return}let i=Pt(e);jt.value[i]=!0;try{let n=await fetch(Lt(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 i=Ft(e);i.push(n.attachment),It(e,i),r.success(`${G(`@WORKBENCH:已添加:`)}${t.name}`)}else r.error(n.error||G(`@WORKBENCH:上传失败`))}catch(e){r.error(G(`@WORKBENCH:上传失败`)+`:`+(e&&e.message||e))}finally{jt.value[i]=!1}}async function Ut(e,t){try{await _.confirm(G(`@WORKBENCH:删除附件「{name}」?`,{name:t.originalName}),G(`@WORKBENCH:确认`),{type:`warning`})}catch{return}let n=await fetch(Rt(e,t.id),{method:`DELETE`}).then(e=>e.json());n.success?(It(e,Ft(e).filter(e=>e.id!==t.id)),r.success(G(`@WORKBENCH:已删除`))):r.error(n.error||G(`@WORKBENCH:删除失败`))}function Gt(e){let t=document.createElement(`input`);t.type=`file`,t.accept=gi,t.multiple=!0,t.onchange=()=>{Array.from(t.files||[]).forEach(t=>Vt(e,t))},t.click()}let Kt=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`bmp`,`svg`]);function qt(e){return Kt.has(String(e.ext||``).toLowerCase())}function Jt(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(2)} MB`}return(e,r)=>{let o=ee,c=pe,g=de,_=ne,D=re,A=xe,j=fe,ie=he,M=ve,oe=ae;return z(),S(`div`,Sn,[t(`div`,Cn,[t(`aside`,wn,[t(`section`,Tn,[t(`header`,En,[t(`span`,Dn,U(I(G)(`@WORKBENCH:任务`)),1),t(`h3`,On,U(I(G)(`@WORKBENCH:任务列表`)),1),t(`span`,kn,U(d.value.length),1)]),t(`button`,{class:`wb-new-btn`,onClick:ct},[V(o,{class:`wb-new-btn__icon`},{default:R(()=>[V(I(k))]),_:1}),t(`span`,null,U(I(G)(`@WORKBENCH:新建任务`)),1),r[43]||=t(`span`,{class:`wb-new-btn__shortcut`},`N`,-1)]),t(`ul`,An,[(z(!0),S(u,null,L(Ye.value.groups,e=>(z(),S(u,{key:e.path},[Ye.value.hasMultiple?(z(),S(`li`,{key:0,class:F([`wb-task-group__head`,{"is-current":e.path===Q.value.path,"is-collapsed":qe(e.path)}]),role:`button`,tabindex:`0`,"aria-expanded":!qe(e.path),title:qe(e.path)?I(G)(`@WORKBENCH:展开`):I(G)(`@WORKBENCH:收起`),onClick:t=>Je(e.path),onKeydown:[v(i(t=>Je(e.path),[`prevent`]),[`enter`]),v(i(t=>Je(e.path),[`prevent`]),[`space`])]},[V(o,{class:`wb-task-group__caret`},{default:R(()=>[(z(),w(me(qe(e.path)?I(ye):I(n))))]),_:2},1024),V(o,{class:`wb-task-group__icon`},{default:R(()=>[V(I(a))]),_:1}),t(`span`,{class:`wb-task-group__name`,title:e.path===Q.value.path?Q.value.path:e.label},U(e.path===Q.value.path?Q.value.name:Xe(e.label)),9,Mn),t(`span`,Nn,U(e.tasks.length),1)],42,jn)):s(``,!0),qe(e.path)?s(``,!0):(z(!0),S(u,{key:1},L(e.tasks,e=>(z(),S(`li`,{key:e.id,class:F([`wb-task-item`,{active:e.id===b.value,"has-attachment":Re(e)>0,"is-other-project":e.projectPath&&e.projectPath!==Q.value.path,"is-running":Ve(e)}]),"data-icon":Ne(e.title),onClick:t=>pt(e)},[t(`div`,{class:`wb-task-item__avatar`,"data-icon":Ne(e.title)},[V(o,null,{default:R(()=>[(z(),w(me(Fe(e))))]),_:2},1024)],8,Fn),t(`div`,In,[t(`div`,{class:`wb-task-item__title`,title:e.title},U(e.title||I(G)(`@WORKBENCH:未命名任务`)),9,Ln),t(`div`,Rn,[ze(e)>0?(z(),S(`span`,{key:0,class:F([`wb-task-item__meta-item`,{"wb-task-item__meta-item--running":Ve(e)}]),title:I(G)(`@WORKBENCH:个子任务`)},[V(o,{class:`wb-task-item__meta-icon`},{default:R(()=>[V(I(O))]),_:1}),t(`span`,Bn,U(Be(e))+`/`+U(ze(e)),1)],10,zn)):s(``,!0),Re(e)>0?(z(),S(`span`,{key:1,class:`wb-task-item__meta-item`,title:I(G)(`@WORKBENCH:附件`)},[V(o,{class:`wb-task-item__meta-icon`},{default:R(()=>[V(I(se))]),_:1}),t(`span`,Hn,U(Re(e)),1)],8,Vn)):s(``,!0),e.promptId?(z(),S(`span`,{key:2,class:`wb-task-item__meta-item wb-task-item__meta-item--accent`,title:I(G)(`@WORKBENCH:已绑定预置提示词`)},[V(o,{class:`wb-task-item__meta-icon`},{default:R(()=>[V(I(N))]),_:1})],8,Un)):s(``,!0),t(`button`,{type:`button`,class:F([`wb-task-item__meta-item wb-task-item__type-toggle`,e.type===`simple`?`wb-task-item__meta-item--simple`:`wb-task-item__meta-item--complex`]),title:e.type===`simple`?I(G)(`@WORKBENCH:简单任务 - 点击切换为复杂任务`):I(G)(`@WORKBENCH:复杂任务 - 点击切换为简单任务`),"aria-label":e.type===`simple`?I(G)(`@WORKBENCH:切换为复杂任务`):I(G)(`@WORKBENCH:切换为简单任务`)},U(e.type===`simple`?I(G)(`@WORKBENCH:简单`):I(G)(`@WORKBENCH:复杂`)),11,Wn),e.projectPath&&e.projectPath!==Q.value.path?(z(),S(`span`,{key:3,class:`wb-task-item__meta-item wb-task-item__meta-item--project`,title:e.projectPath},U(Xe(e.projectPath)),9,Gn)):s(``,!0)])]),t(`button`,{class:`wb-task-item__del`,onClick:i(t=>ft(e),[`stop`]),title:I(G)(`@WORKBENCH:删除`),"aria-label":I(G)(`@WORKBENCH:删除`)},[V(o,null,{default:R(()=>[V(I(h))]),_:1})],8,Kn)],10,Pn))),128))],64))),128)),d.value.length===0?(z(),S(`li`,qn,[t(`div`,Jn,[V(o,null,{default:R(()=>[V(I(p))]),_:1})]),t(`div`,Yn,U(I(G)(`@WORKBENCH:暂无任务`)),1),t(`div`,Xn,U(I(G)(`@WORKBENCH:点击上方按钮新建`)),1),t(`div`,Zn,[V(c,{type:`primary`,size:`small`,icon:I(k),onClick:ct},{default:R(()=>[f(U(I(G)(`@WORKBENCH:新建任务`)),1)]),_:1},8,[`icon`])])])):s(``,!0)])]),t(`section`,Qn,[t(`header`,$n,[t(`span`,er,U(I(G)(`@WORKBENCH:提示`)),1),t(`h3`,tr,U(I(G)(`@WORKBENCH:预置提示词`)),1),t(`span`,nr,U(l.value.length),1),t(`button`,{class:`wb-section__action`,onClick:et,title:I(G)(`@WORKBENCH:新建提示词`),"aria-label":I(G)(`@WORKBENCH:新建提示词`)},[V(o,null,{default:R(()=>[V(I(k))]),_:1})],8,rr)]),t(`ul`,ir,[(z(!0),S(u,null,L(l.value,e=>(z(),S(`li`,{key:e.id,class:`wb-prompt-item`},[t(`div`,ar,[V(o,null,{default:R(()=>[V(I(N))]),_:1})]),t(`span`,{class:`wb-prompt-item__name`,onClick:t=>tt(e),title:e.content},U(e.name),9,or),Q.value.name?(z(),S(`span`,{key:0,class:`wb-prompt-item__project`,title:I(G)(`@WORKBENCH:适用于当前项目`)+`:`+Q.value.path},U(Q.value.name),9,sr)):s(``,!0),t(`button`,{class:`wb-prompt-item__del`,onClick:t=>st(e),title:I(G)(`@WORKBENCH:删除`),"aria-label":I(G)(`@WORKBENCH:删除`)},[V(o,null,{default:R(()=>[V(I(h))]),_:1})],8,cr)]))),128)),l.value.length===0?(z(),S(`li`,lr,U(I(G)(`@WORKBENCH:暂无提示词`)),1)):s(``,!0)])])]),t(`section`,ur,[x.value?(z(),S(u,{key:1},[t(`div`,fr,[_e(t(`input`,{class:`wb-input wb-input--title`,"onUpdate:modelValue":r[0]||=e=>x.value.title=e,placeholder:I(G)(`@WORKBENCH:任务标题`)},null,8,pr),[[m,x.value.title]]),H.value!==`idle`||K.value?(z(),S(`span`,{key:0,class:F([`wb-meta-save`,{"is-saving":H.value===`saving`,"is-saved":H.value===`saved`,"is-error":H.value===`error`,"is-dirty":K.value&&H.value===`idle`}]),title:H.value===`saving`?I(G)(`@WORKBENCH:保存中…`):H.value===`error`?I(G)(`@WORKBENCH:保存失败`):H.value===`saved`?I(G)(`@WORKBENCH:已保存`):``},[H.value===`saving`?(z(),S(`span`,hr)):H.value===`saved`?(z(),S(`span`,gr,`✓`)):H.value===`error`?(z(),S(`span`,_r,`!`)):(z(),S(`span`,vr)),f(` `+U(H.value===`saving`?I(G)(`@WORKBENCH:保存中…`):H.value===`saved`?I(G)(`@WORKBENCH:已保存`):H.value===`error`?I(G)(`@WORKBENCH:保存失败`):I(G)(`@WORKBENCH:有未保存的更改`)),1)],10,mr)):s(``,!0),_e(t(`select`,{class:`wb-select`,"onUpdate:modelValue":r[1]||=e=>x.value.promptId=e},[t(`option`,yr,U(I(G)(`@WORKBENCH:不绑定预置提示词`)),1),(z(!0),S(u,null,L(l.value,e=>(z(),S(`option`,{key:e.id,value:e.id},U(e.name),9,br))),128))],512),[[ce,x.value.promptId]]),t(`div`,{class:`wb-mode-switch`,role:`tablist`,"aria-label":I(G)(`@WORKBENCH:任务类型`)},[t(`button`,{type:`button`,role:`tab`,class:F([`wb-mode-switch__btn`,{"is-active":!C.value}]),"aria-selected":!C.value,onClick:r[2]||=e=>dt(`complex`)},U(I(G)(`@WORKBENCH:复杂`)),11,Sr),t(`button`,{type:`button`,role:`tab`,class:F([`wb-mode-switch__btn`,{"is-active":C.value}]),"aria-selected":C.value,onClick:r[3]||=e=>dt(`simple`)},U(I(G)(`@WORKBENCH:简单`)),11,Cr),t(`span`,{class:F([`wb-mode-switch__indicator`,{"is-right":C.value}]),"aria-hidden":`true`},null,2)],8,xr),C.value?s(``,!0):(z(),S(`button`,{key:1,type:`button`,class:`wb-ai-split-btn`,disabled:!x.value.title||!x.value.title.trim(),title:I(G)(`@WORKBENCH:AI 拆分`),onClick:St},[r[44]||=t(`svg`,{class:`wb-ai-split-btn__icon`,viewBox:`0 0 16 16`,width:`14`,height:`14`,"aria-hidden":`true`},[t(`path`,{d:`M8 1.5l1.6 3.4 3.4 1.6-3.4 1.6L8 11.5 6.4 8.1 3 6.5l3.4-1.6L8 1.5zM2.5 9.5l.8 1.6 1.6.8-1.6.8-.8 1.6-.8-1.6L.1 11.9l1.6-.8.8-1.6zm11 0l.8 1.6 1.6.8-1.6.8-.8 1.6-.8-1.6-1.6-.8 1.6-.8.8-1.6z`,fill:`currentColor`})],-1),t(`span`,null,U(I(G)(`@WORKBENCH:AI 拆分`)),1)],8,wr)),V(c,{type:`primary`,loading:!1,onClick:r[4]||=e=>wt(x.value)},{default:R(()=>[f(U(C.value?I(G)(`@WORKBENCH:执行`):I(G)(`@WORKBENCH:执行任务`)),1)]),_:1}),t(`button`,{type:`button`,class:`wb-logs-inline-btn`,title:I(G)(`@WORKBENCH:执行日志`),"aria-label":I(G)(`@WORKBENCH:执行日志`),onClick:r[5]||=e=>y.value=!0},[V(o,{class:`wb-logs-inline-btn__icon`},{default:R(()=>[V(I(Se))]),_:1}),t(`span`,null,U(I(G)(`@WORKBENCH:执行日志`)),1)],8,Tr)]),t(`details`,{class:`wb-task-desc`,open:Oe.value,onToggle:r[13]||=e=>Oe.value=e.target.open},[t(`summary`,Dr,[V(o,{class:`wb-task-desc__caret`},{default:R(()=>[(z(),w(me(Oe.value?I(n):I(ye))))]),_:1}),t(`span`,Or,U(I(G)(`@WORKBENCH:任务描述(可选)`)),1),x.value.desc&&x.value.desc.length>0||x.value.attachments&&x.value.attachments.length>0?(z(),S(`span`,kr,[x.value.desc&&x.value.desc.length>0?(z(),S(`span`,Ar,U(I(G)(`@WORKBENCH:已填写`)),1)):s(``,!0),x.value.attachments&&x.value.attachments.length>0?(z(),S(`span`,jr,U(x.value.attachments.length),1)):s(``,!0)])):s(``,!0)]),_e(t(`textarea`,{class:`wb-textarea`,"onUpdate:modelValue":r[6]||=e=>x.value.desc=e,placeholder:I(G)(`@WORKBENCH:任务描述(可选)`),rows:`2`,onPaste:r[7]||=e=>zt(e,{kind:`task`,task:x.value})},null,40,Mr),[[m,x.value.desc]]),V(it,{attachments:x.value.attachments||[],"is-image":qt,"human-size":Jt,"is-uploading":Mt(`task-`+x.value.id),"is-paste-hover":$.value===`task-`+x.value.id,"max-count":9,"on-pick":()=>Gt({kind:`task`,task:x.value}),"on-remove":e=>Ut({kind:`task`,task:x.value},e),onPaste:r[8]||=e=>zt(e,{kind:`task`,task:x.value}),onDrop:r[9]||=i(e=>Bt(e,{kind:`task`,task:x.value}),[`prevent`]),onDragover:r[10]||=i(e=>$.value=`task-`+x.value.id,[`prevent`]),onDragenter:r[11]||=i(e=>$.value=`task-`+x.value.id,[`prevent`]),onDragleave:r[12]||=e=>$.value=$.value===`task-`+x.value.id?null:$.value},null,8,[`attachments`,`is-uploading`,`is-paste-hover`,`on-pick`,`on-remove`])],40,Er),t(`div`,{class:F([`wb-execution-body`,{"wb-execution-body--simple":C.value}])},[C.value?s(``,!0):(z(),S(`div`,Nr,[t(`div`,Pr,[t(`h4`,Fr,U(I(G)(`@WORKBENCH:子任务拆分`)),1),t(`div`,Ir,[V(c,{size:`small`,plain:``,icon:I(k),disabled:x.value.subtasks.length===0,onClick:_t},{default:R(()=>[f(U(I(G)(`@WORKBENCH:添加子任务`)),1)]),_:1},8,[`icon`,`disabled`]),V(c,{size:`small`,type:ue.value?`primary`:`default`,disabled:x.value.subtasks.length===0,onClick:bt},{default:R(()=>[f(U(I(G)(`@WORKBENCH:保存拆分`))+` `,1),ue.value?(z(),S(`span`,Lr,U(le.value.size),1)):s(``,!0)]),_:1},8,[`type`,`disabled`])])]),t(`ul`,Rr,[(z(!0),S(u,null,L(x.value.subtasks,e=>(z(),S(`li`,{key:e.id,class:F([`wb-exec-sub-item`,{"is-selected":T.value===e.id,"is-running":e.status===`running`,"is-done":e.status===`done`,"is-dirty":le.value.has(e.id),"is-persisting":ht(e.id)}]),onClick:t=>T.value=e.id},[t(`div`,Br,[t(`span`,{class:`wb-sub-item__status wb-sub-item__status--dot`,style:te({background:I(Wt)(e.status)}),title:I(G)(`@WORKBENCH:任务完成状态`)},[...r[45]||=[t(`span`,{class:`wb-simple__status-dot`,"aria-hidden":`true`},null,-1)]],12,Vr),t(`span`,{class:`wb-exec-sub-item__title`,title:e.title},U(e.title||I(G)(`@WORKBENCH:未命名子任务`)),9,Hr),le.value.has(e.id)?(z(),S(`span`,Ur)):s(``,!0)]),t(`div`,Wr,[Z(e.id)?(z(),S(`span`,Gr,`PID: `+U(Z(e.id)?.pid),1)):s(``,!0),t(`span`,Kr,[Dt(e)?(z(),S(`button`,{key:0,class:`wb-exec-sub-btn wb-exec-sub-btn--run`,title:I(G)(`@WORKBENCH:单独执行此子任务`),onClick:i(t=>Et(e),[`stop`])},U(I(G)(`@WORKBENCH:执行`)),9,qr)):s(``,!0),Z(e.id)&&(Z(e.id)?.status===`running`||Z(e.id)?.status===`pending`)?(z(),S(`button`,{key:1,class:`wb-exec-sub-btn wb-exec-sub-btn--stop`,title:I(G)(`@WORKBENCH:停止执行`),onClick:i(t=>kt(Z(e.id)),[`stop`])},U(I(G)(`@WORKBENCH:停止`)),9,Jr)):s(``,!0),e.status===`done`?(z(),S(`button`,{key:2,class:`wb-exec-sub-btn wb-exec-sub-btn--undo`,title:I(G)(`@WORKBENCH:取消完成`),disabled:ht(e.id),onClick:i(t=>Ot(e),[`stop`])},U(I(G)(`@WORKBENCH:取消完成`)),9,Yr)):s(``,!0),t(`button`,{class:`wb-exec-sub-btn wb-exec-sub-btn--del`,title:I(G)(`@WORKBENCH:删除`),disabled:ht(e.id),onClick:i(t=>vt(e),[`stop`])},`×`,8,Xr)])])],10,zr))),128)),x.value.subtasks.length===0?(z(),S(`li`,Zr,[t(`div`,Qr,[V(o,null,{default:R(()=>[V(I(O))]),_:1})]),t(`div`,$r,U(I(G)(`@WORKBENCH:拆分任务,逐项执行`)),1),t(`div`,ei,U(I(G)(`@WORKBENCH:手动添加子任务,或让 AI 帮你自动拆分`)),1),t(`div`,ti,[V(c,{type:`primary`,size:`small`,icon:I(k),onClick:_t},{default:R(()=>[f(U(I(G)(`@WORKBENCH:添加子任务`)),1)]),_:1},8,[`icon`]),t(`button`,{type:`button`,class:`wb-empty__link`,disabled:!x.value.title||!x.value.title.trim(),onClick:St},U(I(G)(`@WORKBENCH:用 AI 自动拆分`)),9,ni)])])):s(``,!0)])])),t(`div`,ri,[C.value?(z(),S(u,{key:1},[t(`details`,{class:F([`wb-simple__override`,{"has-content":!!(x.value.simpleOverride&&x.value.simpleOverride.trim())}])},[t(`summary`,li,[V(o,{class:`wb-simple__override-caret`},{default:R(()=>[V(I(ye))]),_:1}),t(`span`,null,U(I(G)(`@WORKBENCH:覆盖预置提示词(可选)`)),1),x.value.simpleOverride&&x.value.simpleOverride.trim()?(z(),S(`span`,{key:0,class:`wb-simple__override-tag`,title:I(G)(`@WORKBENCH:已填写覆盖内容`)},U(I(G)(`@WORKBENCH:已填写`)),9,ui)):s(``,!0),Le(Ie(x.value))===`running`&&Ie(x.value)?(z(),S(`button`,{key:1,class:`wb-simple__stop`,disabled:ht(Ie(x.value).id),onClick:r[24]||=i(e=>kt(Ie(x.value)),[`stop`])},U(I(G)(`@WORKBENCH:停止`)),9,di)):s(``,!0)]),_e(t(`textarea`,{class:`wb-textarea`,"onUpdate:modelValue":r[25]||=e=>x.value.simpleOverride=e,placeholder:I(G)(`@WORKBENCH:留空则使用上方选定的「预置提示词」模板;可用变量同子任务:{{task.title}} {{task.desc}} {{repo.path}} {{branch}}`),rows:`6`},null,8,fi),[[m,x.value.simpleOverride]])],2),Z(`${x.value.id}__simple`)?(z(),w(Ht,{key:0,job:Z(`${x.value.id}__simple`)},null,8,[`job`])):s(``,!0)],64)):(z(),S(u,{key:0},[E.value?(z(),S(u,{key:1},[t(`div`,ai,[_e(t(`input`,{class:`wb-input`,"onUpdate:modelValue":r[14]||=e=>E.value.title=e,placeholder:I(G)(`@WORKBENCH:子任务标题`),onClick:r[15]||=i(()=>{},[`stop`]),onPaste:r[16]||=e=>zt(e,{kind:`sub`,task:x.value,sub:E.value})},null,40,oi),[[m,E.value.title]]),le.value.has(E.value.id)?(z(),S(`span`,{key:0,class:`wb-sub-item__dirty`,title:I(G)(`@WORKBENCH:有未保存的更改`)},U(I(G)(`@WORKBENCH:未保存`)),9,si)):s(``,!0)]),_e(t(`textarea`,{class:`wb-textarea wb-textarea--sm`,"onUpdate:modelValue":r[17]||=e=>E.value.desc=e,placeholder:I(G)(`@WORKBENCH:子任务描述 / 独立提示词覆盖`),rows:`3`,onPaste:r[18]||=e=>zt(e,{kind:`sub`,task:x.value,sub:E.value})},null,40,ci),[[m,E.value.desc]]),Z(E.value.id)?(z(),w(Ht,{key:0,job:Z(E.value.id)},null,8,[`job`])):s(``,!0),V(it,{attachments:E.value.attachments||[],"is-image":qt,"human-size":Jt,"is-uploading":Mt(`sub-`+E.value.id),"is-paste-hover":$.value===E.value.id,"max-count":9,"on-pick":()=>Gt({kind:`sub`,task:x.value,sub:E.value}),"on-remove":e=>Ut({kind:`sub`,task:x.value,sub:E.value},e),onPaste:r[19]||=e=>zt(e,{kind:`sub`,task:x.value,sub:E.value}),onDrop:r[20]||=i(e=>Bt(e,{kind:`sub`,task:x.value,sub:E.value}),[`prevent`]),onDragover:r[21]||=i(e=>$.value=E.value.id,[`prevent`]),onDragenter:r[22]||=i(e=>$.value=E.value.id,[`prevent`]),onDragleave:r[23]||=e=>$.value=$.value===E.value.id?null:$.value},null,8,[`attachments`,`is-uploading`,`is-paste-hover`,`on-pick`,`on-remove`])],64)):(z(),S(`div`,ii,[t(`p`,null,U(x.value.subtasks.length===0?I(G)(`@WORKBENCH:手动添加子任务,或让 AI 帮你自动拆分`):I(G)(`@WORKBENCH:左侧选择子任务查看详情`)),1)]))],64))])],2)],64)):(z(),S(`div`,dr,[t(`p`,null,U(I(G)(`@WORKBENCH:左侧选择任务,或新建一个任务开始`)),1)]))])]),V(g,{modelValue:y.value,"onUpdate:modelValue":r[26]||=e=>y.value=e,title:I(G)(`@WORKBENCH:执行日志`),width:`1080px`,"close-on-click-modal":!1,top:`6vh`,class:`wb-logs-dialog`},{default:R(()=>[V(xn)]),_:1},8,[`modelValue`,`title`]),V(g,{modelValue:q.visible,"onUpdate:modelValue":r[30]||=e=>q.visible=e,title:q.editing?I(G)(`@WORKBENCH:编辑提示词`):I(G)(`@WORKBENCH:新建提示词`),width:`640px`},{footer:R(()=>[V(c,{onClick:r[29]||=e=>q.visible=!1},{default:R(()=>[f(U(I(G)(`@WORKBENCH:取消`)),1)]),_:1}),V(c,{type:`primary`,onClick:ot},{default:R(()=>[f(U(I(G)(`@WORKBENCH:保存`)),1)]),_:1})]),default:R(()=>[V(A,{"label-position":`top`},{default:R(()=>[V(D,{label:I(G)(`@WORKBENCH:名称`)},{default:R(()=>[V(_,{modelValue:q.name,"onUpdate:modelValue":r[27]||=e=>q.name=e,placeholder:I(G)(`@WORKBENCH:如:代码审查 / 写测试`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`]),V(D,null,{default:R(()=>[t(`div`,pi,[V(c,{type:`primary`,plain:``,loading:q.aiLoading,onClick:nt},{default:R(()=>[f(U(I(G)(`@WORKBENCH:AI 生成项目架构说明`)),1)]),_:1},8,[`loading`]),V(c,{onClick:rt},{default:R(()=>[f(U(I(G)(`@WORKBENCH:编辑指令`)),1)]),_:1})])]),_:1}),V(D,{label:I(G)(`@WORKBENCH:内容`)},{default:R(()=>[V(_,{modelValue:q.content,"onUpdate:modelValue":r[28]||=e=>q.content=e,type:`textarea`,rows:10,placeholder:I(G)(`@WORKBENCH:可用变量:`)+`{{task.title}} {{task.desc}} {{sub.title}} {{sub.desc}} {{repo.path}} {{branch}}`},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])]),_:1})]),_:1},8,[`modelValue`,`title`]),V(g,{modelValue:J.visible,"onUpdate:modelValue":r[33]||=e=>J.visible=e,title:I(G)(`@WORKBENCH:编辑生成指令`),width:`720px`,"append-to-body":``},{footer:R(()=>[V(c,{onClick:r[32]||=e=>J.visible=!1},{default:R(()=>[f(U(I(G)(`@WORKBENCH:取消`)),1)]),_:1}),V(c,{type:`primary`,loading:J.saving,onClick:at},{default:R(()=>[f(U(I(G)(`@WORKBENCH:保存`)),1)]),_:1},8,[`loading`])]),default:R(()=>[V(A,{"label-position":`top`},{default:R(()=>[V(D,{label:I(G)(`@WORKBENCH:指令内容`)},{default:R(()=>[V(_,{modelValue:J.text,"onUpdate:modelValue":r[31]||=e=>J.text=e,type:`textarea`,rows:18,placeholder:I(G)(`@WORKBENCH:指令内容`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])]),_:1})]),_:1},8,[`modelValue`,`title`]),V(g,{modelValue:Y.visible,"onUpdate:modelValue":r[41]||=e=>Y.visible=e,title:Y.editing?I(G)(`@WORKBENCH:编辑任务`):I(G)(`@WORKBENCH:新建任务`),width:`600px`},{footer:R(()=>[V(c,{onClick:r[40]||=e=>Y.visible=!1},{default:R(()=>[f(U(I(G)(`@WORKBENCH:取消`)),1)]),_:1}),V(c,{type:`primary`,onClick:lt},{default:R(()=>[f(U(I(G)(`@WORKBENCH:保存`)),1)]),_:1})]),default:R(()=>[V(A,{"label-position":`top`},{default:R(()=>[V(D,{label:I(G)(`@WORKBENCH:标题(可选)`)},{default:R(()=>[V(_,{modelValue:Y.title,"onUpdate:modelValue":r[34]||=e=>Y.title=e,placeholder:I(G)(`@WORKBENCH:不填则自动命名为「无标题」,稍后可在任务列表里改名`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`]),V(D,{label:I(G)(`@WORKBENCH:类型`)},{default:R(()=>[V(ie,{modelValue:Y.type,"onUpdate:modelValue":r[35]||=e=>Y.type=e},{default:R(()=>[V(j,{value:`complex`},{default:R(()=>[f(U(I(G)(`@WORKBENCH:复杂任务(需要拆分子任务)`)),1)]),_:1}),V(j,{value:`simple`},{default:R(()=>[f(U(I(G)(`@WORKBENCH:简单任务(直接执行)`)),1)]),_:1})]),_:1},8,[`modelValue`])]),_:1},8,[`label`]),Y.type===`simple`?(z(),w(D,{key:0,label:I(G)(`@WORKBENCH:描述`)},{default:R(()=>[V(_,{modelValue:Y.desc,"onUpdate:modelValue":r[36]||=e=>Y.desc=e,type:`textarea`,rows:4,placeholder:I(G)(`@WORKBENCH:把要做的事直接写在这里,执行时会把这段描述作为 prompt 喂给 Claude`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])):(z(),w(D,{key:1,label:I(G)(`@WORKBENCH:描述`)},{default:R(()=>[V(_,{modelValue:Y.desc,"onUpdate:modelValue":r[37]||=e=>Y.desc=e,type:`textarea`,rows:3},null,8,[`modelValue`])]),_:1},8,[`label`])),Y.type===`simple`?(z(),w(D,{key:2,label:I(G)(`@WORKBENCH:覆盖预置提示词(可选)`)},{default:R(()=>[V(_,{modelValue:Y.simpleOverride,"onUpdate:modelValue":r[38]||=e=>Y.simpleOverride=e,type:`textarea`,rows:5,placeholder:I(G)(`@WORKBENCH:留空则使用「预置提示词」下拉里选定的模板;可用变量同子任务覆盖。`)},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])):s(``,!0),V(D,{label:I(G)(`@WORKBENCH:预置提示词`)},{default:R(()=>[V(oe,{modelValue:Y.promptId,"onUpdate:modelValue":r[39]||=e=>Y.promptId=e,clearable:``,placeholder:I(G)(`@WORKBENCH:不绑定`),style:{width:`100%`}},{default:R(()=>[(z(!0),S(u,null,L(l.value,e=>(z(),w(M,{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`]),x.value?(z(),w(Ge,{key:0,modelValue:xt.value,"onUpdate:modelValue":r[42]||=e=>xt.value=e,title:x.value.title,desc:x.value.desc,"task-id":x.value.id,"prompt-id":x.value.promptId,onConfirm:Ct},null,8,[`modelValue`,`title`,`desc`,`task-id`,`prompt-id`])):s(``,!0)])}}}),[[`__scopeId`,`data-v-093a936d`]]);export{vi as default};