zen-gitsync 2.18.9 → 2.18.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/package.json +1 -1
- package/src/cli/ai/tools.js +152 -1
- package/src/cli/ai/tools.test.js +70 -1
- package/src/ui/public/assets/{AgentView-CV_8sYX6.css → AgentView-BnEgu3NT.css} +1 -1
- package/src/ui/public/assets/AgentView-DQQe_ivW.js +1 -0
- package/src/ui/public/assets/{AppVersionBadge-C4OhcUi8.js → AppVersionBadge-D7PiBP0p.js} +1 -1
- package/src/ui/public/assets/{BranchSelector-CrLieQyJ.js → BranchSelector-BzHoMBOc.js} +1 -1
- package/src/ui/public/assets/{CommitForm-KGQisnPQ.js → CommitForm-CNTjLYTR.js} +1 -1
- package/src/ui/public/assets/{CopySessionButton-y5Rzmact.js → CopySessionButton-Dy5t8Mjy.js} +1 -1
- package/src/ui/public/assets/{EditorView-CkZb2kw5.js → EditorView-CwcdA0Ei.js} +1 -1
- package/src/ui/public/assets/{FlowOrchestrationWorkspace-BMQSVm3V.js → FlowOrchestrationWorkspace-CJHpEBCw.js} +1 -1
- package/src/ui/public/assets/{LogList-BxH6QNlK.js → LogList-KUePBjAt.js} +1 -1
- package/src/ui/public/assets/{MindmapView-D9_qjJsR.js → MindmapView-CwdvsuEK.js} +1 -1
- package/src/ui/public/assets/{MonitorView-z_fsnE8Y.js → MonitorView-CjEnnrTL.js} +1 -1
- package/src/ui/public/assets/{ProjectStartupButton-CFB_JpYG.js → ProjectStartupButton-B36lRb6-.js} +1 -1
- package/src/ui/public/assets/{RecentDirectoriesChat-BYI8lkjQ.js → RecentDirectoriesChat-DNiji9Pr.js} +1 -1
- package/src/ui/public/assets/{RemoteManagerDialog-DXDcN8e7.js → RemoteManagerDialog-Dj_GpA-c.js} +1 -1
- package/src/ui/public/assets/{RemoteRepoCard-C_TYGsXi.js → RemoteRepoCard-C8u9M6dn.js} +1 -1
- package/src/ui/public/assets/{SourceMapView-D6cSweDt.js → SourceMapView-eng0B9U2.js} +1 -1
- package/src/ui/public/assets/{WorkbenchView-D4UDurhF.js → WorkbenchView-CZO18THH.js} +1 -1
- package/src/ui/public/assets/agentConversations-De3wKTsN.js +10 -0
- package/src/ui/public/assets/{index-C7Y9odvZ.js → index-DQ82h1aq.js} +5 -5
- package/src/ui/public/assets/{useOrchestrator-C236G5P5.js → useOrchestrator-BjC7oHpt.js} +1 -1
- package/src/ui/public/index.html +1 -1
- package/src/ui/server/routes/git/clone.js +5 -13
- package/src/ui/server/routes/workbench/agentChat.js +5 -2
- package/src/ui/server/routes/workbench/agentRoutes.js +17 -0
- package/src/ui/server/routes/workbench/index.js +16 -4
- package/src/ui/server/routes/workbench/scheduler.js +3 -0
- package/src/utils/gitRepoName.js +33 -0
- package/src/ui/public/assets/AgentView-DxmnqJxE.js +0 -1
- package/src/ui/public/assets/agentConversations-DyzaxUXm.js +0 -10
package/README.md
CHANGED
|
@@ -436,7 +436,7 @@ A dedicated view (robot icon in the activity bar) for chatting with the built-in
|
|
|
436
436
|
|
|
437
437
|
| Feature | Description |
|
|
438
438
|
|---|---|
|
|
439
|
-
| Session list | Browse, search, rename, and delete past conversations; sessions created via `g ai` in the terminal also appear here with a **CLI** badge |
|
|
439
|
+
| Session list | Browse, search, rename, and delete past conversations; sessions created via `g ai` in the terminal also appear here with a **CLI** badge. A finished scheduled-task run lands here on its own (no manual refresh needed), and whatever **View session** on a task card opens is always listed and highlighted — even when that session belongs to another project (the list itself is filtered per project; that one is merged in as the exception) |
|
|
440
440
|
| Engine choice | Run new sessions on the built-in **g ai** or hand them to an external CLI — **Claude Code**, **OpenCode** or **Codex**. The selector sits at the right of the chat tabs; engines whose CLI is not installed are greyed out and clicking one opens the install guide. The same selector lives in the file-space **g ai** chat panel. The engine is locked once a session is persisted, so switching means starting a new session |
|
|
441
441
|
| Live session entry | Sending the first message of a new session makes it show up in the list **immediately** with a "Generating..." badge, instead of waiting for the whole turn to finish; once the reply ends and the server persists the session, the entry is replaced by the real timestamp and message count |
|
|
442
442
|
| Streaming chat | SSE-based real-time streaming with thinking process, content, tool calls, and tool results rendered inline |
|
|
@@ -1172,7 +1172,7 @@ Activity Bar 中的机器人图标视图,可直接在浏览器中与内置 AI
|
|
|
1172
1172
|
|
|
1173
1173
|
| 功能 | 说明 |
|
|
1174
1174
|
|---|---|
|
|
1175
|
-
| 会话列表 | 浏览、搜索、重命名、删除历史对话;通过 `g ai` 在终端创建的会话也会出现在这里,带 **CLI**
|
|
1175
|
+
| 会话列表 | 浏览、搜索、重命名、删除历史对话;通过 `g ai` 在终端创建的会话也会出现在这里,带 **CLI** 标记。定时任务跑完那一轮会**自动入列**(不用手动刷新);点任务卡片上的「查看会话」打开的会话也一定在列表里并高亮 —— 哪怕它属于别的项目(列表本身按当前项目过滤,这一条是作为例外补进去的) |
|
|
1176
1176
|
| 引擎选择 | 新建会话可跑内置 **g ai**,也可交给外部 CLI —— **Claude Code** / **OpenCode** / **Codex**。选择器在对话 Tab 行右端;未安装的引擎会置灰,点一下直接开安装引导。文件空间的 **g ai** 对话面板头部有同一个选择器。会话一旦落盘引擎就锁定,要换请新建会话 |
|
|
1177
1177
|
| 会话实时入列 | 新会话发出第一条消息后,左侧列表**立刻**出现这一条(带「正在生成中…」标记),不用等整轮回答跑完;回答结束、服务端落盘后自动替换成真实的时间与条数 |
|
|
1178
1178
|
| 流式对话 | 基于 SSE 的实时流式输出,包含思考过程、正文内容、工具调用和工具结果的内联渲染 |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zen-gitsync",
|
|
3
|
-
"version": "2.18.
|
|
3
|
+
"version": "2.18.10",
|
|
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",
|
package/src/cli/ai/tools.js
CHANGED
|
@@ -37,6 +37,8 @@ import { trackChild } from '../cleanup.js'
|
|
|
37
37
|
import { checkDangerousCommand } from './safety.js'
|
|
38
38
|
import { guardCommand } from './platformGuard.js'
|
|
39
39
|
import { augmentEnvPath, isCommandNotFound, pathValueOf } from '../../utils/shellPath.js'
|
|
40
|
+
// 从远程地址推导仓库目录名 —— 与 GUI 的 /api/clone 共用同一份规则(见 utils/gitRepoName.js)
|
|
41
|
+
import { repoNameFromUrl } from '../../utils/gitRepoName.js'
|
|
40
42
|
import { checkImageFile, imageToDataUrl, formatBytes, isImagePath, SUPPORTED_IMAGE_EXTS } from './images.js'
|
|
41
43
|
// 定时任务库:CLI 与 GUI 共享同一份文件(~/.zen-gitsync/schedules.json)。
|
|
42
44
|
// 本工具只负责登记/管理,真正的到点执行由 g ui 服务端的调度器完成。
|
|
@@ -223,6 +225,24 @@ export const TOOL_DEFINITIONS = [
|
|
|
223
225
|
},
|
|
224
226
|
},
|
|
225
227
|
},
|
|
228
|
+
{
|
|
229
|
+
type: 'function',
|
|
230
|
+
function: {
|
|
231
|
+
name: 'register_project',
|
|
232
|
+
description: '把一个目录登记进用户的「常用目录」—— 就是 g ui「切换工作目录」弹窗里那份清单(首屏「最近项目」面板是同一份数据)。'
|
|
233
|
+
+ '什么时候用:你**刚创建或克隆了一个新项目**(git init / git clone / 各种脚手架新建出来的目录)之后,顺手把它登记进去 —— '
|
|
234
|
+
+ '用户下次就能在界面上一键切过去,不用自己去翻路径。'
|
|
235
|
+
+ '路径必须是**已存在**的目录(绝对路径);重复登记同一个目录没有副作用(会挪到最前)。'
|
|
236
|
+
+ '只在 g ui(GUI 界面)的内置智能体里可用;命令行 g ai 没有「常用目录」这个概念,不用调用。',
|
|
237
|
+
parameters: {
|
|
238
|
+
type: 'object',
|
|
239
|
+
properties: {
|
|
240
|
+
path: { type: 'string', description: '要登记的项目目录(绝对路径,必须已存在)' },
|
|
241
|
+
},
|
|
242
|
+
required: ['path'],
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
},
|
|
226
246
|
{
|
|
227
247
|
type: 'function',
|
|
228
248
|
function: {
|
|
@@ -492,6 +512,98 @@ function execCommand(command, options) {
|
|
|
492
512
|
})
|
|
493
513
|
}
|
|
494
514
|
|
|
515
|
+
// ──────────────────────────────────────────────
|
|
516
|
+
// 「建了仓库」的识别:run_command 之后把新项目顺手登记进常用目录
|
|
517
|
+
// ──────────────────────────────────────────────
|
|
518
|
+
//
|
|
519
|
+
// 为什么要在**命令文本**上做这件事(而不是只靠模型记得调 register_project):
|
|
520
|
+
// g ai 帮用户建项目(git clone / git init)之后,新目录理应出现在「常用目录」里,
|
|
521
|
+
// 否则用户还得自己去界面里再找一遍路径 —— 而这步本来就该由动手的人顺手做掉。
|
|
522
|
+
// 登记常用目录是"顺手做的事",指望每一轮模型都记得并不可靠;这两条命令又足够典型
|
|
523
|
+
// (克隆 / 初始化仓库是"建项目"最常见的两步),所以在工具层兜一道。
|
|
524
|
+
// register_project 工具是通用兜底:脚手架(npm create / npx create-vite …)建出来的
|
|
525
|
+
// 目录这里认不出来,模型可以显式补一记。
|
|
526
|
+
const REPO_CREATE_HINT_RE = /(?:^|[\s;&|()])(?:git\s+(?:-C\s+\S+\s+)?(?:clone|init)\b|gh\s+repo\s+create\b)/i
|
|
527
|
+
|
|
528
|
+
/** 按空白切参数,保留引号里的整体(`"a b"` 算一个 token) */
|
|
529
|
+
function tokenizeArgs(text) {
|
|
530
|
+
return String(text || '').match(/"[^"]*"|'[^']*'|\S+/g) || []
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/** 去掉 token 两端成对的引号 */
|
|
534
|
+
function unquoteToken(token) {
|
|
535
|
+
const t = String(token || '')
|
|
536
|
+
const pair = t.length >= 2
|
|
537
|
+
&& ((t[0] === '"' && t.endsWith('"')) || (t[0] === "'" && t.endsWith("'")))
|
|
538
|
+
return pair ? t.slice(1, -1) : t
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
/**
|
|
542
|
+
* 从一条疑似"建仓库"的命令里抽出**可能新建的仓库目录**(绝对路径)。
|
|
543
|
+
* 纯字符串解析,**不做存在性判断** —— 调用方自己 fs.stat 确认落到了磁盘上。
|
|
544
|
+
* 认不出来返回空数组(宁可漏登记,也不要凭空登记一个不存在的路径)。
|
|
545
|
+
*
|
|
546
|
+
* 覆盖三种写法:
|
|
547
|
+
* git clone <url> [<dir>] —— 没给 dir 时按仓库名猜(与 /api/clone 同一规则)
|
|
548
|
+
* git init [<dir>] —— 没给 dir 时就是 cwd
|
|
549
|
+
* gh repo create … --clone —— 本地子目录名取仓库名
|
|
550
|
+
* 外加命令里出现过的 `cd <dir>` / `git -C <dir>`:链式相对 cd(`cd a && cd b`)不精确,
|
|
551
|
+
* 但 `mkdir x && cd x && git init` 这类常见写法能命中。
|
|
552
|
+
*/
|
|
553
|
+
export function detectRepoCreateTargets(command, cwd) {
|
|
554
|
+
const cmd = String(command || '')
|
|
555
|
+
if (!REPO_CREATE_HINT_RE.test(cmd)) return []
|
|
556
|
+
const base = path.resolve(cwd || process.cwd())
|
|
557
|
+
const abs = (p) => (path.isAbsolute(p) ? path.normalize(p) : path.resolve(base, p))
|
|
558
|
+
const out = new Set()
|
|
559
|
+
let m
|
|
560
|
+
|
|
561
|
+
// `cd [ /d ] <dir>`(Windows 的 `cd /d` 也认):后续 clone/init 的相对落点按它解析
|
|
562
|
+
const cdRe = /(?:^|[\s;&|()])cd(?:\s+\/d)?\s+("[^"]*"|'[^']*'|[^\s;&|()]+)/gi
|
|
563
|
+
while ((m = cdRe.exec(cmd))) out.add(abs(unquoteToken(m[1])))
|
|
564
|
+
|
|
565
|
+
const gitRe = /(?:^|[\s;&|()])git(?:\s+-C\s+("[^"]*"|'[^']*'|[^\s;&|()]+))?\s+(clone|init)\b([^\n;&|]*)/gi
|
|
566
|
+
while ((m = gitRe.exec(cmd))) {
|
|
567
|
+
const cDir = m[1] ? unquoteToken(m[1]) : '' // git -C <dir>
|
|
568
|
+
if (cDir) out.add(abs(cDir))
|
|
569
|
+
const positionals = tokenizeArgs(m[3]).filter(t => !t.startsWith('-'))
|
|
570
|
+
if (m[2].toLowerCase() === 'clone') {
|
|
571
|
+
const [url, dir] = positionals
|
|
572
|
+
if (dir) out.add(abs(unquoteToken(dir)))
|
|
573
|
+
else {
|
|
574
|
+
const name = url ? repoNameFromUrl(unquoteToken(url)) : ''
|
|
575
|
+
if (name) out.add(abs(name))
|
|
576
|
+
}
|
|
577
|
+
} else {
|
|
578
|
+
// init 的落点:显式目录 > `git -C <dir>` > cwd
|
|
579
|
+
out.add(abs(unquoteToken(positionals[0] || cDir || '.')))
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
// gh repo create [owner/]name …:只有 --clone(且不是从本地 --source 建)才会建出目录
|
|
584
|
+
const ghRe = /(?:^|[\s;&|()])gh\s+repo\s+create\b([^\n;&|]*)/gi
|
|
585
|
+
while ((m = ghRe.exec(cmd))) {
|
|
586
|
+
const rest = m[1]
|
|
587
|
+
if (!/(?:^|\s)--clone(?:[=\s]|$)/.test(rest)) continue
|
|
588
|
+
if (/(?:^|\s)--source(?:[=\s]|$)/.test(rest)) continue
|
|
589
|
+
const name = tokenizeArgs(rest).filter(t => !t.startsWith('-'))[0] || ''
|
|
590
|
+
const leaf = unquoteToken(name).split('/').filter(Boolean).pop() || ''
|
|
591
|
+
if (leaf) out.add(abs(leaf))
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
return Array.from(out)
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/** 目录是不是一个 Git 仓库的根(普通仓库里 .git 是目录;worktree/submodule 里是文件) */
|
|
598
|
+
async function isGitRepoRoot(dir) {
|
|
599
|
+
try {
|
|
600
|
+
await fs.stat(path.join(dir, '.git'))
|
|
601
|
+
return true
|
|
602
|
+
} catch {
|
|
603
|
+
return false
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
495
607
|
// ──────────────────────────────────────────────
|
|
496
608
|
// 各工具实现
|
|
497
609
|
// ──────────────────────────────────────────────
|
|
@@ -554,6 +666,19 @@ async function toolRunCommand(args, ctx) {
|
|
|
554
666
|
}
|
|
555
667
|
}
|
|
556
668
|
|
|
669
|
+
// 命令成功建出了仓库 → 顺手登记进常用目录(见 detectRepoCreateTargets 的注释)。
|
|
670
|
+
// 只在 GUI 注入了 registerProject 时生效;CLI 没有「常用目录」这个概念,静默跳过。
|
|
671
|
+
// 整段包在 try 里:登记失败绝不能影响命令本身的结果。
|
|
672
|
+
if (result.code === 0 && typeof ctx.registerProject === 'function') {
|
|
673
|
+
try {
|
|
674
|
+
for (const dir of detectRepoCreateTargets(command, cwd)) {
|
|
675
|
+
if (await isGitRepoRoot(dir)) await ctx.registerProject(dir)
|
|
676
|
+
}
|
|
677
|
+
} catch {
|
|
678
|
+
// 锦上添花,失败就跳过
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
|
|
557
682
|
const parts = []
|
|
558
683
|
if (result.cancelled) parts.push('[命令已由用户停止]')
|
|
559
684
|
if (result.killed) parts.push(`[命令超时被终止(>${timeoutSec}s)]`)
|
|
@@ -807,6 +932,27 @@ async function toolListProjects(args, ctx) {
|
|
|
807
932
|
return ctx.listProjects({ refresh: args.refresh === true })
|
|
808
933
|
}
|
|
809
934
|
|
|
935
|
+
// register_project 的实现同样由 GUI 侧注入(ctx.registerProject)—— 最近目录是
|
|
936
|
+
// configManager 的东西,CLI/Web 共用的本模块只该知道"有这么个工具"。
|
|
937
|
+
// 与 list_projects 同一手法:没有实现时给一句能照着做的话,而不是崩掉。
|
|
938
|
+
async function toolRegisterProject(args, ctx) {
|
|
939
|
+
if (typeof ctx.registerProject !== 'function') {
|
|
940
|
+
return '错误: register_project 只在 g ui(GUI 界面)的内置智能体里可用。'
|
|
941
|
+
+ '命令行 g ai 下没有「常用目录」这个概念,无需调用。'
|
|
942
|
+
}
|
|
943
|
+
const raw = String(args.path || '').trim()
|
|
944
|
+
if (!raw) return '错误: path 不能为空'
|
|
945
|
+
const dir = resolvePath(ctx, raw)
|
|
946
|
+
try {
|
|
947
|
+
const st = await fs.stat(dir)
|
|
948
|
+
if (!st.isDirectory()) return `错误: ${dir} 不是目录,未登记。`
|
|
949
|
+
} catch {
|
|
950
|
+
return `错误: 目录不存在: ${dir}(未登记)。`
|
|
951
|
+
}
|
|
952
|
+
await ctx.registerProject(dir)
|
|
953
|
+
return `已把「${dir}」加入常用目录。`
|
|
954
|
+
}
|
|
955
|
+
|
|
810
956
|
async function toolAskUser(args, ctx) {
|
|
811
957
|
const question = String(args.question || '').trim()
|
|
812
958
|
if (!question) return 'Error: ask_user requires a non-empty question.'
|
|
@@ -1003,6 +1149,7 @@ const TOOL_HANDLERS = {
|
|
|
1003
1149
|
list_files: toolListFiles,
|
|
1004
1150
|
search_text: toolSearchText,
|
|
1005
1151
|
list_projects: toolListProjects,
|
|
1152
|
+
register_project: toolRegisterProject,
|
|
1006
1153
|
update_plan: toolUpdatePlan,
|
|
1007
1154
|
ask_user: toolAskUser,
|
|
1008
1155
|
dispatch_task: toolDispatchTask,
|
|
@@ -1018,7 +1165,11 @@ const TOOL_HANDLERS = {
|
|
|
1018
1165
|
*
|
|
1019
1166
|
* @param {string} name - 工具名
|
|
1020
1167
|
* @param {object} args - 已解析的参数对象
|
|
1021
|
-
* @param {{ cwd: string, onChild?: (child: object) => void
|
|
1168
|
+
* @param {{ cwd: string, onChild?: (child: object) => void,
|
|
1169
|
+
* listProjects?: (args: object) => Promise<string>,
|
|
1170
|
+
* registerProject?: (dir: string) => Promise<void> }} ctx
|
|
1171
|
+
* listProjects / registerProject 都由 GUI 侧注入(GUI 才有最近目录);
|
|
1172
|
+
* CLI 下缺省 undefined,对应工具会回一句可照做的说明。
|
|
1022
1173
|
* @returns {Promise<string | { text: string, images: string[] }>}
|
|
1023
1174
|
*/
|
|
1024
1175
|
export async function executeTool(name, args, ctx) {
|
package/src/cli/ai/tools.test.js
CHANGED
|
@@ -19,7 +19,7 @@ import assert from 'node:assert/strict'
|
|
|
19
19
|
import { promises as fs } from 'node:fs'
|
|
20
20
|
import os from 'node:os'
|
|
21
21
|
import path from 'node:path'
|
|
22
|
-
import { TOOL_DEFINITIONS, executeTool, resolveCommandTimeout, normalizePlanSteps, isPlanToolName, splitToolOutput, toolMessageContent } from './tools.js'
|
|
22
|
+
import { TOOL_DEFINITIONS, executeTool, resolveCommandTimeout, normalizePlanSteps, isPlanToolName, splitToolOutput, toolMessageContent, detectRepoCreateTargets } from './tools.js'
|
|
23
23
|
|
|
24
24
|
// 1×1 红色 PNG。用真字节而不是造一个空文件:checkImageFile 只校验扩展名与体积,
|
|
25
25
|
// 但"读出来能还原成原图"这件事值得顺手钉一下(imageToDataUrl 会把内容 base64)。
|
|
@@ -505,3 +505,72 @@ test('read_image 与 read_file 的描述互指 —— 模型选错工具时能
|
|
|
505
505
|
assert.match(readFile.function.description, /read_image/)
|
|
506
506
|
assert.match(readImage.function.description, /read_file/)
|
|
507
507
|
})
|
|
508
|
+
|
|
509
|
+
// ========== 建仓库后自动登记「常用目录」 ==========
|
|
510
|
+
// g ai 帮用户建/克隆了新项目之后,新目录本该出现在「常用目录」里(否则用户还得
|
|
511
|
+
// 自己去界面里找路径)。这一步在工具层兜底:命令文本里出现 git clone / git init /
|
|
512
|
+
// gh repo create --clone 就登记落点。register_project 是通用兜底(脚手架建的目录)。
|
|
513
|
+
|
|
514
|
+
test('detectRepoCreateTargets:只认"建仓库"的命令,抽出落点', () => {
|
|
515
|
+
const base = path.resolve(os.tmpdir(), 'ws-root')
|
|
516
|
+
const rel = (list) => list.map(p => path.relative(base, p) || '.').sort()
|
|
517
|
+
|
|
518
|
+
// 克隆:给了目标目录用它;没给就按仓库名猜(与 /api/clone 同一规则)
|
|
519
|
+
assert.deepEqual(rel(detectRepoCreateTargets('git clone https://github.com/o/demo.git', base)), ['demo'])
|
|
520
|
+
assert.deepEqual(rel(detectRepoCreateTargets('git clone git@gitee.com:o/x.git custom', base)), ['custom'])
|
|
521
|
+
// init:没给目录就是 cwd;`git -C` / `cd` 链按它们解析
|
|
522
|
+
assert.deepEqual(rel(detectRepoCreateTargets('git init', base)), ['.'])
|
|
523
|
+
assert.deepEqual(rel(detectRepoCreateTargets('mkdir p && cd p && git init', base)), ['.', 'p'])
|
|
524
|
+
assert.deepEqual(rel(detectRepoCreateTargets('git -C sub init', base)), ['sub'])
|
|
525
|
+
// gh repo create:只有 --clone 才在本地建出目录
|
|
526
|
+
assert.deepEqual(rel(detectRepoCreateTargets('gh repo create o/n --clone', base)), ['n'])
|
|
527
|
+
assert.deepEqual(rel(detectRepoCreateTargets('gh repo create o/n --public', base)), [])
|
|
528
|
+
// 不是建仓库的命令:一个都不给(不能因为智能体"逛"过某个仓库就登记它)
|
|
529
|
+
assert.deepEqual(detectRepoCreateTargets('git status', base), [])
|
|
530
|
+
assert.deepEqual(detectRepoCreateTargets('npm run build', base), [])
|
|
531
|
+
})
|
|
532
|
+
|
|
533
|
+
test('run_command 建了仓库后把落点交给注入的登记实现', async () => {
|
|
534
|
+
const repo = path.join(tmpDir, 'auto-registered-repo')
|
|
535
|
+
await fs.mkdir(path.join(repo, '.git'), { recursive: true })
|
|
536
|
+
const seen = []
|
|
537
|
+
// 命令文本里含 `git init` 即命中识别;这条用例不真跑 git(只验链路),
|
|
538
|
+
// 所以造一个假的 .git 目录 —— isGitRepoRoot 只 stat 它,不调 git。
|
|
539
|
+
const out = await executeTool('run_command', { command: 'echo git init', cwd: repo }, {
|
|
540
|
+
...ctx, registerProject: async (dir) => { seen.push(dir) },
|
|
541
|
+
})
|
|
542
|
+
assert.match(out, /exit 0/)
|
|
543
|
+
assert.deepEqual(seen, [repo])
|
|
544
|
+
await fs.rm(repo, { recursive: true, force: true })
|
|
545
|
+
})
|
|
546
|
+
|
|
547
|
+
test('run_command 普通命令不登记任何目录', async () => {
|
|
548
|
+
const repo = path.join(tmpDir, 'not-a-create-cmd')
|
|
549
|
+
await fs.mkdir(path.join(repo, '.git'), { recursive: true })
|
|
550
|
+
const seen = []
|
|
551
|
+
await executeTool('run_command', { command: 'echo hello', cwd: repo }, {
|
|
552
|
+
...ctx, registerProject: async (dir) => { seen.push(dir) },
|
|
553
|
+
})
|
|
554
|
+
assert.deepEqual(seen, [])
|
|
555
|
+
await fs.rm(repo, { recursive: true, force: true })
|
|
556
|
+
})
|
|
557
|
+
|
|
558
|
+
test('register_project 把已存在的目录交给注入的实现', async () => {
|
|
559
|
+
const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'g-ai-reg-'))
|
|
560
|
+
const seen = []
|
|
561
|
+
const out = await executeTool('register_project', { path: dir }, {
|
|
562
|
+
...ctx, registerProject: async (d) => { seen.push(d) },
|
|
563
|
+
})
|
|
564
|
+
assert.deepEqual(seen, [dir])
|
|
565
|
+
assert.match(out, /常用目录/)
|
|
566
|
+
await fs.rm(dir, { recursive: true, force: true })
|
|
567
|
+
})
|
|
568
|
+
|
|
569
|
+
test('register_project:目录不存在 / 未注入实现 / 空路径都给可照做的错误', async () => {
|
|
570
|
+
const withImpl = { ...ctx, registerProject: async () => {} }
|
|
571
|
+
const missing = path.join(os.tmpdir(), `g-ai-reg-missing-${Date.now()}`)
|
|
572
|
+
assert.match(await executeTool('register_project', { path: missing }, withImpl), /目录不存在/)
|
|
573
|
+
assert.match(await executeTool('register_project', {}, withImpl), /path 不能为空/)
|
|
574
|
+
// CLI 下没有「常用目录」这个概念 —— 要回一句说明,而不是崩掉
|
|
575
|
+
assert.match(await executeTool('register_project', { path: tmpDir }, ctx), /只在 g ui/)
|
|
576
|
+
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.marketplace-panel[data-v-536d7952]{background:var(--bg-container);flex-direction:column;height:100%;min-height:0;display:flex}.mp-toolbar[data-v-536d7952]{flex-shrink:0;align-items:center;gap:12px;padding:12px 16px 8px;display:flex}.mp-search[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);max-width:420px;height:32px;transition:border-color var(--transition-fast) ease;flex:1;align-items:center;gap:6px;padding:0 10px;display:flex}.mp-search[data-v-536d7952]:focus-within{border-color:var(--color-primary)}.mp-search .mp-search-icon[data-v-536d7952]{color:var(--text-meta);flex-shrink:0}.mp-search .mp-search-input[data-v-536d7952]{color:var(--text-primary);font-size:var(--font-size-mid);background:0 0;border:none;outline:none;flex:1;font-family:inherit}.mp-search .mp-search-input[data-v-536d7952]::placeholder{color:var(--text-meta)}.mp-target[data-v-536d7952]{flex-shrink:0}.mp-refresh[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);width:30px;height:30px;color:var(--text-secondary);cursor:pointer;transition:var(--transition-ui-fast);justify-content:center;align-items:center;display:flex}.mp-refresh[data-v-536d7952]:hover{color:var(--color-primary);border-color:var(--color-primary)}.mp-refresh.spinning svg[data-v-536d7952]{animation:.9s linear infinite mkt-spin-536d7952}@keyframes mkt-spin-536d7952{to{transform:rotate(360deg)}}.mp-toolbar-sub[data-v-536d7952]{flex-wrap:wrap;flex-shrink:0;align-items:center;gap:12px;padding:0 16px 10px;display:flex}.mp-target-hint[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-meta)}.mp-target-hint b[data-v-536d7952]{color:var(--color-primary);font-weight:600}.mp-source-filter[data-v-536d7952]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.mp-chip[data-v-536d7952]{font-size:var(--font-size-sm);border:1px solid var(--border-color);border-radius:var(--radius-xl);color:var(--text-meta);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:2px 10px;font-family:inherit}.mp-chip[data-v-536d7952]:hover{color:var(--text-secondary);border-color:var(--text-tertiary)}.mp-chip.active[data-v-536d7952]{color:var(--color-primary);border-color:var(--color-primary);background:color-mix(in srgb, var(--color-primary) 8%, transparent)}.mp-chip.clear[data-v-536d7952]{color:var(--text-meta);border-style:dashed}.mp-body[data-v-536d7952]{flex:1;min-height:0;padding:0 16px 20px;overflow-y:auto}.mp-group[data-v-536d7952]{margin-bottom:20px}.mp-group.installed[data-v-536d7952]{border-top:1px dashed var(--border-color);padding-top:14px}.mp-group-header[data-v-536d7952]{align-items:center;gap:8px;margin-bottom:10px;display:flex}.mp-group-title[data-v-536d7952]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mp-group-count[data-v-536d7952]{min-width:20px;height:18px;font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-meta);justify-content:center;align-items:center;padding:0 6px;display:inline-flex}.mp-group-error[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--color-warning-dark);align-items:center;gap:4px;display:inline-flex}.mp-group-link[data-v-536d7952]{color:var(--text-meta);transition:color var(--transition-fast) ease;display:inline-flex}.mp-group-link[data-v-536d7952]:hover{color:var(--color-primary)}.mp-grid[data-v-536d7952]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;display:grid}.mp-card[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);transition:border-color var(--transition-fast) ease, box-shadow var(--transition-fast) ease;flex-direction:column;gap:6px;padding:12px;display:flex}.mp-card[data-v-536d7952]:hover{border-color:color-mix(in srgb, var(--color-primary) 40%, var(--border-color));box-shadow:var(--shadow-sm)}.mp-card-head[data-v-536d7952]{align-items:center;gap:8px;display:flex}.mp-card-name[data-v-536d7952]{min-width:0;font-size:var(--font-size-mid);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-weight:600;overflow:hidden}.mp-card-metric[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);flex-shrink:0;align-items:center;gap:3px;display:inline-flex}.mp-card-desc[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:36px;margin:0;line-height:1.5;display:-webkit-box;overflow:hidden}.mp-card-meta[data-v-536d7952]{flex-wrap:wrap;align-items:center;gap:6px;min-height:18px;display:flex}.mp-meta-pkg[data-v-536d7952],.mp-meta-repo[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;max-width:220px;overflow:hidden}.mp-tag[data-v-536d7952]{font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-meta);flex-shrink:0;padding:1px 6px}.mp-tag.remote[data-v-536d7952]{background:color-mix(in srgb, var(--color-info,var(--action-teal)) 14%, transparent);color:var(--color-info,var(--action-teal))}.mp-tag.warn[data-v-536d7952]{background:color-mix(in srgb, var(--color-warning) 14%, transparent);color:var(--color-warning-dark)}.mp-card-foot[data-v-536d7952]{align-items:center;gap:8px;margin-top:2px;display:flex}.mp-card-link[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);text-decoration:none}.mp-card-link[data-v-536d7952]:hover{color:var(--color-primary);text-decoration:underline}.mp-foot-spacer[data-v-536d7952]{flex:1}.mp-install-btn[data-v-536d7952]{font-size:var(--font-size-sm);border:1px solid var(--color-primary);border-radius:var(--radius-base);color:var(--color-primary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:4px 14px;font-family:inherit}.mp-install-btn[data-v-536d7952]:hover:not(:disabled){background:var(--color-primary);color:#fff}.mp-install-btn[data-v-536d7952]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.mp-installed-chip[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--color-success,var(--action-emerald));align-items:center;gap:3px;display:inline-flex}.mp-not-installable[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta)}.mp-empty[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-meta);padding:16px 0}.mp-empty.all[data-v-536d7952]{text-align:center;padding:48px 0}.mp-installed-block[data-v-536d7952]{margin-bottom:12px}.mp-installed-target[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);text-transform:uppercase;letter-spacing:.4px;margin-bottom:6px;font-weight:600}.mp-installed-list[data-v-536d7952]{flex-direction:column;gap:4px;display:flex}.mp-installed-row[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-base);background:var(--bg-panel);align-items:center;gap:10px;padding:6px 10px;display:flex}.mp-installed-name[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:500;overflow:hidden}.mp-installed-id[data-v-536d7952]{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;max-width:40%;overflow:hidden}.mp-reveal-btn[data-v-536d7952],.mp-remove-btn[data-v-536d7952]{font-size:var(--font-size-xs);border:1px solid var(--border-color);border-radius:var(--radius-xs);color:var(--text-meta);cursor:pointer;white-space:nowrap;transition:var(--transition-ui-fast);background:0 0;align-items:center;gap:4px;padding:3px 10px;font-family:inherit;display:inline-flex}.mp-reveal-btn[data-v-536d7952]:disabled,.mp-remove-btn[data-v-536d7952]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.mp-reveal-btn[data-v-536d7952]:hover:not(:disabled){color:var(--text-primary);border-color:var(--text-tertiary)}.mp-remove-btn[data-v-536d7952]:hover:not(:disabled){color:var(--color-danger-dark);border-color:var(--color-danger)}@media (prefers-reduced-motion:reduce){.mp-refresh.spinning svg[data-v-536d7952]{animation:none}}.mkt-form[data-v-536d7952]{flex-direction:column;gap:12px;display:flex}.mkt-form-name[data-v-536d7952]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mkt-field[data-v-536d7952]{flex-direction:column;gap:4px;display:flex}.mkt-field label[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:600}.mkt-field input[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-container);height:30px;color:var(--text-primary);font-size:var(--font-size-mid);transition:border-color var(--transition-fast) ease;padding:0 8px;font-family:inherit}.mkt-field input[data-v-536d7952]:focus{border-color:var(--color-primary);outline:none}.mkt-hint[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);margin:0}.mkt-cancel[data-v-536d7952],.mkt-confirm[data-v-536d7952]{font-size:var(--font-size-mid);border-radius:var(--radius-base);cursor:pointer;transition:var(--transition-ui-fast);padding:6px 16px;font-family:inherit}.mkt-cancel[data-v-536d7952]{border:1px solid var(--border-color);color:var(--text-secondary);background:0 0;margin-right:8px}.mkt-cancel[data-v-536d7952]:hover{color:var(--text-primary);border-color:var(--text-tertiary)}.mkt-confirm[data-v-536d7952]{border:1px solid var(--color-primary);background:var(--color-primary);color:#fff}.mkt-confirm[data-v-536d7952]:hover{opacity:.9}.schedule-panel[data-v-75be84e5]{flex-direction:column;flex:1;gap:12px;min-height:0;padding:16px 20px 24px;display:flex;overflow-y:auto}.schedule-toolbar[data-v-75be84e5]{justify-content:space-between;align-items:center;gap:12px;display:flex}.schedule-summary[data-v-75be84e5]{color:var(--text-secondary);font-size:12px}.schedule-error[data-v-75be84e5]{color:var(--text-danger);background:color-mix(in srgb, var(--color-danger) 8%, transparent);border:1px solid color-mix(in srgb, var(--color-danger) 25%, transparent);border-radius:6px;padding:8px 10px;font-size:12px}.schedule-loading[data-v-75be84e5],.schedule-empty[data-v-75be84e5]{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:40px 20px;font-size:13px;display:flex}.schedule-empty-title[data-v-75be84e5]{color:var(--text-primary);margin:0;font-size:14px;font-weight:500}.schedule-empty-desc[data-v-75be84e5]{text-align:center;max-width:440px;color:var(--text-tertiary);margin:0;font-size:12px;line-height:1.7}.schedule-list[data-v-75be84e5]{flex-direction:column;gap:8px;display:flex}.schedule-card[data-v-75be84e5]{background:var(--bg-card);border:1px solid var(--border-color);border-radius:8px;justify-content:space-between;align-items:center;gap:12px;padding:10px 14px;transition:border-color .15s,background .15s;display:flex}.schedule-card[data-v-75be84e5]:hover{border-color:var(--border-color-medium)}.schedule-card.is-running[data-v-75be84e5]{border-color:var(--tint-primary-35);background:var(--tint-primary-04)}.schedule-card.is-disabled .schedule-name[data-v-75be84e5]{color:var(--text-secondary)}.schedule-card-body[data-v-75be84e5]{flex-direction:column;gap:4px;min-width:0;display:flex}.schedule-card-head[data-v-75be84e5]{align-items:center;gap:8px;min-width:0;display:flex}.schedule-name[data-v-75be84e5]{color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:500;overflow:hidden}.schedule-running[data-v-75be84e5]{color:var(--color-primary);background:var(--tint-primary-10);white-space:nowrap;border-radius:4px;padding:1px 6px;font-size:11px}.schedule-card-sub[data-v-75be84e5]{color:var(--text-secondary);white-space:nowrap;align-items:center;gap:6px;min-width:0;font-size:12px;display:flex;overflow:hidden}.schedule-desc[data-v-75be84e5]{text-overflow:ellipsis;overflow:hidden}.schedule-sep[data-v-75be84e5]{color:var(--text-tertiary)}.schedule-last[data-v-75be84e5]{text-overflow:ellipsis;overflow:hidden}.schedule-last.is-ok[data-v-75be84e5]{color:var(--text-success)}.schedule-last.is-error[data-v-75be84e5]{color:var(--text-danger)}.schedule-last.is-skipped[data-v-75be84e5]{color:var(--text-warning)}.schedule-last.is-muted[data-v-75be84e5]{color:var(--text-tertiary)}.sch-link[data-v-75be84e5]{color:var(--color-primary);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px}.sch-link[data-v-75be84e5]:hover{text-decoration:underline}.schedule-card-side[data-v-75be84e5]{flex-shrink:0;align-items:center;gap:12px;display:flex}.schedule-next[data-v-75be84e5]{color:var(--text-secondary);white-space:nowrap;font-size:12px}.schedule-next.is-muted[data-v-75be84e5]{color:var(--text-tertiary)}.schedule-actions[data-v-75be84e5]{align-items:center;gap:2px;display:flex}.sch-switch[data-v-75be84e5]{border:1px solid var(--border-color-medium);background:var(--bg-subtle);cursor:pointer;border-radius:10px;flex-shrink:0;width:34px;height:20px;padding:0;transition:background .15s,border-color .15s;position:relative}.sch-switch .sch-switch-knob[data-v-75be84e5]{background:var(--text-tertiary);border-radius:50%;width:14px;height:14px;transition:transform .15s,background .15s;position:absolute;top:2px;left:2px}.sch-switch.on[data-v-75be84e5]{background:var(--tint-primary-18);border-color:var(--tint-primary-45)}.sch-switch.on .sch-switch-knob[data-v-75be84e5]{background:var(--color-primary);transform:translate(14px)}.sch-btn[data-v-75be84e5]{border:1px solid var(--border-color);color:var(--text-secondary);cursor:pointer;background:0 0;border-radius:6px;padding:3px 10px;font-size:12px;transition:background .15s,color .15s,border-color .15s}.sch-btn[data-v-75be84e5]:hover:not(:disabled){background:var(--bg-subtle-hover);color:var(--text-primary);border-color:var(--border-color-medium)}.sch-btn[data-v-75be84e5]:disabled{opacity:.5;cursor:default}.sch-btn-primary[data-v-75be84e5]{background:var(--tint-primary-10);border-color:var(--tint-primary-35);color:var(--color-primary)}.sch-btn-primary[data-v-75be84e5]:hover:not(:disabled){background:var(--tint-primary-18);color:var(--color-primary);border-color:var(--tint-primary-45)}.sch-btn-danger[data-v-75be84e5]{color:var(--text-danger)}.sch-btn-danger[data-v-75be84e5]:hover:not(:disabled){background:color-mix(in srgb, var(--color-danger) 8%, transparent);color:var(--text-danger);border-color:color-mix(in srgb, var(--color-danger) 30%, transparent)}.sch-form[data-v-75be84e5]{flex-direction:column;gap:14px;display:flex}.sch-field[data-v-75be84e5]{flex-direction:column;gap:6px;display:flex}.sch-field-label[data-v-75be84e5]{color:var(--text-secondary);font-size:12px}.sch-input[data-v-75be84e5]{box-sizing:border-box;width:100%;color:var(--text-primary);background:var(--bg-container);border:1px solid var(--border-color-medium);border-radius:6px;outline:none;padding:6px 10px;font-family:inherit;font-size:13px;transition:border-color .15s}.sch-input[data-v-75be84e5]:focus{border-color:var(--tint-primary-55)}.sch-select[data-v-75be84e5]{cursor:pointer}.sch-select-sm[data-v-75be84e5]{width:auto;min-width:64px}.sch-input-cron[data-v-75be84e5]{font-family:var(--font-mono,monospace)}.sch-textarea[data-v-75be84e5]{resize:vertical;min-height:72px;line-height:1.6}.sch-freq-row[data-v-75be84e5]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.sch-inline-label[data-v-75be84e5]{color:var(--text-secondary);white-space:nowrap;font-size:12px}.sch-hint[data-v-75be84e5]{color:var(--text-tertiary);font-size:11px}.sch-radio-row[data-v-75be84e5]{flex-wrap:wrap;align-items:center;gap:16px;display:flex}.sch-radio[data-v-75be84e5]{color:var(--text-secondary);cursor:pointer;align-items:center;gap:6px;font-size:12px;display:inline-flex}.sch-radio input[data-v-75be84e5]{accent-color:var(--color-primary);cursor:pointer;margin:0}.sch-form-error[data-v-75be84e5]{color:var(--text-danger);margin:0;font-size:12px}.sch-form-footer[data-v-75be84e5]{justify-content:flex-end;gap:8px;margin-top:14px;display:flex}.sch-confirm-text[data-v-75be84e5]{color:var(--text-primary);margin:0;font-size:13px;line-height:1.7}.aps[data-v-ae77c09c]{background:var(--bg-container);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.aps__scroll[data-v-ae77c09c]{flex-direction:column;flex:1;gap:14px;max-width:860px;min-height:0;padding:16px 18px 24px;line-height:1.5;display:flex;overflow-y:auto}.aps__head[data-v-ae77c09c]{flex-direction:column;gap:5px;display:flex}.aps__title[data-v-ae77c09c]{font-size:var(--font-size-lg);color:var(--text-primary);margin:0;font-weight:600}.aps__intro[data-v-ae77c09c]{font-size:var(--font-size-sm);color:var(--text-meta);margin:0;line-height:1.6}.aps__card[data-v-ae77c09c]{background:var(--bg-panel);border:1px solid var(--border-color);border-radius:var(--radius-lg);flex-direction:column;gap:9px;padding:14px 16px;display:flex}.aps__card-head[data-v-ae77c09c]{align-items:baseline;gap:8px;display:flex}.aps__card-title[data-v-ae77c09c]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.aps__label[data-v-ae77c09c]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:500}.aps__count[data-v-ae77c09c]{font-size:var(--font-size-xs);color:var(--text-meta);font-variant-numeric:tabular-nums;margin-left:auto}.aps__field[data-v-ae77c09c]{flex-direction:column;gap:5px;display:flex}.aps__hint[data-v-ae77c09c]{font-size:var(--font-size-xs);color:var(--text-meta);margin:0;line-height:1.6}.aps__area[data-v-ae77c09c]{box-sizing:border-box;resize:vertical;width:100%;min-height:92px;max-height:320px;font-size:var(--font-size-mid);color:var(--text-primary);background:var(--bg-subtle);border:1px solid var(--border-color);border-radius:var(--radius-md);transition:border-color var(--transition-fast) var(--ease-custom);outline:none;padding:7px 9px;font-family:inherit;line-height:1.5}.aps__area[data-v-ae77c09c]:focus{border-color:var(--color-primary)}.aps__area[data-v-ae77c09c]::placeholder{color:var(--text-meta)}.aps__area[data-v-ae77c09c]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.aps__foot[data-v-ae77c09c]{align-items:center;gap:8px;display:flex}.aps__spacer[data-v-ae77c09c]{flex:1}.aps__saved[data-v-ae77c09c]{font-size:var(--font-size-xs);color:var(--text-meta)}.aps__btn[data-v-ae77c09c]{color:var(--text-secondary);font-size:var(--font-size-sm);border-radius:var(--radius-md);cursor:pointer;transition:color var(--transition-fast) var(--ease-custom), background var(--transition-fast) var(--ease-custom);background:0 0;border:none;padding:0 12px;line-height:28px}.aps__btn[data-v-ae77c09c]:hover:not(:disabled){color:var(--color-primary);background:var(--bg-container-hover)}.aps__btn[data-v-ae77c09c]:disabled{opacity:var(--disabled-opacity);cursor:default}.aps__btn[data-v-ae77c09c]:focus-visible{outline:var(--focus-outline);outline-offset:1px}.aps__btn--primary[data-v-ae77c09c]{background:var(--color-primary);color:#fff}.aps__btn--primary[data-v-ae77c09c]:hover:not(:disabled){background:var(--color-primary);color:#fff;opacity:.88}.agent-view[data-v-19c12ea4]{background:var(--bg-container);height:100%;min-height:0;display:flex}.agent-sidebar[data-v-19c12ea4]{background:var(--bg-panel);border-right:1px solid var(--border-color);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.agent-conversations[data-v-19c12ea4]{flex:1;min-height:0;padding:10px 6px 8px 12px}.sidebar-resizer[data-v-19c12ea4]{cursor:col-resize;width:4px;transition:background var(--transition-fast) ease;background:0 0;flex-shrink:0}.sidebar-resizer[data-v-19c12ea4]:hover,.sidebar-resizer.active[data-v-19c12ea4]{background:var(--color-primary);opacity:.3}.agent-chat-area[data-v-19c12ea4]{flex-direction:column;flex:1;min-width:0;display:flex;position:relative;overflow:hidden}.agent-engine[data-v-19c12ea4]{margin-bottom:7px;margin-left:auto}.agent-copy[data-v-19c12ea4]{margin-bottom:7px;margin-left:2px}.agent-tabs[data-v-19c12ea4]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:4px;padding:8px 12px 0;display:flex}.agent-tab[data-v-19c12ea4]{color:var(--text-meta);font-size:var(--font-size-mid);cursor:pointer;transition:color var(--transition-fast) ease, border-color var(--transition-fast) ease, background var(--transition-fast) ease;border-radius:var(--radius-base) var(--radius-base) 0 0;background:0 0;border:none;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:7px 14px 9px;font-family:inherit;display:inline-flex}.agent-tab[data-v-19c12ea4]:hover{color:var(--text-secondary);background:var(--bg-hover)}.agent-tab.active[data-v-19c12ea4]{color:var(--color-primary);border-bottom-color:var(--color-primary);font-weight:600}.agent-tab-body[data-v-19c12ea4]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-pane[data-v-19c12ea4]{flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.agent-tab-body[data-v-19c12ea4]>.marketplace-panel{flex:1;min-height:0}.chat-loading[data-v-19c12ea4]{color:var(--text-meta);font-size:var(--font-size-base);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}.agent-list-page[data-v-19c12ea4]{background:var(--bg-panel);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-list-page .agent-conversations[data-v-19c12ea4]{padding:12px 12px 10px 14px}.agent-page-bar[data-v-19c12ea4]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:6px;height:34px;padding:0 12px 0 6px;display:flex}.agent-page-back[data-v-19c12ea4]{border-radius:var(--radius-xs);width:24px;height:24px;color:var(--text-meta);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.agent-page-back[data-v-19c12ea4]:hover{background:var(--bg-hover);color:var(--text-secondary)}.agent-page-title[data-v-19c12ea4]{min-width:0;font-size:var(--font-size-mid);color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.agent-chat-host[data-v-19c12ea4]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-host[data-v-19c12ea4] .acu-avatar--left{background:0 0}.agent-chat-host[data-v-19c12ea4] .acu-bubble-row.is-assistant .acu-bubble-main{width:var(--acu-bubble-max-width);max-width:var(--acu-bubble-max-width);position:relative}.agent-chat-host[data-v-19c12ea4] .acu-bubble-row.is-assistant .acu-bubble{align-self:flex-start}.agent-chat-host[data-v-19c12ea4] .acu-message-meta{margin:0;position:absolute;top:0;right:0}.agent-chat-host[data-v-19c12ea4] .acu-input-queue{--acu-queue-edge:var(--role-pending-edge);--acu-queue-surface:var(--role-pending-surface);--acu-queue-ink:var(--role-pending-ink);--acu-queue-wash:var(--role-pending-wash)}.agent-chat-host[data-v-19c12ea4] .acu-welcome-logo{background:var(--welcome-avatar) center/46px 46px no-repeat;width:56px;height:56px;box-shadow:none}.agent-chat-host[data-v-19c12ea4] .acu-welcome-logo>svg{display:none}.agent-chat-host[data-v-19c12ea4] .acu-welcome-grid{flex-wrap:wrap;display:flex}.agent-chat-host[data-v-19c12ea4] .acu-welcome-grid>.acu-preset-q{flex:260px;min-width:0}[data-theme=dark]{background:var(--bg-panel)}
|
|
1
|
+
.marketplace-panel[data-v-536d7952]{background:var(--bg-container);flex-direction:column;height:100%;min-height:0;display:flex}.mp-toolbar[data-v-536d7952]{flex-shrink:0;align-items:center;gap:12px;padding:12px 16px 8px;display:flex}.mp-search[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);max-width:420px;height:32px;transition:border-color var(--transition-fast) ease;flex:1;align-items:center;gap:6px;padding:0 10px;display:flex}.mp-search[data-v-536d7952]:focus-within{border-color:var(--color-primary)}.mp-search .mp-search-icon[data-v-536d7952]{color:var(--text-meta);flex-shrink:0}.mp-search .mp-search-input[data-v-536d7952]{color:var(--text-primary);font-size:var(--font-size-mid);background:0 0;border:none;outline:none;flex:1;font-family:inherit}.mp-search .mp-search-input[data-v-536d7952]::placeholder{color:var(--text-meta)}.mp-target[data-v-536d7952]{flex-shrink:0}.mp-refresh[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);width:30px;height:30px;color:var(--text-secondary);cursor:pointer;transition:var(--transition-ui-fast);justify-content:center;align-items:center;display:flex}.mp-refresh[data-v-536d7952]:hover{color:var(--color-primary);border-color:var(--color-primary)}.mp-refresh.spinning svg[data-v-536d7952]{animation:.9s linear infinite mkt-spin-536d7952}@keyframes mkt-spin-536d7952{to{transform:rotate(360deg)}}.mp-toolbar-sub[data-v-536d7952]{flex-wrap:wrap;flex-shrink:0;align-items:center;gap:12px;padding:0 16px 10px;display:flex}.mp-target-hint[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-meta)}.mp-target-hint b[data-v-536d7952]{color:var(--color-primary);font-weight:600}.mp-source-filter[data-v-536d7952]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.mp-chip[data-v-536d7952]{font-size:var(--font-size-sm);border:1px solid var(--border-color);border-radius:var(--radius-xl);color:var(--text-meta);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:2px 10px;font-family:inherit}.mp-chip[data-v-536d7952]:hover{color:var(--text-secondary);border-color:var(--text-tertiary)}.mp-chip.active[data-v-536d7952]{color:var(--color-primary);border-color:var(--color-primary);background:color-mix(in srgb, var(--color-primary) 8%, transparent)}.mp-chip.clear[data-v-536d7952]{color:var(--text-meta);border-style:dashed}.mp-body[data-v-536d7952]{flex:1;min-height:0;padding:0 16px 20px;overflow-y:auto}.mp-group[data-v-536d7952]{margin-bottom:20px}.mp-group.installed[data-v-536d7952]{border-top:1px dashed var(--border-color);padding-top:14px}.mp-group-header[data-v-536d7952]{align-items:center;gap:8px;margin-bottom:10px;display:flex}.mp-group-title[data-v-536d7952]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mp-group-count[data-v-536d7952]{min-width:20px;height:18px;font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-meta);justify-content:center;align-items:center;padding:0 6px;display:inline-flex}.mp-group-error[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--color-warning-dark);align-items:center;gap:4px;display:inline-flex}.mp-group-link[data-v-536d7952]{color:var(--text-meta);transition:color var(--transition-fast) ease;display:inline-flex}.mp-group-link[data-v-536d7952]:hover{color:var(--color-primary)}.mp-grid[data-v-536d7952]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;display:grid}.mp-card[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-panel);transition:border-color var(--transition-fast) ease, box-shadow var(--transition-fast) ease;flex-direction:column;gap:6px;padding:12px;display:flex}.mp-card[data-v-536d7952]:hover{border-color:color-mix(in srgb, var(--color-primary) 40%, var(--border-color));box-shadow:var(--shadow-sm)}.mp-card-head[data-v-536d7952]{align-items:center;gap:8px;display:flex}.mp-card-name[data-v-536d7952]{min-width:0;font-size:var(--font-size-mid);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-weight:600;overflow:hidden}.mp-card-metric[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);flex-shrink:0;align-items:center;gap:3px;display:inline-flex}.mp-card-desc[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:36px;margin:0;line-height:1.5;display:-webkit-box;overflow:hidden}.mp-card-meta[data-v-536d7952]{flex-wrap:wrap;align-items:center;gap:6px;min-height:18px;display:flex}.mp-meta-pkg[data-v-536d7952],.mp-meta-repo[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;max-width:220px;overflow:hidden}.mp-tag[data-v-536d7952]{font-size:var(--font-size-xs);border-radius:var(--radius-lg);background:var(--bg-hover);color:var(--text-meta);flex-shrink:0;padding:1px 6px}.mp-tag.remote[data-v-536d7952]{background:color-mix(in srgb, var(--color-info,var(--action-teal)) 14%, transparent);color:var(--color-info,var(--action-teal))}.mp-tag.warn[data-v-536d7952]{background:color-mix(in srgb, var(--color-warning) 14%, transparent);color:var(--color-warning-dark)}.mp-card-foot[data-v-536d7952]{align-items:center;gap:8px;margin-top:2px;display:flex}.mp-card-link[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);text-decoration:none}.mp-card-link[data-v-536d7952]:hover{color:var(--color-primary);text-decoration:underline}.mp-foot-spacer[data-v-536d7952]{flex:1}.mp-install-btn[data-v-536d7952]{font-size:var(--font-size-sm);border:1px solid var(--color-primary);border-radius:var(--radius-base);color:var(--color-primary);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;padding:4px 14px;font-family:inherit}.mp-install-btn[data-v-536d7952]:hover:not(:disabled){background:var(--color-primary);color:#fff}.mp-install-btn[data-v-536d7952]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.mp-installed-chip[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--color-success,var(--action-emerald));align-items:center;gap:3px;display:inline-flex}.mp-not-installable[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta)}.mp-empty[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-meta);padding:16px 0}.mp-empty.all[data-v-536d7952]{text-align:center;padding:48px 0}.mp-installed-block[data-v-536d7952]{margin-bottom:12px}.mp-installed-target[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);text-transform:uppercase;letter-spacing:.4px;margin-bottom:6px;font-weight:600}.mp-installed-list[data-v-536d7952]{flex-direction:column;gap:4px;display:flex}.mp-installed-row[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-base);background:var(--bg-panel);align-items:center;gap:10px;padding:6px 10px;display:flex}.mp-installed-name[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:500;overflow:hidden}.mp-installed-id[data-v-536d7952]{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-meta);white-space:nowrap;text-overflow:ellipsis;max-width:40%;overflow:hidden}.mp-reveal-btn[data-v-536d7952],.mp-remove-btn[data-v-536d7952]{font-size:var(--font-size-xs);border:1px solid var(--border-color);border-radius:var(--radius-xs);color:var(--text-meta);cursor:pointer;white-space:nowrap;transition:var(--transition-ui-fast);background:0 0;align-items:center;gap:4px;padding:3px 10px;font-family:inherit;display:inline-flex}.mp-reveal-btn[data-v-536d7952]:disabled,.mp-remove-btn[data-v-536d7952]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.mp-reveal-btn[data-v-536d7952]:hover:not(:disabled){color:var(--text-primary);border-color:var(--text-tertiary)}.mp-remove-btn[data-v-536d7952]:hover:not(:disabled){color:var(--color-danger-dark);border-color:var(--color-danger)}@media (prefers-reduced-motion:reduce){.mp-refresh.spinning svg[data-v-536d7952]{animation:none}}.mkt-form[data-v-536d7952]{flex-direction:column;gap:12px;display:flex}.mkt-form-name[data-v-536d7952]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.mkt-field[data-v-536d7952]{flex-direction:column;gap:4px;display:flex}.mkt-field label[data-v-536d7952]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:600}.mkt-field input[data-v-536d7952]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--bg-container);height:30px;color:var(--text-primary);font-size:var(--font-size-mid);transition:border-color var(--transition-fast) ease;padding:0 8px;font-family:inherit}.mkt-field input[data-v-536d7952]:focus{border-color:var(--color-primary);outline:none}.mkt-hint[data-v-536d7952]{font-size:var(--font-size-xs);color:var(--text-meta);margin:0}.mkt-cancel[data-v-536d7952],.mkt-confirm[data-v-536d7952]{font-size:var(--font-size-mid);border-radius:var(--radius-base);cursor:pointer;transition:var(--transition-ui-fast);padding:6px 16px;font-family:inherit}.mkt-cancel[data-v-536d7952]{border:1px solid var(--border-color);color:var(--text-secondary);background:0 0;margin-right:8px}.mkt-cancel[data-v-536d7952]:hover{color:var(--text-primary);border-color:var(--text-tertiary)}.mkt-confirm[data-v-536d7952]{border:1px solid var(--color-primary);background:var(--color-primary);color:#fff}.mkt-confirm[data-v-536d7952]:hover{opacity:.9}.schedule-panel[data-v-75be84e5]{flex-direction:column;flex:1;gap:12px;min-height:0;padding:16px 20px 24px;display:flex;overflow-y:auto}.schedule-toolbar[data-v-75be84e5]{justify-content:space-between;align-items:center;gap:12px;display:flex}.schedule-summary[data-v-75be84e5]{color:var(--text-secondary);font-size:12px}.schedule-error[data-v-75be84e5]{color:var(--text-danger);background:color-mix(in srgb, var(--color-danger) 8%, transparent);border:1px solid color-mix(in srgb, var(--color-danger) 25%, transparent);border-radius:6px;padding:8px 10px;font-size:12px}.schedule-loading[data-v-75be84e5],.schedule-empty[data-v-75be84e5]{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:40px 20px;font-size:13px;display:flex}.schedule-empty-title[data-v-75be84e5]{color:var(--text-primary);margin:0;font-size:14px;font-weight:500}.schedule-empty-desc[data-v-75be84e5]{text-align:center;max-width:440px;color:var(--text-tertiary);margin:0;font-size:12px;line-height:1.7}.schedule-list[data-v-75be84e5]{flex-direction:column;gap:8px;display:flex}.schedule-card[data-v-75be84e5]{background:var(--bg-card);border:1px solid var(--border-color);border-radius:8px;justify-content:space-between;align-items:center;gap:12px;padding:10px 14px;transition:border-color .15s,background .15s;display:flex}.schedule-card[data-v-75be84e5]:hover{border-color:var(--border-color-medium)}.schedule-card.is-running[data-v-75be84e5]{border-color:var(--tint-primary-35);background:var(--tint-primary-04)}.schedule-card.is-disabled .schedule-name[data-v-75be84e5]{color:var(--text-secondary)}.schedule-card-body[data-v-75be84e5]{flex-direction:column;gap:4px;min-width:0;display:flex}.schedule-card-head[data-v-75be84e5]{align-items:center;gap:8px;min-width:0;display:flex}.schedule-name[data-v-75be84e5]{color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:500;overflow:hidden}.schedule-running[data-v-75be84e5]{color:var(--color-primary);background:var(--tint-primary-10);white-space:nowrap;border-radius:4px;padding:1px 6px;font-size:11px}.schedule-card-sub[data-v-75be84e5]{color:var(--text-secondary);white-space:nowrap;align-items:center;gap:6px;min-width:0;font-size:12px;display:flex;overflow:hidden}.schedule-desc[data-v-75be84e5]{text-overflow:ellipsis;overflow:hidden}.schedule-sep[data-v-75be84e5]{color:var(--text-tertiary)}.schedule-last[data-v-75be84e5]{text-overflow:ellipsis;overflow:hidden}.schedule-last.is-ok[data-v-75be84e5]{color:var(--text-success)}.schedule-last.is-error[data-v-75be84e5]{color:var(--text-danger)}.schedule-last.is-skipped[data-v-75be84e5]{color:var(--text-warning)}.schedule-last.is-muted[data-v-75be84e5]{color:var(--text-tertiary)}.sch-link[data-v-75be84e5]{color:var(--color-primary);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px}.sch-link[data-v-75be84e5]:hover{text-decoration:underline}.schedule-card-side[data-v-75be84e5]{flex-shrink:0;align-items:center;gap:12px;display:flex}.schedule-next[data-v-75be84e5]{color:var(--text-secondary);white-space:nowrap;font-size:12px}.schedule-next.is-muted[data-v-75be84e5]{color:var(--text-tertiary)}.schedule-actions[data-v-75be84e5]{align-items:center;gap:2px;display:flex}.sch-switch[data-v-75be84e5]{border:1px solid var(--border-color-medium);background:var(--bg-subtle);cursor:pointer;border-radius:10px;flex-shrink:0;width:34px;height:20px;padding:0;transition:background .15s,border-color .15s;position:relative}.sch-switch .sch-switch-knob[data-v-75be84e5]{background:var(--text-tertiary);border-radius:50%;width:14px;height:14px;transition:transform .15s,background .15s;position:absolute;top:2px;left:2px}.sch-switch.on[data-v-75be84e5]{background:var(--tint-primary-18);border-color:var(--tint-primary-45)}.sch-switch.on .sch-switch-knob[data-v-75be84e5]{background:var(--color-primary);transform:translate(14px)}.sch-btn[data-v-75be84e5]{border:1px solid var(--border-color);color:var(--text-secondary);cursor:pointer;background:0 0;border-radius:6px;padding:3px 10px;font-size:12px;transition:background .15s,color .15s,border-color .15s}.sch-btn[data-v-75be84e5]:hover:not(:disabled){background:var(--bg-subtle-hover);color:var(--text-primary);border-color:var(--border-color-medium)}.sch-btn[data-v-75be84e5]:disabled{opacity:.5;cursor:default}.sch-btn-primary[data-v-75be84e5]{background:var(--tint-primary-10);border-color:var(--tint-primary-35);color:var(--color-primary)}.sch-btn-primary[data-v-75be84e5]:hover:not(:disabled){background:var(--tint-primary-18);color:var(--color-primary);border-color:var(--tint-primary-45)}.sch-btn-danger[data-v-75be84e5]{color:var(--text-danger)}.sch-btn-danger[data-v-75be84e5]:hover:not(:disabled){background:color-mix(in srgb, var(--color-danger) 8%, transparent);color:var(--text-danger);border-color:color-mix(in srgb, var(--color-danger) 30%, transparent)}.sch-form[data-v-75be84e5]{flex-direction:column;gap:14px;display:flex}.sch-field[data-v-75be84e5]{flex-direction:column;gap:6px;display:flex}.sch-field-label[data-v-75be84e5]{color:var(--text-secondary);font-size:12px}.sch-input[data-v-75be84e5]{box-sizing:border-box;width:100%;color:var(--text-primary);background:var(--bg-container);border:1px solid var(--border-color-medium);border-radius:6px;outline:none;padding:6px 10px;font-family:inherit;font-size:13px;transition:border-color .15s}.sch-input[data-v-75be84e5]:focus{border-color:var(--tint-primary-55)}.sch-select[data-v-75be84e5]{cursor:pointer}.sch-select-sm[data-v-75be84e5]{width:auto;min-width:64px}.sch-input-cron[data-v-75be84e5]{font-family:var(--font-mono,monospace)}.sch-textarea[data-v-75be84e5]{resize:vertical;min-height:72px;line-height:1.6}.sch-freq-row[data-v-75be84e5]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.sch-inline-label[data-v-75be84e5]{color:var(--text-secondary);white-space:nowrap;font-size:12px}.sch-hint[data-v-75be84e5]{color:var(--text-tertiary);font-size:11px}.sch-radio-row[data-v-75be84e5]{flex-wrap:wrap;align-items:center;gap:16px;display:flex}.sch-radio[data-v-75be84e5]{color:var(--text-secondary);cursor:pointer;align-items:center;gap:6px;font-size:12px;display:inline-flex}.sch-radio input[data-v-75be84e5]{accent-color:var(--color-primary);cursor:pointer;margin:0}.sch-form-error[data-v-75be84e5]{color:var(--text-danger);margin:0;font-size:12px}.sch-form-footer[data-v-75be84e5]{justify-content:flex-end;gap:8px;margin-top:14px;display:flex}.sch-confirm-text[data-v-75be84e5]{color:var(--text-primary);margin:0;font-size:13px;line-height:1.7}.aps[data-v-ae77c09c]{background:var(--bg-container);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.aps__scroll[data-v-ae77c09c]{flex-direction:column;flex:1;gap:14px;max-width:860px;min-height:0;padding:16px 18px 24px;line-height:1.5;display:flex;overflow-y:auto}.aps__head[data-v-ae77c09c]{flex-direction:column;gap:5px;display:flex}.aps__title[data-v-ae77c09c]{font-size:var(--font-size-lg);color:var(--text-primary);margin:0;font-weight:600}.aps__intro[data-v-ae77c09c]{font-size:var(--font-size-sm);color:var(--text-meta);margin:0;line-height:1.6}.aps__card[data-v-ae77c09c]{background:var(--bg-panel);border:1px solid var(--border-color);border-radius:var(--radius-lg);flex-direction:column;gap:9px;padding:14px 16px;display:flex}.aps__card-head[data-v-ae77c09c]{align-items:baseline;gap:8px;display:flex}.aps__card-title[data-v-ae77c09c]{font-size:var(--font-size-mid);color:var(--text-primary);margin:0;font-weight:600}.aps__label[data-v-ae77c09c]{font-size:var(--font-size-sm);color:var(--text-secondary);font-weight:500}.aps__count[data-v-ae77c09c]{font-size:var(--font-size-xs);color:var(--text-meta);font-variant-numeric:tabular-nums;margin-left:auto}.aps__field[data-v-ae77c09c]{flex-direction:column;gap:5px;display:flex}.aps__hint[data-v-ae77c09c]{font-size:var(--font-size-xs);color:var(--text-meta);margin:0;line-height:1.6}.aps__area[data-v-ae77c09c]{box-sizing:border-box;resize:vertical;width:100%;min-height:92px;max-height:320px;font-size:var(--font-size-mid);color:var(--text-primary);background:var(--bg-subtle);border:1px solid var(--border-color);border-radius:var(--radius-md);transition:border-color var(--transition-fast) var(--ease-custom);outline:none;padding:7px 9px;font-family:inherit;line-height:1.5}.aps__area[data-v-ae77c09c]:focus{border-color:var(--color-primary)}.aps__area[data-v-ae77c09c]::placeholder{color:var(--text-meta)}.aps__area[data-v-ae77c09c]:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.aps__foot[data-v-ae77c09c]{align-items:center;gap:8px;display:flex}.aps__spacer[data-v-ae77c09c]{flex:1}.aps__saved[data-v-ae77c09c]{font-size:var(--font-size-xs);color:var(--text-meta)}.aps__btn[data-v-ae77c09c]{color:var(--text-secondary);font-size:var(--font-size-sm);border-radius:var(--radius-md);cursor:pointer;transition:color var(--transition-fast) var(--ease-custom), background var(--transition-fast) var(--ease-custom);background:0 0;border:none;padding:0 12px;line-height:28px}.aps__btn[data-v-ae77c09c]:hover:not(:disabled){color:var(--color-primary);background:var(--bg-container-hover)}.aps__btn[data-v-ae77c09c]:disabled{opacity:var(--disabled-opacity);cursor:default}.aps__btn[data-v-ae77c09c]:focus-visible{outline:var(--focus-outline);outline-offset:1px}.aps__btn--primary[data-v-ae77c09c]{background:var(--color-primary);color:#fff}.aps__btn--primary[data-v-ae77c09c]:hover:not(:disabled){background:var(--color-primary);color:#fff;opacity:.88}.agent-view[data-v-aabe911d]{background:var(--bg-container);height:100%;min-height:0;display:flex}.agent-sidebar[data-v-aabe911d]{background:var(--bg-panel);border-right:1px solid var(--border-color);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.agent-conversations[data-v-aabe911d]{flex:1;min-height:0;padding:10px 6px 8px 12px}.sidebar-resizer[data-v-aabe911d]{cursor:col-resize;width:4px;transition:background var(--transition-fast) ease;background:0 0;flex-shrink:0}.sidebar-resizer[data-v-aabe911d]:hover,.sidebar-resizer.active[data-v-aabe911d]{background:var(--color-primary);opacity:.3}.agent-chat-area[data-v-aabe911d]{flex-direction:column;flex:1;min-width:0;display:flex;position:relative;overflow:hidden}.agent-engine[data-v-aabe911d]{margin-bottom:7px;margin-left:auto}.agent-copy[data-v-aabe911d]{margin-bottom:7px;margin-left:2px}.agent-tabs[data-v-aabe911d]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:4px;padding:8px 12px 0;display:flex}.agent-tab[data-v-aabe911d]{color:var(--text-meta);font-size:var(--font-size-mid);cursor:pointer;transition:color var(--transition-fast) ease, border-color var(--transition-fast) ease, background var(--transition-fast) ease;border-radius:var(--radius-base) var(--radius-base) 0 0;background:0 0;border:none;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:7px 14px 9px;font-family:inherit;display:inline-flex}.agent-tab[data-v-aabe911d]:hover{color:var(--text-secondary);background:var(--bg-hover)}.agent-tab.active[data-v-aabe911d]{color:var(--color-primary);border-bottom-color:var(--color-primary);font-weight:600}.agent-tab-body[data-v-aabe911d]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-pane[data-v-aabe911d]{flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.agent-tab-body[data-v-aabe911d]>.marketplace-panel{flex:1;min-height:0}.chat-loading[data-v-aabe911d]{color:var(--text-meta);font-size:var(--font-size-base);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}.agent-list-page[data-v-aabe911d]{background:var(--bg-panel);flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-list-page .agent-conversations[data-v-aabe911d]{padding:12px 12px 10px 14px}.agent-page-bar[data-v-aabe911d]{border-bottom:1px solid var(--border-color);background:var(--bg-panel);flex-shrink:0;align-items:center;gap:6px;height:34px;padding:0 12px 0 6px;display:flex}.agent-page-back[data-v-aabe911d]{border-radius:var(--radius-xs);width:24px;height:24px;color:var(--text-meta);cursor:pointer;transition:var(--transition-ui-fast);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.agent-page-back[data-v-aabe911d]:hover{background:var(--bg-hover);color:var(--text-secondary)}.agent-page-title[data-v-aabe911d]{min-width:0;font-size:var(--font-size-mid);color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.agent-chat-host[data-v-aabe911d]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.agent-chat-host[data-v-aabe911d] .acu-avatar--left{background:0 0}.agent-chat-host[data-v-aabe911d] .acu-bubble-row.is-assistant .acu-bubble-main{width:var(--acu-bubble-max-width);max-width:var(--acu-bubble-max-width);position:relative}.agent-chat-host[data-v-aabe911d] .acu-bubble-row.is-assistant .acu-bubble{align-self:flex-start}.agent-chat-host[data-v-aabe911d] .acu-message-meta{margin:0;position:absolute;top:0;right:0}.agent-chat-host[data-v-aabe911d] .acu-input-queue{--acu-queue-edge:var(--role-pending-edge);--acu-queue-surface:var(--role-pending-surface);--acu-queue-ink:var(--role-pending-ink);--acu-queue-wash:var(--role-pending-wash)}.agent-chat-host[data-v-aabe911d] .acu-welcome-logo{background:var(--welcome-avatar) center/46px 46px no-repeat;width:56px;height:56px;box-shadow:none}.agent-chat-host[data-v-aabe911d] .acu-welcome-logo>svg{display:none}.agent-chat-host[data-v-aabe911d] .acu-welcome-grid{flex-wrap:wrap;display:flex}.agent-chat-host[data-v-aabe911d] .acu-welcome-grid>.acu-preset-q{flex:260px;min-width:0}[data-theme=dark]{background:var(--bg-panel)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,$t as t,An as n,At as r,Ct as i,Dn as a,Dr as o,En as s,Fn as c,Fr as l,Gn as u,Gt as d,Ht as f,J as p,Jn as m,Jr as h,Jt as g,Ln as _,M as v,On as y,Pn as b,Qn as x,Sn as S,Tt as C,Vn as w,W as T,Xn as E,Xr as D,Yt as O,_n as k,a as ee,an as te,dn as A,er as j,et as M,gn as N,i as P,j as ne,kn as F,kt as I,lr as L,lt as re,mn as R,mr as z,mt as ie,r as B,rr as V,sr as H,st as U,tt as W,ur as G,vn as K,xr as q,yr as ae}from"./element-plus-J45pKUrE.js";import{a as oe,r as se}from"./vendor-B3NyhlYR.js";import{n as J,t as Y}from"./_plugin-vue_export-helper-Csn085FF.js";import{t as ce}from"./configStore-DOaPZ6Mq.js";import{t as le}from"./CommonDialog-j_53ORvj.js";import{G as X,K as ue,y as de}from"./index-DQ82h1aq.js";import{a as fe,c as pe,i as me,l as he,m as ge,n as _e,o as ve,r as ye,s as be,t as xe,u as Se}from"./agentConversations-De3wKTsN.js";import{c as Ce,s as we,t as Te}from"./CopySessionButton-Dy5t8Mjy.js";import{t as Ee}from"./useOrchestrator-BjC7oHpt.js";async function Z(e,t){let n=await fetch(e,{headers:{"Content-Type":`application/json`},...t}),r={};try{r=await n.json()}catch{}if(!n.ok||r.success===!1)throw Error(r.error||`请求失败 (${n.status})`);return r}async function De(){let e=await Z(`/api/schedules`);return Array.isArray(e.tasks)?e.tasks:[]}async function Oe(e){return(await Z(`/api/schedules`,{method:`POST`,body:JSON.stringify(e)})).task}async function ke(e,t){return(await Z(`/api/schedules/${encodeURIComponent(e)}`,{method:`PUT`,body:JSON.stringify(t)})).task}async function Ae(e){await Z(`/api/schedules/${encodeURIComponent(e)}`,{method:`DELETE`})}async function je(e){await Z(`/api/schedules/${encodeURIComponent(e)}/run`,{method:`POST`})}async function Me(e){await Z(`/api/schedules/${encodeURIComponent(e)}/stop`,{method:`POST`})}function Ne(e){if(typeof EventSource>`u`)return()=>{};let t=new EventSource(`/api/schedules/events`);return t.onmessage=t=>{try{e(JSON.parse(t.data))}catch{}},()=>t.close()}var Q=e=>/^\d+$/.test(e)?Number(e):null;function Pe(e){let t=String(e||``).trim(),n=t.split(/\s+/);if(n.length!==5)return{kind:`custom`,raw:t};let[r,i,a,o,s]=n,c=Q(r),l=Q(i);if(t===`* * * * *`)return{kind:`every-minute`,raw:t};let u=r.match(/^\*\/(\d+)$/);if(u&&i===`*`&&a===`*`&&o===`*`&&s===`*`)return{kind:`every-n-minutes`,n:Number(u[1]),raw:t};if(c!==null&&i===`*`&&a===`*`&&o===`*`&&s===`*`)return{kind:`hourly`,minute:c,raw:t};if(c!==null&&l!==null&&a===`*`&&o===`*`&&s===`*`)return{kind:`daily`,hour:l,minute:c,raw:t};let d=Q(s);if(c!==null&&l!==null&&a===`*`&&o===`*`&&d!==null)return{kind:`weekly`,weekday:d%7,hour:l,minute:c,raw:t};let f=Q(a);return c!==null&&l!==null&&f!==null&&o===`*`&&s===`*`?{kind:`monthly`,day:f,hour:l,minute:c,raw:t}:{kind:`custom`,raw:t}}var $=e=>String(e).padStart(2,`0`),Fe=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime();function Ie(e,t=new Date){if(!e)return{kind:`none`};let n=new Date(e);if(Number.isNaN(n.getTime()))return{kind:`none`};let r=`${$(n.getHours())}:${$(n.getMinutes())}`,i=Math.round((Fe(n)-Fe(t))/864e5);return i<0?{kind:`date`,date:`${n.getMonth()+1}-${$(n.getDate())}`,time:r}:i===0?{kind:`today`,time:r}:i===1?{kind:`tomorrow`,time:r}:i<7?{kind:`weekday`,weekday:n.getDay(),time:r}:{kind:`date`,date:`${n.getMonth()+1}-${$(n.getDate())}`,time:r}}function Le(e){switch(e){case`ok`:return`ok`;case`error`:case`timed-out`:return`error`;case`skipped-busy`:case`missed`:case`cancelled`:return`skipped`;default:return`pending`}}function Re(e){let t=Number(e);if(!Number.isFinite(t)||t<0)return``;if(t<1e3)return`<1s`;let n=Math.round(t/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60);return r<60?`${r}m${$(n%60)}s`:`${Math.floor(r/60)}h${$(r%60)}m`}function ze(e){let t=Math.min(59,Math.max(0,Math.floor(e.minute))),n=Math.min(23,Math.max(0,Math.floor(e.hour))),r=(Math.floor(e.weekday)%7+7)%7;switch(e.freq){case`minutes`:return`*/${Math.min(59,Math.max(1,Math.floor(e.everyMinutes??30)))} * * * *`;case`hourly`:return`${t} * * * *`;case`daily`:return`${t} ${n} * * *`;case`weekly`:return`${t} ${n} * * ${r}`;case`custom`:return String(e.custom||``).trim()}}w(),z(),A(),l();var Be={class:`marketplace-panel`},Ve={class:`mp-toolbar`},He={class:`mp-search`},Ue=[`placeholder`],We={class:`mp-toolbar-sub`},Ge={class:`mp-target-hint`},Ke={class:`mp-source-filter`},qe=[`onClick`],Je={class:`mp-body`},Ye={class:`mp-group-header`},Xe={class:`mp-group-title`},Ze={key:0,class:`mp-group-count`},Qe={key:1,class:`mp-group-error`},$e=[`href`,`title`],et={key:0,class:`mp-grid`},tt={class:`mp-card-head`},nt=[`title`],rt={key:0,class:`mp-card-metric`},it=[`title`],at={class:`mp-card-meta`},ot=[`title`],st=[`title`],ct={key:2,class:`mp-tag remote`},lt={class:`mp-card-foot`},ut=[`href`],dt={key:1,class:`mp-installed-chip`},ft=[`disabled`,`onClick`],pt={key:3,class:`mp-not-installable`},mt={key:1,class:`mp-empty`},ht={key:0,class:`mp-group installed`},gt={class:`mp-group-header`},_t={class:`mp-group-title`},vt={class:`mp-group-count`},yt={key:0,class:`mp-installed-block`},bt={class:`mp-installed-target`},xt={class:`mp-installed-list`},St=[`title`],Ct=[`title`],wt={key:1,class:`mp-meta-pkg`},Tt={key:2,class:`mp-tag warn`},Et=[`disabled`,`title`,`onClick`],Dt=[`disabled`,`onClick`],Ot={key:1,class:`mp-empty all`},kt={key:0,class:`mkt-form`},At={class:`mkt-form-name`},jt=[`onUpdate:modelValue`,`placeholder`],Mt={key:0,class:`mkt-field`},Nt={class:`mkt-hint`},Pt=Y(_({__name:`MarketplacePanel`,props:{type:{}},setup(t){let r=t,l=ce(),u=q([]),m=q([]),g=q(!1),_=q(``),C=q(``),w=q([]),E=q(`project`),D=q(new Set),k=q(new Set),A=q(new Set),M=s(()=>l.currentDirectory||``),N=null;async function R(){if(!g.value){g.value=!0;try{let e=new URLSearchParams({type:r.type,cwd:M.value});C.value&&e.set(`q`,C.value),w.value.length&&e.set(`sources`,w.value.join(`,`));let t=await(await fetch(`/api/agent/marketplace/catalog?${e}`)).json();t?.success?(u.value=t.groups||[],m.value=t.installed||[]):P.error(t?.error||J(`@MKT:加载失败`))}catch{P.error(J(`@MKT:加载失败`))}finally{g.value=!1}}}H(_,e=>{N&&clearTimeout(N),N=setTimeout(()=>{C.value=e.trim(),R()},400)}),H(w,()=>R()),H(()=>r.type,()=>{w.value=[],C.value=``,_.value=``,R()}),H(M,()=>R()),R();let z=s(()=>{let e=M.value?M.value.split(/[\\/]/).filter(Boolean).pop():``;return E.value===`project`?e||J(`@MKT:当前项目`):J(`@MKT:g ai 智能体`)});function V(e){return e.stars?`${U(e.stars)} ★`:e.downloads?`${U(e.downloads)} ${J(`@MKT:周下载`)}`:e.uses?`${U(e.uses)} ${J(`@MKT:次使用`)}`:``}function U(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function oe(e){return`${e.id}`}function se(e){return D.value.has(oe(e))}let Y=s(()=>{let e={project:[],global:[]};for(let t of m.value)(e[t.target]||=[]).push(t);return e}),X=ae({visible:!1,item:null,env:{},args:``});function ue(e){return r.type===`mcp`&&(!!e.envKeys?.length||!!e.args?.length)}function de(e){X.item=e,X.env=Object.fromEntries((e.envKeys||[]).map(e=>[e,``])),X.args=(e.args||[]).join(` `),X.visible=!0}function fe(){let e=X.item;if(X.visible=!1,!e)return;let t=Object.fromEntries(Object.entries(X.env).filter(([,e])=>e.trim()!==``)),n=X.args.trim()?X.args.trim().match(/(?:[^\s"]+|"[^"]*")+/g)?.map(e=>e.replace(/^"|"$/g,``))??void 0:void 0;me(e,{env:t,...n?{args:n}:{}})}async function pe(e){if(!e.installed||await he(e)){if(ue(e)){de(e);return}await me(e,{})}}async function me(e,t){let n=oe(e);D.value.add(n);try{let n=await fetch(`/api/agent/marketplace/install`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:r.type,target:E.value,cwd:M.value,item:{...e,...t}})}),i=await n.json().catch(()=>null);if(!n.ok||!i?.success){P.error(i?.error||J(`@MKT:安装失败`));return}i.item?.warning&&P.warning(i.item.warning),i.item?.envKeys?.length?P.warning(`${J(`@MKT:还缺环境变量`)}: ${i.item.envKeys.join(`, `)}`):P.success(J(`@MKT:安装成功`)),await R()}catch{P.error(J(`@MKT:安装失败`))}finally{D.value.delete(n)}}async function he(e){try{return await B.confirm(`${e.name} ${J(`@MKT:已安装,要重新安装吗?`)}`,J(`@MKT:重新安装`),{confirmButtonText:J(`@MKT:重装`),cancelButtonText:J(`@MKT:取消`),type:`warning`}),!0}catch{return!1}}async function ge(e){let t=`${e.target}:${e.id}`;A.value.add(t);try{let t=await fetch(`/api/agent/marketplace/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({type:r.type,target:e.target,cwd:M.value,id:e.id})}),n=await t.json().catch(()=>null);(!t.ok||!n?.success)&&P.error(n?.error||J(`@MKT:打开失败`))}catch{P.error(J(`@MKT:打开失败`))}finally{A.value.delete(t)}}async function _e(e){try{await B.confirm(`${J(`@MKT:确定卸载`)} ${e.name}?`,J(`@MKT:卸载`),{confirmButtonText:J(`@MKT:卸载`),cancelButtonText:J(`@MKT:取消`),type:`warning`})}catch{return}let t=`${e.target}:${e.id}`;k.value.add(t);try{let t=new URLSearchParams({target:e.target,cwd:M.value}),n=await fetch(`/api/agent/marketplace/item/${r.type}/${encodeURIComponent(e.id)}?${t}`,{method:`DELETE`}),i=await n.json().catch(()=>null);if(!n.ok||!i?.success){P.error(i?.error||J(`@MKT:卸载失败`));return}P.success(J(`@MKT:已卸载`)),await R()}catch{P.error(J(`@MKT:卸载失败`))}finally{k.value.delete(t)}}return(r,s)=>{let l=p,C=ne,D=v,M=T,N=ee;return x(),n(`div`,Be,[a(`div`,Ve,[a(`div`,He,[c(l,{class:`mp-search-icon`},{default:L(()=>[c(o(d))]),_:1}),G(a(`input`,{"onUpdate:modelValue":s[0]||=e=>_.value=e,class:`mp-search-input`,type:`text`,placeholder:t.type===`skill`?o(J)(`@MKT:搜索 Skill...`):o(J)(`@MKT:搜索 MCP 服务...`)},null,8,Ue),[[K,_.value]])]),c(D,{modelValue:E.value,"onUpdate:modelValue":s[1]||=e=>E.value=e,size:`small`,class:`mp-target`},{default:L(()=>[c(C,{value:`project`},{default:L(()=>[b(e(o(J)(`@MKT:当前项目`)),1)]),_:1}),c(C,{value:`global`},{default:L(()=>[b(e(o(J)(`@MKT:g ai 智能体`)),1)]),_:1})]),_:1},8,[`modelValue`]),c(M,{content:o(J)(`@MKT:刷新`),placement:`top`,"show-after":300},{default:L(()=>[a(`button`,{class:h([`mp-refresh`,{spinning:g.value}]),onClick:R},[c(l,null,{default:L(()=>[c(o(f))]),_:1})],2)]),_:1},8,[`content`])]),a(`div`,We,[a(`span`,Ge,[b(e(o(J)(`@MKT:安装到`))+` `,1),a(`b`,null,e(z.value),1)]),a(`div`,Ke,[(x(!0),n(S,null,j(u.value,t=>(x(),n(`button`,{key:t.id,class:h([`mp-chip`,{active:w.value.includes(t.id)}]),onClick:()=>{let e=w.value.indexOf(t.id);e>=0?w.value.splice(e,1):w.value.push(t.id)}},e(t.label),11,qe))),128)),w.value.length?(x(),n(`button`,{key:0,class:`mp-chip clear`,onClick:s[2]||=e=>w.value=[]},e(o(J)(`@MKT:全部来源`)),1)):F(``,!0)])]),G((x(),n(`div`,Je,[(x(!0),n(S,null,j(u.value,t=>(x(),n(`section`,{key:t.id,class:`mp-group`},[a(`header`,Ye,[a(`h3`,Xe,e(t.label),1),t.status===`ok`?(x(),n(`span`,Ze,e(t.items.length),1)):(x(),n(`span`,Qe,[c(l,null,{default:L(()=>[c(o(te))]),_:1}),b(` `+e(t.error||o(J)(`@MKT:来源不可用`)),1)])),t.homepage?(x(),n(`a`,{key:2,class:`mp-group-link`,href:t.homepage,target:`_blank`,rel:`noopener noreferrer`,title:t.homepage},[c(l,null,{default:L(()=>[c(o(I))]),_:1})],8,$e)):F(``,!0)]),t.status===`ok`&&t.items.length?(x(),n(`div`,et,[(x(!0),n(S,null,j(t.items,t=>(x(),n(`article`,{key:oe(t),class:`mp-card`},[a(`div`,tt,[a(`span`,{class:`mp-card-name`,title:t.name},e(t.name),9,nt),V(t)?(x(),n(`span`,rt,[c(l,null,{default:L(()=>[t.stars?(x(),y(o(O),{key:0})):(x(),y(o(ie),{key:1}))]),_:2},1024),b(` `+e(V(t)),1)])):F(``,!0)]),a(`p`,{class:`mp-card-desc`,title:t.description},e(t.description||o(J)(`@MKT:暂无描述`)),9,it),a(`div`,at,[t.package?(x(),n(`code`,{key:0,class:`mp-meta-pkg`,title:t.package},e(t.package),9,ot)):t.repository?(x(),n(`span`,{key:1,class:`mp-meta-repo`,title:t.repository+(t.subpath?` · `+t.subpath:``)},[b(e(t.repository),1),t.subpath?(x(),n(S,{key:0},[b(` · `+e(t.subpath),1)],64)):F(``,!0)],8,st)):F(``,!0),t.transport===`remote`?(x(),n(`span`,ct,e(o(J)(`@MKT:远程服务`)),1)):F(``,!0),(x(!0),n(S,null,j((t.tags||[]).slice(0,2),t=>(x(),n(`span`,{key:t,class:`mp-tag`},e(t),1))),128))]),a(`div`,lt,[t.upstream?(x(),n(`a`,{key:0,class:`mp-card-link`,href:t.upstream,target:`_blank`,rel:`noopener noreferrer`},e(o(J)(`@MKT:查看来源`)),9,ut)):F(``,!0),s[6]||=a(`span`,{class:`mp-foot-spacer`},null,-1),t.installed?(x(),n(`span`,dt,[c(l,null,{default:L(()=>[c(o(W))]),_:1}),b(e(o(J)(`@MKT:已安装`)),1)])):t.installable===!1?(x(),n(`span`,pt,e(o(J)(`@MKT:暂不支持一键安装`)),1)):(x(),n(`button`,{key:2,class:`mp-install-btn`,disabled:se(t),onClick:e=>pe(t)},e(se(t)?o(J)(`@MKT:安装中...`):o(J)(`@MKT:安装`)),9,ft))])]))),128))])):t.status===`ok`?(x(),n(`div`,mt,e(o(J)(`@MKT:该来源暂无结果`)),1)):F(``,!0)]))),128)),m.value.length?(x(),n(`section`,ht,[a(`header`,gt,[a(`h3`,_t,e(o(J)(`@MKT:已安装`)),1),a(`span`,vt,e(m.value.length),1)]),(x(),n(S,null,j([`project`,`global`],t=>a(`div`,{key:t},[Y.value[t]?.length?(x(),n(`div`,yt,[a(`div`,bt,e(t===`project`?o(J)(`@MKT:当前项目`):o(J)(`@MKT:g ai 智能体`)),1),a(`div`,xt,[(x(!0),n(S,null,j(Y.value[t],r=>(x(),n(`div`,{key:t+r.id,class:`mp-installed-row`},[a(`span`,{class:`mp-installed-name`,title:r.name},e(r.name),9,St),r.id&&r.id!==r.name?(x(),n(`code`,{key:0,class:`mp-installed-id`,title:r.dir||r.file||r.id},e(r.id),9,Ct)):F(``,!0),r.package?(x(),n(`code`,wt,e(r.package),1)):F(``,!0),r.requiredEnv?.length?(x(),n(`span`,Tt,e(o(J)(`@MKT:待配置`))+`: `+e(r.requiredEnv.join(`, `)),1)):F(``,!0),s[7]||=a(`span`,{class:`mp-foot-spacer`},null,-1),a(`button`,{class:`mp-reveal-btn`,disabled:A.value.has(t+r.id),title:r.dir||r.file||``,onClick:e=>ge(r)},[c(l,null,{default:L(()=>[c(o(i))]),_:1}),b(` `+e(o(J)(`@MKT:打开文件夹`)),1)],8,Et),a(`button`,{class:`mp-remove-btn`,disabled:k.value.has(t+r.id),onClick:e=>_e(r)},[c(l,null,{default:L(()=>[c(o(re))]),_:1}),b(` `+e(k.value.has(t+r.id)?o(J)(`@MKT:卸载中...`):o(J)(`@MKT:卸载`)),1)],8,Dt)]))),128))])])):F(``,!0)])),64))])):F(``,!0),!g.value&&!u.value.length?(x(),n(`div`,Ot,e(o(J)(`@MKT:加载失败`)),1)):F(``,!0)])),[[N,g.value]]),c(le,{modelValue:X.visible,"onUpdate:modelValue":s[5]||=e=>X.visible=e,title:o(J)(`@MKT:配置 MCP`),width:`460px`,type:`flex`,"close-on-click-modal":!1,"append-to-body":``},{footer:L(()=>[a(`button`,{class:`mkt-cancel`,onClick:s[4]||=e=>X.visible=!1},e(o(J)(`@MKT:取消`)),1),a(`button`,{class:`mkt-confirm`,onClick:fe},e(o(J)(`@MKT:安装`)),1)]),default:L(()=>[X.item?(x(),n(`div`,kt,[a(`p`,At,e(X.item.name),1),(x(!0),n(S,null,j(Object.keys(X.env),t=>(x(),n(`div`,{key:t,class:`mkt-field`},[a(`label`,null,e(t),1),G(a(`input`,{"onUpdate:modelValue":e=>X.env[t]=e,type:`text`,autocomplete:`off`,placeholder:o(J)(`@MKT:环境变量值`),spellcheck:`false`},null,8,jt),[[K,X.env[t]]])]))),128)),X.item.args?.length?(x(),n(`div`,Mt,[a(`label`,null,e(o(J)(`@MKT:启动参数`)),1),G(a(`input`,{"onUpdate:modelValue":s[3]||=e=>X.args=e,type:`text`,autocomplete:`off`,spellcheck:`false`},null,512),[[K,X.args]]),a(`p`,Nt,e(o(J)(`@MKT:参数提示`)),1)])):F(``,!0)])):F(``,!0)]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-536d7952`]]);w(),l(),z(),A();var Ft={class:`schedule-panel`},It={class:`schedule-toolbar`},Lt={class:`schedule-summary`},Rt={key:0,class:`schedule-error`},zt={key:1,class:`schedule-loading`},Bt={key:2,class:`schedule-empty`},Vt={class:`schedule-empty-title`},Ht={class:`schedule-empty-desc`},Ut={key:3,class:`schedule-list`},Wt={class:`schedule-card-body`},Gt={class:`schedule-card-head`},Kt={class:`schedule-name`},qt={key:0,class:`schedule-running`},Jt=[`aria-checked`,`aria-label`,`onClick`],Yt={class:`schedule-card-sub`},Xt={class:`schedule-desc`},Zt=[`onClick`],Qt={class:`schedule-card-side`},$t={class:`schedule-actions`},en=[`disabled`,`onClick`],tn=[`disabled`,`onClick`],nn=[`onClick`],rn=[`onClick`],an={class:`sch-form`},on={class:`sch-field`},sn={class:`sch-field-label`},cn=[`placeholder`],ln={class:`sch-field`},un={class:`sch-field-label`},dn={class:`sch-freq-row`},fn=[`value`],pn={class:`sch-inline-label`},mn=[`value`],hn={class:`sch-inline-label`},gn=[`value`],_n=[`value`],vn=[`value`],yn={class:`sch-inline-label`},bn=[`value`],xn={class:`sch-inline-label`},Sn=[`placeholder`],Cn={class:`sch-hint`},wn={class:`sch-field`},Tn={class:`sch-field-label`},En=[`placeholder`],Dn={class:`sch-field`},On={class:`sch-field-label`},kn=[`placeholder`],An={class:`sch-field`},jn={class:`sch-field-label`},Mn={class:`sch-radio-row`},Nn={class:`sch-radio`},Pn={class:`sch-radio`},Fn={class:`sch-radio`},In={key:0,class:`sch-form-error`},Ln={class:`sch-form-footer`},Rn=[`disabled`],zn={class:`sch-confirm-text`},Bn={class:`sch-form-footer`},Vn=Y(_({__name:`SchedulePanel`,emits:[`open-session`],setup(t,{emit:r}){let i=r,l=ce(),u=q([]),d=q(!0),f=q(``),p=q({}),g=null,_=null;async function v(){try{u.value=await De(),f.value=``}catch(e){f.value=e?.message||String(e)}finally{d.value=!1}}function y(){_===null&&(_=window.setTimeout(()=>{_=null,v()},150))}E(async()=>{await v(),g=Ne(e=>{[`tasks_changed`,`task_started`,`task_finished`,`hello`].includes(e.type)&&y()})}),m(()=>{g?.(),_!==null&&window.clearTimeout(_)});let b=s(()=>{let e=u.value.filter(e=>e.enabled).length,t=u.value.length-e;return u.value.length?J(`@SCHED:{on} 个启用 · {off} 个停用`,{on:e,off:t}):``}),C=[`@SCHED:周日`,`@SCHED:周一`,`@SCHED:周二`,`@SCHED:周三`,`@SCHED:周四`,`@SCHED:周五`,`@SCHED:周六`];function w(e){let t=Pe(e.schedule);switch(t.kind){case`every-minute`:return J(`@SCHED:每分钟`);case`every-n-minutes`:return J(`@SCHED:每 {n} 分钟`,{n:t.n});case`hourly`:return J(`@SCHED:每小时第 {minute} 分钟`,{minute:t.minute});case`daily`:return J(`@SCHED:每天 {time}`,{time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});case`weekly`:return J(`@SCHED:每周 {weekday} {time}`,{weekday:J(C[t.weekday]),time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});case`monthly`:return J(`@SCHED:每月 {day} 日 {time}`,{day:t.day,time:`${String(t.hour).padStart(2,`0`)}:${String(t.minute).padStart(2,`0`)}`});default:return t.raw}}function T(e){if(!e.enabled)return J(`@SCHED:已停用`);if(e.running)return J(`@SCHED:运行中...`);let t=Ie(e.nextRunAt);switch(t.kind){case`none`:return``;case`today`:return J(`@SCHED:下次 今天 {time}`,{time:t.time});case`tomorrow`:return J(`@SCHED:下次 明天 {time}`,{time:t.time});case`weekday`:return J(`@SCHED:下次 {weekday} {time}`,{weekday:J(C[t.weekday]),time:t.time});case`date`:return J(`@SCHED:下次 {date} {time}`,{date:t.date,time:t.time})}}function D(e){let t=e.lastRun;if(!t)return J(`@SCHED:还没执行过`);switch(t.status){case`ok`:return J(`@SCHED:成功`);case`error`:return J(`@SCHED:失败`);case`timed-out`:return J(`@SCHED:超时中止`);case`skipped-busy`:return J(`@SCHED:已跳过(会话忙)`);case`missed`:return J(`@SCHED:已错过(未运行)`);case`cancelled`:return J(`@SCHED:已停止`);default:return t.status}}function O(e){let t=e.lastRun;if(!t)return J(`@SCHED:还没执行过`);let n=Re(t.durationMs),r=J(`@SCHED:上次 {status}`,{status:D(e)});return n?`${r} · ${n}`:r}function ee(e){return e.lastRun?`is-${Le(e.lastRun.status)}`:`is-muted`}async function te(e,t){if(!p.value[e.id]){p.value={...p.value,[e.id]:!0};try{await t(),await v()}catch(e){P.error(e?.message||String(e))}finally{let t={...p.value};delete t[e.id],p.value=t}}}function A(e){return te(e,()=>ke(e.id,{enabled:!e.enabled}))}function M(e){return te(e,()=>je(e.id))}function ne(e){return te(e,()=>Me(e.id))}let I=q(!1),re=q(null);function z(e){re.value=e,I.value=!0}async function ie(){let e=re.value;if(e)try{await Ae(e.id),I.value=!1,await v()}catch(e){P.error(e?.message||String(e))}}let B=q(!1),V=q(``),H=q(``),U=q(!1),W=q({name:``,freq:`daily`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:``,cwd:``,prompt:``,onMissed:`run`,enabled:!0}),ae=s(()=>[{value:`minutes`,label:J(`@SCHED:每 N 分钟`)},{value:`hourly`,label:J(`@SCHED:每小时`)},{value:`daily`,label:J(`@SCHED:每天`)},{value:`weekly`,label:J(`@SCHED:每周`)},{value:`custom`,label:J(`@SCHED:自定义 cron`)}]),oe=s(()=>ze({freq:W.value.freq,everyMinutes:W.value.everyMinutes,minute:W.value.minute,hour:W.value.hour,weekday:W.value.weekday,custom:W.value.custom}));function se(){W.value={name:``,freq:`daily`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:``,cwd:l.currentDirectory||``,prompt:``,onMissed:`run`,enabled:!0},H.value=``}function Y(){V.value=``,se(),B.value=!0}function X(e){V.value=e.id;let t=Pe(e.schedule),n={name:e.name,freq:`custom`,everyMinutes:30,minute:0,hour:9,weekday:1,custom:e.schedule,cwd:e.cwd,prompt:e.prompt,onMissed:e.onMissed===`skip`?`skip`:`run`,enabled:e.enabled};switch(t.kind){case`every-n-minutes`:n.freq=`minutes`,n.everyMinutes=t.n;break;case`hourly`:n.freq=`hourly`,n.minute=t.minute;break;case`daily`:n.freq=`daily`,n.minute=t.minute,n.hour=t.hour;break;case`weekly`:n.freq=`weekly`,n.minute=t.minute,n.hour=t.hour,n.weekday=t.weekday;break;default:n.freq=`custom`}W.value=n,H.value=``,B.value=!0}async function ue(){let e=W.value;if(!e.name.trim()){H.value=J(`@SCHED:任务名不能为空`);return}if(!e.prompt.trim()){H.value=J(`@SCHED:提示词不能为空`);return}let t=oe.value;if(!t){H.value=J(`@SCHED:cron 表达式不能为空`);return}let n={name:e.name.trim(),schedule:t,cwd:e.cwd.trim(),prompt:e.prompt.trim(),enabled:e.enabled,onMissed:e.onMissed};U.value=!0;try{V.value?await ke(V.value,n):await Oe(n),B.value=!1,await v()}catch(e){H.value=e?.message||String(e)}finally{U.value=!1}}return(t,r)=>(x(),n(`div`,Ft,[a(`div`,It,[a(`span`,Lt,e(b.value),1),a(`button`,{type:`button`,class:`sch-btn sch-btn-primary`,onClick:Y},e(o(J)(`@SCHED:新建任务`)),1)]),f.value?(x(),n(`div`,Rt,e(o(J)(`@SCHED:操作失败:{error}`,{error:f.value})),1)):F(``,!0),d.value?(x(),n(`div`,zt,e(o(J)(`@SCHED:加载中...`)),1)):u.value.length?(x(),n(`div`,Ut,[(x(!0),n(S,null,j(u.value,t=>(x(),n(`article`,{key:t.id,class:h([`schedule-card`,{"is-disabled":!t.enabled,"is-running":!!t.running}])},[a(`div`,Wt,[a(`div`,Gt,[a(`span`,Kt,e(t.name),1),t.running?(x(),n(`span`,qt,e(o(J)(`@SCHED:运行中`)),1)):F(``,!0),a(`button`,{type:`button`,class:h([`sch-switch`,{on:t.enabled}]),role:`switch`,"aria-checked":t.enabled,"aria-label":t.enabled?o(J)(`@SCHED:停用`):o(J)(`@SCHED:启用`),onClick:e=>A(t)},[...r[17]||=[a(`span`,{class:`sch-switch-knob`},null,-1)]],10,Jt)]),a(`div`,Yt,[a(`span`,Xt,e(w(t)),1),r[18]||=a(`span`,{class:`schedule-sep`},`·`,-1),a(`span`,{class:h([`schedule-last`,ee(t)])},e(O(t)),3),t.sessionId?(x(),n(`button`,{key:0,type:`button`,class:`sch-link`,onClick:e=>i(`open-session`,t.sessionId)},e(o(J)(`@SCHED:查看会话`)),9,Zt)):F(``,!0)])]),a(`div`,Qt,[a(`div`,{class:h([`schedule-next`,{"is-muted":!t.enabled}])},e(T(t)),3),a(`div`,$t,[t.running?(x(),n(`button`,{key:0,type:`button`,class:`sch-btn`,disabled:!!p.value[t.id],onClick:e=>ne(t)},e(o(J)(`@SCHED:停止`)),9,en)):(x(),n(`button`,{key:1,type:`button`,class:`sch-btn`,disabled:!!p.value[t.id],onClick:e=>M(t)},e(o(J)(`@SCHED:运行`)),9,tn)),a(`button`,{type:`button`,class:`sch-btn`,onClick:e=>X(t)},e(o(J)(`@SCHED:编辑`)),9,nn),a(`button`,{type:`button`,class:`sch-btn sch-btn-danger`,onClick:e=>z(t)},e(o(J)(`@SCHED:删除`)),9,rn)])])],2))),128))])):(x(),n(`div`,Bt,[a(`p`,Vt,e(o(J)(`@SCHED:还没有定时任务`)),1),a(`p`,Ht,e(o(J)(`@SCHED:让 g ai 在指定时间自动做事:定时拉代码、定时巡检、定时汇总。也可以在对话里直接说「每天 9 点帮我…」,让 g ai 来创建。`)),1)])),c(le,{modelValue:B.value,"onUpdate:modelValue":r[14]||=e=>B.value=e,title:V.value?o(J)(`@SCHED:编辑任务`):o(J)(`@SCHED:新建任务`),"close-on-click-modal":!1,"append-to-body":!0,size:`medium`,width:`560px`,"z-index":3e6,"custom-class":`schedule-dialog`},{default:L(()=>[a(`div`,an,[a(`label`,on,[a(`span`,sn,e(o(J)(`@SCHED:任务名`)),1),G(a(`input`,{"onUpdate:modelValue":r[0]||=e=>W.value.name=e,class:`sch-input`,type:`text`,placeholder:o(J)(`@SCHED:如:每日拉代码`)},null,8,cn),[[K,W.value.name]])]),a(`div`,ln,[a(`span`,un,e(o(J)(`@SCHED:执行计划`)),1),a(`div`,dn,[G(a(`select`,{"onUpdate:modelValue":r[1]||=e=>W.value.freq=e,class:`sch-input sch-select`},[(x(!0),n(S,null,j(ae.value,t=>(x(),n(`option`,{key:t.value,value:t.value},e(t.label),9,fn))),128))],512),[[k,W.value.freq]]),W.value.freq===`minutes`?(x(),n(S,{key:0},[a(`span`,pn,e(o(J)(`@SCHED:每`)),1),G(a(`select`,{"onUpdate:modelValue":r[2]||=e=>W.value.everyMinutes=e,class:`sch-input sch-select sch-select-sm`},[(x(),n(S,null,j([5,10,15,20,30,60],t=>a(`option`,{key:t,value:t},e(t),9,mn)),64))],512),[[k,W.value.everyMinutes,void 0,{number:!0}]]),a(`span`,hn,e(o(J)(`@SCHED:分钟`)),1)],64)):W.value.freq===`daily`||W.value.freq===`weekly`?(x(),n(S,{key:1},[W.value.freq===`weekly`?G((x(),n(`select`,{key:0,"onUpdate:modelValue":r[3]||=e=>W.value.weekday=e,class:`sch-input sch-select sch-select-sm`},[(x(),n(S,null,j(C,(t,n)=>a(`option`,{key:n,value:n},e(o(J)(t)),9,gn)),64))],512)),[[k,W.value.weekday,void 0,{number:!0}]]):F(``,!0),G(a(`select`,{"onUpdate:modelValue":r[4]||=e=>W.value.hour=e,class:`sch-input sch-select sch-select-sm`},[(x(),n(S,null,j(24,t=>a(`option`,{key:t-1,value:t-1},e(String(t-1).padStart(2,`0`)),9,_n)),64))],512),[[k,W.value.hour,void 0,{number:!0}]]),r[19]||=a(`span`,{class:`sch-inline-label`},`:`,-1),G(a(`select`,{"onUpdate:modelValue":r[5]||=e=>W.value.minute=e,class:`sch-input sch-select sch-select-sm`},[(x(),n(S,null,j(60,t=>a(`option`,{key:t-1,value:t-1},e(String(t-1).padStart(2,`0`)),9,vn)),64))],512),[[k,W.value.minute,void 0,{number:!0}]])],64)):W.value.freq===`hourly`?(x(),n(S,{key:2},[a(`span`,yn,e(o(J)(`@SCHED:第`)),1),G(a(`select`,{"onUpdate:modelValue":r[6]||=e=>W.value.minute=e,class:`sch-input sch-select sch-select-sm`},[(x(),n(S,null,j(60,t=>a(`option`,{key:t-1,value:t-1},e(String(t-1).padStart(2,`0`)),9,bn)),64))],512),[[k,W.value.minute,void 0,{number:!0}]]),a(`span`,xn,e(o(J)(`@SCHED:分钟`)),1)],64)):G((x(),n(`input`,{key:3,"onUpdate:modelValue":r[7]||=e=>W.value.custom=e,class:`sch-input sch-input-cron`,type:`text`,spellcheck:`false`,placeholder:o(J)(`@SCHED:如:0 9 * * 1-5`)},null,8,Sn)),[[K,W.value.custom]])]),a(`span`,Cn,e(o(J)(`@SCHED:cron:{cron}(分 时 日 月 周,本地时间)`,{cron:oe.value||`—`})),1)]),a(`label`,wn,[a(`span`,Tn,e(o(J)(`@SCHED:项目目录`)),1),G(a(`input`,{"onUpdate:modelValue":r[8]||=e=>W.value.cwd=e,class:`sch-input`,type:`text`,spellcheck:`false`,placeholder:o(J)(`@SCHED:任务在该目录下执行(默认当前项目)`)},null,8,En),[[K,W.value.cwd]])]),a(`label`,Dn,[a(`span`,On,e(o(J)(`@SCHED:提示词`)),1),G(a(`textarea`,{"onUpdate:modelValue":r[9]||=e=>W.value.prompt=e,class:`sch-input sch-textarea`,rows:`4`,placeholder:o(J)(`@SCHED:到点后发给 g ai 的完整指令,例如:检查所有仓库远端更新,有变更就 pull;写成一次自足的请求(未来那一轮没有现在的上下文)`)},null,8,kn),[[K,W.value.prompt]])]),a(`div`,An,[a(`span`,jn,e(o(J)(`@SCHED:错过补偿`)),1),a(`div`,Mn,[a(`label`,Nn,[G(a(`input`,{"onUpdate:modelValue":r[10]||=e=>W.value.onMissed=e,type:`radio`,value:`run`},null,512),[[N,W.value.onMissed]]),a(`span`,null,e(o(J)(`@SCHED:补跑一次(g ui 重新运行后)`)),1)]),a(`label`,Pn,[G(a(`input`,{"onUpdate:modelValue":r[11]||=e=>W.value.onMissed=e,type:`radio`,value:`skip`},null,512),[[N,W.value.onMissed]]),a(`span`,null,e(o(J)(`@SCHED:跳过`)),1)]),a(`label`,Fn,[G(a(`input`,{"onUpdate:modelValue":r[12]||=e=>W.value.enabled=e,type:`checkbox`},null,512),[[R,W.value.enabled]]),a(`span`,null,e(o(J)(`@SCHED:创建后启用`)),1)])])]),H.value?(x(),n(`p`,In,e(H.value),1)):F(``,!0)]),a(`div`,Ln,[a(`button`,{type:`button`,class:`sch-btn`,onClick:r[13]||=e=>B.value=!1},e(o(J)(`@SCHED:取消`)),1),a(`button`,{type:`button`,class:`sch-btn sch-btn-primary`,disabled:U.value,onClick:ue},e(U.value?o(J)(`@SCHED:保存中...`):o(J)(`@SCHED:保存`)),9,Rn)])]),_:1},8,[`modelValue`,`title`]),c(le,{modelValue:I.value,"onUpdate:modelValue":r[16]||=e=>I.value=e,title:o(J)(`@SCHED:删除任务`),"close-on-click-modal":!1,"append-to-body":!0,size:`small`,width:`400px`,"z-index":3e6,"custom-class":`schedule-dialog-confirm`},{default:L(()=>[a(`p`,zn,e(o(J)(`@SCHED:确定删除「{name}」吗?已产生的会话会保留,但任务不再执行。`,{name:re.value?.name||``})),1),a(`div`,Bn,[a(`button`,{type:`button`,class:`sch-btn`,onClick:r[15]||=e=>I.value=!1},e(o(J)(`@SCHED:取消`)),1),a(`button`,{type:`button`,class:`sch-btn sch-btn-danger`,onClick:ie},e(o(J)(`@SCHED:删除`)),1)])]),_:1},8,[`modelValue`,`title`])]))}}),[[`__scopeId`,`data-v-75be84e5`]]);w(),z(),l(),A();var Hn={class:`aps`},Un={class:`aps__scroll`},Wn={class:`aps__head`},Gn={class:`aps__title`},Kn={class:`aps__intro`},qn={class:`aps__card aps__card--gai`},Jn={class:`aps__card-head`},Yn={class:`aps__card-title`},Xn={class:`aps__count`},Zn={class:`aps__hint`},Qn=[`placeholder`],$n={class:`aps__foot`},er={key:0,class:`aps__saved`},tr=[`disabled`],nr={class:`aps__card aps__card--dispatch`},rr={class:`aps__card-head`},ir={class:`aps__card-title`},ar={class:`aps__hint`},or={class:`aps__field`},sr={class:`aps__card-head`},cr={class:`aps__label`,for:`aps-global`},lr={class:`aps__count`},ur=[`placeholder`],dr={class:`aps__field`},fr={class:`aps__card-head`},pr={class:`aps__label`,for:`aps-project`},mr={key:0,class:`aps__count`},hr=[`disabled`,`placeholder`],gr={class:`aps__hint`},_r={class:`aps__foot`},vr={key:0,class:`aps__saved`},yr={key:1,class:`aps__saved`},br=[`disabled`],xr=4e3,Sr=Y(_({__name:`AgentPromptSettings`,setup(t){let r=ce(),{defaultPrompt:i,projectPrompts:c,loadOrchestrator:l,saveDefaultPrompt:u,saveProjectPrompt:d}=Ee(),f=q(``),p=q(!1),m=q(!1),h=s(()=>r.agentDefaultPrompt||``),g=s(()=>f.value.trim()!==h.value.trim());async function _(){if(!p.value&&g.value){p.value=!0;try{await r.saveAiSettings({agentDefaultPrompt:f.value})&&(f.value=h.value,m.value=!0,P.success(J(`@AGENT:已保存 g ai 默认提示词`)))}finally{p.value=!1}}}let v=s(()=>r.currentDirectory||``),y=s(()=>ue(v.value)||v.value),b=s(()=>{let e=X(v.value);return e&&c.value?.[e]?.prompt||``}),S=q(``),C=q(``),w=q(!1),T=q(!1),D=q(!1),O=s(()=>S.value.trim()!==(i.value||``).trim()||!!v.value&&C.value.trim()!==b.value.trim());function k(){S.value=i.value||``,C.value=b.value}E(async()=>{f.value=h.value,k();let e=await l(!0);D.value=!e,e&&k()});async function ee(){if(!w.value&&O.value){w.value=!0;try{let e=!0,t=S.value.trim();t!==(i.value||``).trim()&&(e=await u(t));let n=C.value.trim();e&&v.value&&n!==b.value.trim()&&(e=await d(v.value,n)),e&&(k(),T.value=!0)}finally{w.value=!1}}}return(t,r)=>(x(),n(`div`,Hn,[a(`div`,Un,[a(`header`,Wn,[a(`h3`,Gn,e(o(J)(`@AGENT:提示词设置`)),1),a(`p`,Kn,e(o(J)(`@AGENT:这里配的两块提示词,和 g ai 对话时每一轮都会自动带上。改完下一次发消息就生效,不用新开会话。`)),1)]),a(`section`,qn,[a(`div`,Jn,[a(`h4`,Yn,e(o(J)(`@AGENT:g ai 智能体的默认提示词`)),1),a(`span`,Xn,e(f.value.length)+` / `+e(xr),1)]),a(`p`,Zn,e(o(J)(`@AGENT:只作用于 g ai 自己:每次对话都会带上(定时任务也一样)。派发出去的任务读不到这一段。`)),1),G(a(`textarea`,{id:`aps-gai`,"onUpdate:modelValue":r[0]||=e=>f.value=e,class:`aps__area`,rows:`6`,maxlength:xr,placeholder:o(J)(`@AGENT:例如:回答用中文;改完代码先跑一遍验证再汇报;不要动 dist 目录`)},null,8,Qn),[[K,f.value]]),a(`div`,$n,[m.value&&!g.value?(x(),n(`span`,er,e(o(J)(`@AGENT:已保存`)),1)):F(``,!0),r[3]||=a(`span`,{class:`aps__spacer`},null,-1),a(`button`,{type:`button`,class:`aps__btn aps__btn--primary`,disabled:p.value||!g.value,onClick:_},e(p.value?o(J)(`@AGENT:保存中…`):o(J)(`@AGENT:保存`)),9,tr)])]),a(`section`,nr,[a(`div`,rr,[a(`h4`,ir,e(o(J)(`@AGENT:派发任务的提示词`)),1)]),a(`p`,ar,e(o(J)(`@AGENT:与工作台「预设提示词」是同一份设置,在哪边改都一样。派发任务时附加在指令之前,和 g ai 对话时也会带上。`)),1),a(`div`,or,[a(`div`,sr,[a(`label`,cr,e(o(J)(`@AGENT:全局提示词`)),1),a(`span`,lr,e(S.value.length)+` / `+e(xr),1)]),G(a(`textarea`,{id:`aps-global`,"onUpdate:modelValue":r[1]||=e=>S.value=e,class:`aps__area`,rows:`5`,maxlength:xr,placeholder:o(J)(`@AGENT:对所有项目生效。例如:回答用中文;改完代码必须跑一遍测试;不要动 dist 目录`)},null,8,ur),[[K,S.value]])]),a(`div`,dr,[a(`div`,fr,[a(`label`,pr,e(v.value?o(J)(`@AGENT:「{name}」的项目提示词`,{name:y.value}):o(J)(`@AGENT:项目提示词`)),1),v.value?(x(),n(`span`,mr,e(C.value.length)+` / `+e(xr),1)):F(``,!0)]),G(a(`textarea`,{id:`aps-project`,"onUpdate:modelValue":r[2]||=e=>C.value=e,class:`aps__area`,rows:`5`,maxlength:xr,disabled:!v.value,placeholder:v.value?o(J)(`@AGENT:只在这个项目派发/对话时附加。例如:包管理器用 pnpm;改动集中在 src/ui 下`):o(J)(`@AGENT:当前没有打开项目,项目级提示词暂时不能设置`)},null,8,hr),[[K,C.value]]),a(`p`,gr,e(v.value?o(J)(`@AGENT:项目提示词追加在全局提示词之后(不覆盖全局),在「{name}」里派发或对话时一起带上`,{name:y.value}):o(J)(`@AGENT:先在左上角切到一个项目,才能设置它的提示词`)),1)]),a(`div`,_r,[T.value&&!O.value?(x(),n(`span`,vr,e(o(J)(`@AGENT:已保存`)),1)):D.value?(x(),n(`span`,yr,e(o(J)(`@AGENT:读取设置失败,请稍后重试`)),1)):F(``,!0),r[4]||=a(`span`,{class:`aps__spacer`},null,-1),a(`button`,{type:`button`,class:`aps__btn aps__btn--primary`,disabled:w.value||!O.value,onClick:ee},e(w.value?o(J)(`@AGENT:保存中…`):o(J)(`@AGENT:保存`)),9,br)])])])]))}}),[[`__scopeId`,`data-v-ae77c09c`]]);w(),z(),l();var Cr={class:`agent-chat-area`},wr={class:`agent-tabs`,role:`tablist`},Tr=[`aria-selected`,`onClick`],Er={class:`agent-tab-body`},Dr={key:0,class:`agent-chat-pane`},Or={key:0,class:`agent-list-page`},kr={key:0,class:`agent-page-bar`},Ar=[`title`,`aria-label`],jr={class:`agent-page-title`},Mr={key:0,class:`chat-loading`},Nr=Y(_({__name:`AgentView`,setup(i){let l=ce(),d=q(null),{narrow:f}=Ce(d),_=q(`chat`),v=q(`chat`),b=s(()=>v.value===`mcp`?`mcp`:`skill`),w=s(()=>[{id:`chat`,label:J(`@AGENT:对话`),icon:M},{id:`schedule`,label:J(`@AGENT:定时任务`),icon:t},{id:`skill`,label:J(`@AGENT:Skill 广场`),icon:C},{id:`mcp`,label:J(`@AGENT:MCP 广场`),icon:U},{id:`settings`,label:J(`@AGENT:设置`),icon:g}]),{sessions:T,sessionsLoading:O,currentSessionId:k,messages:ee,displayMessages:te,isStreaming:A,sessionLoading:N,loadSessions:P,loadSession:ne,deleteSession:I,renameSession:re,newSession:R,sendMessage:z,retryTurn:ie,questionPanel:B,answeringQuestion:W,answerQuestion:G,isSessionGenerating:K,currentEngine:ae,pendingEngine:Y,isEngineLocked:le,pickEngine:X,stop:ue,inputContextUsage:Ee,queuedMessages:Z,queuePaused:De,removeQueuedMessage:Oe,flushQueued:ke}=Se(),Ae=s(()=>le.value?ae.value:Y.value);function je(e){le.value||X(e)}let Me=s(()=>{let e=l.theme;return e===`dark`||e===`auto`&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}),Q=s(()=>pe(T.value,K)),Pe=fe(),$=s(()=>Q.value.find(e=>e.id===k.value)?.title||J(`@AGENT:对话`)),Fe={"--welcome-avatar":`url("${xe}")`},Ie=s(()=>de(l.agentPresetPrompts));async function Le(e){await z(e.text,e.files),await u(),He()}async function Re(e){await z(e.prompt),await u(),He()}let ze=ve(),Be=q(null),Ve=be();function He(e=!0){Be.value?.scrollToBottom(e)}H(()=>ee.value.length,()=>{u(()=>He(!1))});function Ue(e){ne(e),_.value=`chat`}function We(e){e&&(v.value=`chat`,Ue(e))}function Ge(){R(),_.value=`chat`}let Ke=q(280),qe=q(!1);function Je(e){qe.value=!0;let t=e.clientX,n=Ke.value,r=e=>{let r=e.clientX-t,i=Math.max(200,Math.min(500,n+r));Ke.value=i},i=()=>{qe.value=!1,document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}H(f,e=>{e||(_.value=`chat`)}),H(()=>[l.currentDirectory,A.value],async([e,t],n)=>{let r=!n||e!==n[0],i=!!n&&n[1]===!0&&!t;(r||i)&&await P(),k.value&&!A.value&&!T.value.some(e=>e.sessionId===k.value)&&R()},{immediate:!0});let Ye=null;return E(()=>{Ye=Ne(e=>{e.type===`task_finished`&&P().catch(()=>{})})}),m(()=>{Ye?.(),Ye=null}),(t,i)=>(x(),n(`div`,{ref_key:`rootRef`,ref:d,class:`agent-view`},[v.value===`chat`&&!o(f)?(x(),n(S,{key:0},[a(`aside`,{class:`agent-sidebar`,style:D({width:Ke.value+`px`})},[c(o(se),{class:`agent-conversations`,items:Q.value,"active-id":o(k),loading:o(O),labels:o(Pe),onSelect:Ue,onNew:Ge,onRename:o(re),onDelete:o(I)},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])],4),a(`div`,{class:h([`sidebar-resizer`,{active:qe.value}]),onMousedown:Je},null,34)],64)):F(``,!0),a(`main`,Cr,[a(`nav`,wr,[(x(!0),n(S,null,j(w.value,t=>(x(),n(`button`,{key:t.id,type:`button`,class:h([`agent-tab`,{active:v.value===t.id}]),role:`tab`,"aria-selected":v.value===t.id,onClick:e=>v.value=t.id},[c(o(p),null,{default:L(()=>[(x(),y(V(t.icon)))]),_:2},1024),a(`span`,null,e(t.label),1)],10,Tr))),128)),v.value===`chat`?(x(),y(we,{key:0,class:`agent-engine`,engine:Ae.value,locked:o(le),onSelect:je},null,8,[`engine`,`locked`])):F(``,!0),v.value===`chat`?(x(),y(Te,{key:1,class:`agent-copy`,messages:o(ee),title:$.value,engine:o(ge)(Ae.value)},null,8,[`messages`,`title`,`engine`])):F(``,!0)]),a(`div`,Er,[v.value===`chat`?(x(),n(`div`,Dr,[o(f)&&_.value===`list`?(x(),n(`div`,Or,[c(o(se),{class:`agent-conversations`,items:Q.value,"active-id":o(k),loading:o(O),labels:o(Pe),onSelect:Ue,onNew:Ge,onRename:o(re),onDelete:o(I)},null,8,[`items`,`active-id`,`loading`,`labels`,`onRename`,`onDelete`])])):(x(),n(S,{key:1},[o(f)?(x(),n(`div`,kr,[a(`button`,{type:`button`,class:`agent-page-back`,title:o(J)(`@AGENT:返回会话列表`),"aria-label":o(J)(`@AGENT:返回会话列表`),onClick:i[0]||=e=>_.value=`list`},[...i[1]||=[a(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[a(`line`,{x1:`19`,y1:`12`,x2:`5`,y2:`12`}),a(`polyline`,{points:`12 19 5 12 12 5`})],-1)]],8,Ar),a(`span`,jr,e($.value),1)])):F(``,!0),a(`div`,{class:`agent-chat-host`,style:Fe},[o(N)?(x(),n(`div`,Mr,[c(o(p),{class:`is-loading`,size:32},{default:L(()=>[c(o(r))]),_:1}),a(`span`,null,e(o(J)(`@AGENT:加载会话中...`)),1)])):(x(),y(o(oe),{key:1,ref_key:`chatContainerRef`,ref:Be,messages:o(te),"preset-questions":Ie.value,"welcome-title":o(J)(`@AGENT:智能体助手`),"welcome-description":o(J)(`@AGENT:我可以帮你阅读代码、执行命令、修改文件。选择下方话题或直接输入你的问题。`),"assistant-name":o(_e),"assistant-avatar":o(xe),theme:Me.value,generating:o(A),"allow-queue":!0,queued:o(Z),"queue-paused":o(De),"queue-labels":o(Ve),"upload-config":{accept:o(he)},"context-usage":o(Ee),placeholder:o(A)?o(J)(`@AGENT:生成中,发送后会排队,等本轮跑完自动接上…`):o(J)(`@AGENT:输入消息,Enter 发送`),question:o(B),"question-submitting":o(W),"question-labels":o(ze),"plan-config":{labels:{title:o(J)(`@AGENT:计划`),raw:o(J)(`@AGENT:原始参数`)}},"message-rail-config":o(me),"message-meta-config":o(ye),onSend:Le,onSelect:Re,onStop:o(ue),onUnqueue:o(Oe),onFlushQueued:o(ke),onAnswer:o(G),onRetry:o(ie)},null,8,[`messages`,`preset-questions`,`welcome-title`,`welcome-description`,`assistant-name`,`assistant-avatar`,`theme`,`generating`,`queued`,`queue-paused`,`queue-labels`,`upload-config`,`context-usage`,`placeholder`,`question`,`question-submitting`,`question-labels`,`plan-config`,`message-rail-config`,`message-meta-config`,`onStop`,`onUnqueue`,`onFlushQueued`,`onAnswer`,`onRetry`]))])],64))])):v.value===`schedule`?(x(),y(Vn,{key:1,onOpenSession:We})):v.value===`skill`||v.value===`mcp`?(x(),y(Pt,{key:2,type:b.value},null,8,[`type`])):(x(),y(Sr,{key:3}))])])],512))}}),[[`__scopeId`,`data-v-aabe911d`]]);export{Nr as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,An as t,At as n,Dn as r,Dr as i,En as a,Fn as o,Fr as s,Gn as c,J as l,Jn as u,Jr as d,Ln as f,On as p,Pn as m,Qn as h,Vn as g,W as _,Xn as v,i as y,kn as b,lr as x,mr as S,nt as C,r as w,rt as T,sr as E,xr as D,z as O}from"./element-plus-J45pKUrE.js";import{n as k,t as A}from"./_plugin-vue_export-helper-Csn085FF.js";import{t as j}from"./CommonDialog-j_53ORvj.js";async function M(e,t){let n=e.body.getReader(),r=new TextDecoder(`utf-8`),i=``;for(;;){let{done:e,value:a}=await n.read();if(e)break;i+=r.decode(a,{stream:!0});let o=i.split(`
|
|
2
|
-
`);i=o.pop()??``;for(let e of o)e.trim()&&t(e)}i.trim()&&t(i)}async function N(){let e=await fetch(`/api/app-version`);return e.ok?e.json():{success:!1,current:``,latest:null,hasUpdate:!1,error:`HTTP ${e.status}`}}async function P(e){let t=await fetch(`/api/app-upgrade`,{method:`POST`});if(!t.ok){let n=`HTTP ${t.status}`;try{let e=await t.json();e?.error&&(n=e.error)}catch{}e({type:`error`,message:n}),e({type:`done`,code:t.status});return}if(!t.body){e({type:`error`,message:`响应无 body`}),e({type:`done`,code:-1});return}await M(t,t=>{try{e(JSON.parse(t))}catch{}})}async function F(){let e=await fetch(`/api/app-restart`,{method:`POST`});if(!e.ok){let t=`HTTP ${e.status}`;try{let n=await e.json();n?.error&&(t=n.error)}catch{}throw Error(t)}if(!e.body)throw Error(`响应无 body`);return new Promise((t,n)=>{let r=!1,i=e=>{r||(r=!0,e())};M(e,e=>{try{let r=JSON.parse(e);r.type===`ready`&&typeof r.port==`number`&&r.port>0?i(()=>t(r.port)):r.type===`timeout`?i(()=>n(Error(`restart.timeout`))):r.type===`error`&&i(()=>n(Error(r.message||`restart.failed`)))}catch{}}).then(()=>{i(()=>n(Error(`restart.stream-closed`)))}).catch(()=>{})})}g(),S(),s();var I={key:3},L={key:4},R={key:5},z={key:0,class:`upgrade-hint`},B={key:0,class:`upgrade-countdown`},V={key:1,class:`upgrade-manual`},H={class:`upgrade-manual__label`},U=`npm install -g zen-gitsync --registry https://registry.npmjs.org/`,W=A(f({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean},logs:{},status:{},countdown:{default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(a,{emit:s}){let u=a,f=s,g=D(null);E(()=>u.logs,async()=>{await c(),g.value&&(g.value.scrollTop=g.value.scrollHeight)});function _(){u.status!==`running`&&(u.status===`success`&&u.countdown>0&&f(`cancel`),f(`update:modelValue`,!1))}function v(){f(`retry`)}function S(){f(`restart`)}function w(){f(`cancel`),f(`update:modelValue`,!1)}async function A(){try{await navigator.clipboard.writeText(U),y.success(k(`@F13B4:已复制升级命令`))}catch{y.warning(k(`@F13B4:复制失败,请手动复制`))}}return(s,c)=>{let u=l,y=O;return h(),p(j,{"model-value":a.modelValue,"onUpdate:modelValue":c[0]||=e=>f(`update:modelValue`,e),title:i(k)(`@F13B4:升级`),width:`680px`,type:`flex`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":a.status!==`running`,"append-to-body":``,onClose:_},{footer:x(()=>[a.status===`failed`?(h(),p(y,{key:0,type:`primary`,onClick:v},{default:x(()=>[m(e(i(k)(`@F13B4:重试`)),1)]),_:1})):b(``,!0),a.status===`failed`?(h(),p(y,{key:1,onClick:A},{default:x(()=>[m(e(i(k)(`@F13B4:复制升级命令`)),1)]),_:1})):b(``,!0),a.status===`success`?(h(),p(y,{key:2,type:`primary`,onClick:S},{default:x(()=>[m(e(i(k)(`@F13B4:立即重启并刷新`)),1)]),_:1})):b(``,!0),a.status===`success`?(h(),p(y,{key:3,onClick:w},{default:x(()=>[m(e(i(k)(`@F13B4:稍后手动重启`)),1)]),_:1})):b(``,!0),a.status===`running`?(h(),p(y,{key:4,disabled:``},{default:x(()=>[m(e(i(k)(`@F13B4:升级中`))+`... `,1)]),_:1})):b(``,!0)]),default:x(()=>[r(`div`,{class:d([`upgrade-status`,`is-${a.status}`])},[a.status===`running`?(h(),p(u,{key:0,class:`is-loading`},{default:x(()=>[o(i(n))]),_:1})):a.status===`success`?(h(),p(u,{key:1,color:`var(--color-success)`},{default:x(()=>[o(i(C))]),_:1})):(h(),p(u,{key:2,color:`var(--color-danger)`},{default:x(()=>[o(i(T))]),_:1})),a.status===`running`?(h(),t(`span`,I,e(i(k)(`@F13B4:升级中`)),1)):a.status===`success`?(h(),t(`span`,L,e(i(k)(`@F13B4:升级完成`)),1)):(h(),t(`span`,R,e(i(k)(`@F13B4:升级失败`)),1))],2),a.status===`success`?(h(),t(`p`,z,[m(e(i(k)(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),a.countdown>0?(h(),t(`span`,B,e(i(k)(`@F13B4:{seconds} 秒后自动刷新`,{seconds:a.countdown})),1)):b(``,!0)])):b(``,!0),a.status===`failed`?(h(),t(`p`,V,[r(`span`,H,e(i(k)(`@F13B4:手动升级命令`)),1),r(`code`,{class:`upgrade-manual__cmd`},e(U))])):b(``,!0),r(`pre`,{ref_key:`logEl`,ref:g,class:`upgrade-log`},e(a.logs||i(k)(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}}}),[[`__scopeId`,`data-v-6de8caee`]]);g(),S(),s();var G={class:`app-version-badge`},K=[`aria-label`],q=[`aria-label`],J=[`title`,`aria-label`],Y={class:`upgrade-btn__label`},X={class:`upgrade-btn__version`},Z=`https://github.com/xz333221/zen-gitsync/tags`,Q=5,$=`app-version-check`,ee=36e5,te=A(f({__name:`AppVersionBadge`,setup(n){let s=`2.18.
|
|
2
|
+
`);i=o.pop()??``;for(let e of o)e.trim()&&t(e)}i.trim()&&t(i)}async function N(){let e=await fetch(`/api/app-version`);return e.ok?e.json():{success:!1,current:``,latest:null,hasUpdate:!1,error:`HTTP ${e.status}`}}async function P(e){let t=await fetch(`/api/app-upgrade`,{method:`POST`});if(!t.ok){let n=`HTTP ${t.status}`;try{let e=await t.json();e?.error&&(n=e.error)}catch{}e({type:`error`,message:n}),e({type:`done`,code:t.status});return}if(!t.body){e({type:`error`,message:`响应无 body`}),e({type:`done`,code:-1});return}await M(t,t=>{try{e(JSON.parse(t))}catch{}})}async function F(){let e=await fetch(`/api/app-restart`,{method:`POST`});if(!e.ok){let t=`HTTP ${e.status}`;try{let n=await e.json();n?.error&&(t=n.error)}catch{}throw Error(t)}if(!e.body)throw Error(`响应无 body`);return new Promise((t,n)=>{let r=!1,i=e=>{r||(r=!0,e())};M(e,e=>{try{let r=JSON.parse(e);r.type===`ready`&&typeof r.port==`number`&&r.port>0?i(()=>t(r.port)):r.type===`timeout`?i(()=>n(Error(`restart.timeout`))):r.type===`error`&&i(()=>n(Error(r.message||`restart.failed`)))}catch{}}).then(()=>{i(()=>n(Error(`restart.stream-closed`)))}).catch(()=>{})})}g(),S(),s();var I={key:3},L={key:4},R={key:5},z={key:0,class:`upgrade-hint`},B={key:0,class:`upgrade-countdown`},V={key:1,class:`upgrade-manual`},H={class:`upgrade-manual__label`},U=`npm install -g zen-gitsync --registry https://registry.npmjs.org/`,W=A(f({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean},logs:{},status:{},countdown:{default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(a,{emit:s}){let u=a,f=s,g=D(null);E(()=>u.logs,async()=>{await c(),g.value&&(g.value.scrollTop=g.value.scrollHeight)});function _(){u.status!==`running`&&(u.status===`success`&&u.countdown>0&&f(`cancel`),f(`update:modelValue`,!1))}function v(){f(`retry`)}function S(){f(`restart`)}function w(){f(`cancel`),f(`update:modelValue`,!1)}async function A(){try{await navigator.clipboard.writeText(U),y.success(k(`@F13B4:已复制升级命令`))}catch{y.warning(k(`@F13B4:复制失败,请手动复制`))}}return(s,c)=>{let u=l,y=O;return h(),p(j,{"model-value":a.modelValue,"onUpdate:modelValue":c[0]||=e=>f(`update:modelValue`,e),title:i(k)(`@F13B4:升级`),width:`680px`,type:`flex`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":a.status!==`running`,"append-to-body":``,onClose:_},{footer:x(()=>[a.status===`failed`?(h(),p(y,{key:0,type:`primary`,onClick:v},{default:x(()=>[m(e(i(k)(`@F13B4:重试`)),1)]),_:1})):b(``,!0),a.status===`failed`?(h(),p(y,{key:1,onClick:A},{default:x(()=>[m(e(i(k)(`@F13B4:复制升级命令`)),1)]),_:1})):b(``,!0),a.status===`success`?(h(),p(y,{key:2,type:`primary`,onClick:S},{default:x(()=>[m(e(i(k)(`@F13B4:立即重启并刷新`)),1)]),_:1})):b(``,!0),a.status===`success`?(h(),p(y,{key:3,onClick:w},{default:x(()=>[m(e(i(k)(`@F13B4:稍后手动重启`)),1)]),_:1})):b(``,!0),a.status===`running`?(h(),p(y,{key:4,disabled:``},{default:x(()=>[m(e(i(k)(`@F13B4:升级中`))+`... `,1)]),_:1})):b(``,!0)]),default:x(()=>[r(`div`,{class:d([`upgrade-status`,`is-${a.status}`])},[a.status===`running`?(h(),p(u,{key:0,class:`is-loading`},{default:x(()=>[o(i(n))]),_:1})):a.status===`success`?(h(),p(u,{key:1,color:`var(--color-success)`},{default:x(()=>[o(i(C))]),_:1})):(h(),p(u,{key:2,color:`var(--color-danger)`},{default:x(()=>[o(i(T))]),_:1})),a.status===`running`?(h(),t(`span`,I,e(i(k)(`@F13B4:升级中`)),1)):a.status===`success`?(h(),t(`span`,L,e(i(k)(`@F13B4:升级完成`)),1)):(h(),t(`span`,R,e(i(k)(`@F13B4:升级失败`)),1))],2),a.status===`success`?(h(),t(`p`,z,[m(e(i(k)(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),a.countdown>0?(h(),t(`span`,B,e(i(k)(`@F13B4:{seconds} 秒后自动刷新`,{seconds:a.countdown})),1)):b(``,!0)])):b(``,!0),a.status===`failed`?(h(),t(`p`,V,[r(`span`,H,e(i(k)(`@F13B4:手动升级命令`)),1),r(`code`,{class:`upgrade-manual__cmd`},e(U))])):b(``,!0),r(`pre`,{ref_key:`logEl`,ref:g,class:`upgrade-log`},e(a.logs||i(k)(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}}}),[[`__scopeId`,`data-v-6de8caee`]]);g(),S(),s();var G={class:`app-version-badge`},K=[`aria-label`],q=[`aria-label`],J=[`title`,`aria-label`],Y={class:`upgrade-btn__label`},X={class:`upgrade-btn__version`},Z=`https://github.com/xz333221/zen-gitsync/tags`,Q=5,$=`app-version-check`,ee=36e5,te=A(f({__name:`AppVersionBadge`,setup(n){let s=`2.18.10`,c=D(s),l=a(()=>c.value||s),d=D(null),f=D(!1),p=D(``),m=D(`running`),g=D(0),S=null,C=D(!1);function T(){try{let e=sessionStorage.getItem($);if(!e)return null;let{at:t,data:n}=JSON.parse(e);return Date.now()-t>ee?null:n}catch{return null}}function E(e){try{sessionStorage.setItem($,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function O(e=!1){let t=T();t&&(d.value=t);try{let t=await N();d.value=t,E(t),t.current&&(c.value=t.current),!e&&t.success&&t.hasUpdate&&y({type:`success`,message:k(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||y({type:`warning`,message:k(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function A(){if(d.value?.hasUpdate){try{await w.confirm(k(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:d.value.current,latest:d.value.latest}),k(`@F13B4:升级`),{confirmButtonText:k(`@F13B4:确定升级`),cancelButtonText:k(`@F13B4:取消`),type:`info`})}catch{return}p.value=``,m.value=`running`,f.value=!0,await P(e=>{if(e.type===`done`){if(m.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem($)}catch{}d.value?.latest&&(c.value=d.value.latest),j()}}else e.message&&(p.value+=e.message)})}}function j(){M(),g.value=Q,S=setInterval(()=>{--g.value,g.value<=0&&(S&&=(clearInterval(S),null),L())},1e3)}function M(){S&&=(clearInterval(S),null),g.value=0}function I(){M()}async function L(){if(M(),!C.value){C.value=!0;try{let e=await F(),{pathname:t,search:n,hash:r}=window.location;window.location.href=`http://localhost:${e}${t}${n}${r}`}catch(e){let t=e?.message||``,n={"restart.timeout":`@F13B4:重启超时`,"restart.stream-closed":`@F13B4:重启失败,请刷新页面重试`,"restart.failed":`@F13B4:重启失败`}[t];y({type:`warning`,message:n?k(n):k(`@F13B4:重启失败 {error}`,{error:t})}),C.value=!1}}}return u(()=>{M()}),v(()=>{O(!0)}),(n,a)=>{let s=_;return h(),t(`div`,G,[o(s,{content:i(k)(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:x(()=>[r(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":i(k)(`@F13B4:在 GitHub 上查看源码`)},[...a[1]||=[r(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{d:`M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2z`})],-1)]],8,K)]),_:1},8,[`content`]),o(s,{content:i(k)(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:x(()=>[r(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":i(k)(`@F13B4:在 npm 上查看包`)},[...a[2]||=[r(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[r(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,q)]),_:1},8,[`content`]),o(s,{content:i(k)(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:x(()=>[r(`a`,{href:Z,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+e(l.value),1)]),_:1},8,[`content`]),d.value?.hasUpdate?(h(),t(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:i(k)(`@F13B4:发现新版本 {version},点击升级`,{version:d.value.latest??``}),"aria-label":i(k)(`@F13B4:发现新版本 {version},点击升级`,{version:d.value.latest??``}),onClick:A},[a[3]||=r(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),r(`span`,Y,e(i(k)(`@F13B4:升级`)),1),r(`span`,X,`v`+e(d.value.latest),1)],8,J)):b(``,!0),o(W,{modelValue:f.value,"onUpdate:modelValue":a[0]||=e=>f.value=e,logs:p.value,status:m.value,countdown:g.value,onRetry:A,onRestart:L,onCancel:I},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}}}),[[`__scopeId`,`data-v-db57a632`]]);export{te as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,An as t,Dn as n,Dr as r,En as i,F as ee,Fn as a,Fr as o,G as te,Ht as s,I as c,J as ne,Jr as l,K as re,Ln as u,Nt as ie,On as d,Qn as f,Sn as p,U as ae,Vn as m,_ as h,bn as g,dn as _,er as v,kn as y,lr as b,mr as x,tt as S,xr as C,zt as w}from"./element-plus-J45pKUrE.js";import{n as T,t as E}from"./_plugin-vue_export-helper-Csn085FF.js";import{t as D}from"./SvgIcon-5AlG3IfR.js";import{t as O}from"./CommonDialog-j_53ORvj.js";import{U as k,W as A}from"./index-
|
|
1
|
+
import"./rolldown-runtime-C0FnF6B9.js";import{$r as e,An as t,Dn as n,Dr as r,En as i,F as ee,Fn as a,Fr as o,G as te,Ht as s,I as c,J as ne,Jr as l,K as re,Ln as u,Nt as ie,On as d,Qn as f,Sn as p,U as ae,Vn as m,_ as h,bn as g,dn as _,er as v,kn as y,lr as b,mr as x,tt as S,xr as C,zt as w}from"./element-plus-J45pKUrE.js";import{n as T,t as E}from"./_plugin-vue_export-helper-Csn085FF.js";import{t as D}from"./SvgIcon-5AlG3IfR.js";import{t as O}from"./CommonDialog-j_53ORvj.js";import{U as k,W as A}from"./index-DQ82h1aq.js";m(),x(),o(),_();var j={key:0,class:`branch-info`},M={class:`branch-wrapper`},N={class:`branch-btn`},P={class:`branch-btn-name`},F={class:`branch-btn-caret`},I={class:`branch-popover-inner`},L={class:`branch-search`},R={class:`branch-list`},z=[`onClick`],B={key:1,class:`branch-item-check-placeholder`},V={class:`branch-item-name`},oe={key:0,class:`branch-empty`},H={class:`branch-popover-footer`},U={class:`create-branch-content`},W={class:`form-label`},G={class:`form-label`},K={class:`dialog-footer`},q={class:`footer-actions`},se=[`disabled`],J=E(u({__name:`BranchSelector`,emits:[`branchChanged`],setup(o,{emit:u}){let m=k(),_=u,x=C(!1),E=C(``),J=i(()=>{let e=E.value.trim().toLowerCase();return e?m.allBranches.filter(t=>t.toLowerCase().includes(e)):m.allBranches});async function ce(e){if(e===m.currentBranch){x.value=!1;return}x.value=!1,await m.changeBranch(e)&&(_(`branchChanged`),m.refreshLog())}let Y=C(!1),X=C(``),Z=C(``);function le(){x.value=!1,Z.value=m.currentBranch,Y.value=!0}async function Q(){await m.createBranch(X.value,Z.value)&&(Y.value=!1,X.value=``,_(`branchChanged`))}let $=C(!1);async function ue(){if(!$.value){$.value=!0;try{await Promise.all([m.getCurrentBranch(!0),m.getBranchStatus(!0),m.getAllBranches()]),_(`branchChanged`),m.refreshLog()}finally{$.value=!1}}}return(i,o)=>{let u=ne,_=ae,C=h,k=re,de=ee,fe=c,pe=te;return r(m).currentBranch?(f(),t(`div`,j,[n(`div`,M,[a(C,{visible:x.value,"onUpdate:visible":o[1]||=e=>x.value=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:o[2]||=e=>E.value=``},{reference:b(()=>[n(`button`,N,[a(D,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),n(`span`,P,e(r(m).currentBranch),1),n(`span`,F,[a(u,null,{default:b(()=>[...o[7]||=[n(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[n(`path`,{fill:`currentColor`,d:`M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.776a29.12 29.12 0 0 0 0-41.6 30.592 30.592 0 0 0-42.752 0z`})],-1)]]),_:1})])])]),default:b(()=>[n(`div`,I,[n(`div`,L,[a(_,{modelValue:E.value,"onUpdate:modelValue":o[0]||=e=>E.value=e,placeholder:r(T)(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),n(`div`,R,[(f(!0),t(p,null,v(J.value,i=>(f(),t(`div`,{key:i,class:l([`branch-item`,{"is-active":i===r(m).currentBranch}]),onClick:e=>ce(i)},[i===r(m).currentBranch?(f(),d(u,{key:0,class:`branch-item-check`},{default:b(()=>[a(r(S))]),_:1})):(f(),t(`span`,B)),a(D,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),n(`span`,V,e(i),1)],10,z))),128)),J.value.length===0?(f(),t(`div`,oe,e(r(T)(`@F13B4:没有匹配的分支`)),1)):y(``,!0)]),n(`div`,H,[n(`button`,{class:`branch-create-btn`,onClick:le},[a(u,null,{default:b(()=>[a(r(w))]),_:1}),n(`span`,null,e(r(T)(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),a(A,{tooltip:r(T)(`@CMDCON:刷新`),onClick:ue},{default:b(()=>[a(u,{class:l({"is-loading":$.value})},{default:b(()=>[a(r(s))]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),a(O,{modelValue:Y.value,"onUpdate:modelValue":o[6]||=e=>Y.value=e,title:r(T)(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:b(()=>[n(`div`,K,[n(`div`,q,[n(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:o[5]||=e=>Y.value=!1},e(r(T)(`@F13B4:取消`)),1),n(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:Q,disabled:r(m).isCreatingBranch},[r(m).isCreatingBranch?(f(),d(u,{key:1,class:`is-loading`},{default:b(()=>[...o[8]||=[n(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[n(`path`,{fill:`currentColor`,d:`M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32z`})],-1)]]),_:1})):(f(),d(u,{key:0},{default:b(()=>[a(r(S))]),_:1})),n(`span`,null,e(r(T)(`@F13B4:创建`)),1)],8,se)])])]),default:b(()=>[n(`div`,U,[a(pe,{model:{newBranchName:X.value,selectedBaseBranch:Z.value},"label-position":`top`},{default:b(()=>[a(k,null,{label:b(()=>[n(`div`,W,[a(u,{class:`label-icon`},{default:b(()=>[a(r(w))]),_:1}),n(`span`,null,e(r(T)(`@F13B4:新分支名称`)),1)])]),default:b(()=>[a(_,{modelValue:X.value,"onUpdate:modelValue":o[3]||=e=>X.value=e,placeholder:r(T)(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:g(Q,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),a(k,null,{label:b(()=>[n(`div`,G,[a(u,{class:`label-icon`},{default:b(()=>[a(r(ie))]),_:1}),n(`span`,null,e(r(T)(`@F13B4:基于分支`)),1)])]),default:b(()=>[a(fe,{modelValue:Z.value,"onUpdate:modelValue":o[4]||=e=>Z.value=e,placeholder:r(T)(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:b(()=>[(f(!0),t(p,null,v(r(m).allBranches,e=>(f(),d(de,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):y(``,!0)}}}),[[`__scopeId`,`data-v-407da320`]]);export{J as default};
|