@shaohui_jin/git-cockpit-mcp-server 0.1.7 → 0.1.8

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/mcpServer.ts","../src/tools/handlers.ts","../src/tools/schemas.ts","../src/tools/index.ts"],"sourcesContent":["/**\n * MCP Server 装配:\n * - 基于官方 SDK 的 McpServer(tools 能力),注册全部工具;\n * - 支持 stdio(独立子进程模式)与 Streamable HTTP(daemon 转发模式)两种传输。\n *\n * 所有工具共用 executeTool 安全链路(权限/dry-run/备份/审计)。\n */\nimport { randomUUID } from 'node:crypto';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport type { Runtime } from './runtime.js';\nimport { executeTool, formatResultForMcp } from './tools/handlers.js';\nimport { TOOL_DEFS } from './tools/index.js';\n\nexport const MCP_SERVER_INFO = { name: 'git-cockpit-mcp-server', version: '0.1.0' } as const;\n\n/** 创建一个已注册全部工具的 McpServer(一个传输对应一个实例) */\nexport function createMcpServer(runtime: Runtime): McpServer {\n const server = new McpServer(\n { name: MCP_SERVER_INFO.name, version: MCP_SERVER_INFO.version },\n {\n capabilities: { tools: {} },\n instructions: [\n 'Git Cockpit MCP Server:可视化的 Git 操作工具。',\n '使用规则:',\n '1. 先调用 git_status 查看工作区状态;',\n '2. 写操作(git_add/git_commit/git_push 等)默认可执行,但请先使用 dry_run=true 预览影响范围;',\n '3. 高风险工具(git_reset_hard/git_clean/git_push_force/git_branch_delete_force/git_rebase)默认禁用,',\n ' 需管理员在配置中开启;执行时系统会自动备份当前状态;',\n '4. 未指定 repoPath 时使用最近打开的仓库。'\n ].join('\\n')\n }\n );\n\n for (const def of TOOL_DEFS) {\n // SDK registerTool 的泛型联合推断在遍历场景下不稳定,统一收窄为运行时签名。\n // 注意:必须 bind(server),SDK 1.30 的 registerTool 内部访问 this._registeredTools,\n // 抽成裸函数调用会丢 this,注册时抛 TypeError 导致 MCP 握手挂起。\n const register = server.registerTool.bind(server) as unknown as (\n name: string,\n config: { title?: string; description?: string; inputSchema?: unknown },\n cb: (args: unknown, extra: unknown) => Promise<unknown>\n ) => unknown;\n\n register(\n def.name,\n { description: def.description, inputSchema: def.schema },\n async (args: unknown) => {\n const exec = await executeTool(def, (args ?? {}) as Record<string, unknown>, {\n runtime,\n source: 'mcp'\n });\n return {\n content: [{ type: 'text' as const, text: formatResultForMcp(exec) }],\n isError: !exec.success\n };\n }\n );\n }\n return server;\n}\n\n/** stdio 模式:单连接,适合 Claude Desktop / Cursor 直接拉起的独立进程 */\nexport async function startMcpStdio(runtime: Runtime): Promise<void> {\n const server = createMcpServer(runtime);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\n// ---------------------------------------------------------------------------\n// Streamable HTTP 模式(daemon 内嵌):stateful 会话管理\n// ---------------------------------------------------------------------------\n\ninterface McpHttpSession {\n id: string;\n server: McpServer;\n transport: StreamableHTTPServerTransport;\n}\n\n/** 维护 Streamable HTTP 的会话映射(sessionId -> server+transport) */\nexport class McpHttpHandler {\n private readonly sessions = new Map<string, McpHttpSession>();\n constructor(private readonly runtime: Runtime) {}\n\n async handle(req: IncomingMessage, res: ServerResponse, parsedBody?: unknown): Promise<void> {\n const headerId = req.headers['mcp-session-id'];\n if (typeof headerId === 'string' && headerId) {\n const session = this.sessions.get(headerId);\n if (!session) {\n res.statusCode = 404;\n res.end('MCP session not found');\n return;\n }\n await session.transport.handleRequest(req, res, parsedBody);\n return;\n }\n\n // 新会话:创建 transport + server 并连接\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID()\n });\n const server = createMcpServer(this.runtime);\n await server.connect(transport);\n const session: McpHttpSession = { id: '', server, transport };\n transport.onclose = () => {\n if (session.id) this.sessions.delete(session.id);\n void server.close().catch(() => undefined);\n };\n await transport.handleRequest(req, res, parsedBody);\n const sid = transport.sessionId;\n if (sid) {\n session.id = sid;\n this.sessions.set(sid, session);\n }\n }\n\n dispose(): void {\n for (const session of this.sessions.values()) {\n session.transport.close().catch(() => undefined);\n }\n this.sessions.clear();\n }\n}","/**\n * 工具执行层:所有工具(MCP / Web / CLI 共用)的收口。\n *\n * 统一处理:\n * 1. 权限检查(PermissionManager:禁用/需审批 → 拒绝并记录 denied);\n * 2. 参数 schema 校验(zod);\n * 3. 仓库解析(显式 repoPath / repoId / 最近打开仓库);\n * 4. dry_run 预览模式(默认取配置);\n * 5. 高风险操作自动备份(BackupManager,配置开启时);\n * 6. 执行 + 结果审计日志(脱敏);\n * 7. 触达事件(GitService 'changed' 已由 RepoManager 转发)。\n */\nimport { z } from 'zod';\nimport {\n BackupManager,\n GitOperationError,\n GitService,\n PermissionError\n} from '@shaohui_jin/git-cockpit-core';\nimport type { BackupResult, RiskLevel } from '@shaohui_jin/git-cockpit-core';\nimport type { RepoHandle } from '../repoManager.js';\nimport type { Runtime } from '../runtime.js';\n\nexport interface ToolExecutionContext {\n runtime: Runtime;\n source: 'mcp' | 'web' | 'cli';\n /** 上层已解析的仓库(Web 路由提供 repoId,MCP 可通过 tool args 的 repoPath 提供) */\n repoId?: number;\n repoPath?: string;\n}\n\nexport interface ToolDefBase {\n /** 工具名(如 git_status) */\n name: string;\n description: string;\n risk: RiskLevel;\n}\n\nexport interface ToolDef<TSchema extends z.ZodTypeAny = z.ZodTypeAny> extends ToolDefBase {\n schema: TSchema;\n handler: ToolHandler<TSchema>;\n}\n\nexport type ToolHandler<TSchema extends z.ZodTypeAny> = (\n args: z.infer<TSchema> & { repoPath?: string; dryRun?: boolean },\n ctx: ToolExecutionContext & { git: GitService; repoPath: string }\n) => Promise<unknown>;\n\nexport interface ToolExecutionResult {\n tool: string;\n source: 'mcp' | 'web' | 'cli';\n dryRun: boolean;\n success: boolean;\n /** 成功时的返回值(字符串输出或结构化数据) */\n result?: unknown;\n error?: {\n code: string;\n message: string;\n requiredApproval: boolean;\n };\n /** 高风险操作自动创建的备份信息 */\n backupCreated?: BackupResult | null;\n durationMs: number;\n /** 预览格式(dryRun 时返回的 WritePreview 已包含命令) */\n preview?: unknown;\n}\n\n/** 解析目标仓库:优先级 repoId > repoPath(上下文) > args.repoPath > 最近打开 */\nasync function resolveRepo(runtime: Runtime, ctx: ToolExecutionContext, argsPath?: string): Promise<RepoHandle> {\n if (ctx.repoId !== undefined) {\n const handle = await runtime.repoManager.getById(ctx.repoId);\n if (handle) return handle;\n throw new GitOperationError(`仓库不存在: id=${ctx.repoId}`, 'REPO_NOT_FOUND');\n }\n if (ctx.repoPath) {\n return runtime.repoManager.getByPath(ctx.repoPath);\n }\n if (argsPath) {\n return runtime.repoManager.open(argsPath);\n }\n const current = await runtime.repoManager.getCurrent();\n if (!current) {\n throw new GitOperationError('尚未打开任何仓库。请先打开仓库或提供 repoPath 参数。', 'NO_ACTIVE_REPO');\n }\n return current;\n}\n\nfunction extractError(err: unknown): { code: string; message: string; requiredApproval: boolean } {\n if (err instanceof PermissionError) {\n return { code: 'PERMISSION_DENIED', message: err.message, requiredApproval: err.requiredApproval };\n }\n if (err instanceof GitOperationError) {\n return { code: err.code, message: err.message, requiredApproval: false };\n }\n if (err instanceof z.ZodError) {\n const summary = err.issues\n .map((i) => `${i.path.join('.') || '(root)'}: ${i.message}`)\n .slice(0, 5)\n .join('; ');\n return { code: 'INVALID_ARGS', message: `参数校验失败:${summary}`, requiredApproval: false };\n }\n const msg = err instanceof Error ? err.message : String(err);\n return { code: 'INTERNAL_ERROR', message: msg.slice(0, 500), requiredApproval: false };\n}\n\n/**\n * 执行一个工具(含统一安全链路)。返回标准化结果,不抛异常(错误编码进 error 字段)。\n */\nexport async function executeTool(\n def: ToolDef,\n rawArgs: Record<string, unknown>,\n ctx: ToolExecutionContext\n): Promise<ToolExecutionResult> {\n const runtime = ctx.runtime;\n const t0 = Date.now();\n const dryRun = typeof rawArgs.dryRun === 'boolean' ? rawArgs.dryRun : runtime.permissions.getDryRunDefault();\n\n const record = (result: 'success' | 'error' | 'denied', params: Record<string, unknown>, errorMessage?: string, repoPath?: string) => {\n runtime.auditLogger.log({\n timestamp: new Date().toISOString(),\n source: ctx.source,\n tool: def.name,\n repoPath: repoPath ?? '',\n params,\n result,\n error: errorMessage ?? null,\n durationMs: Date.now() - t0,\n dryRun\n });\n runtime.eventBus.emit('log', { tool: def.name, result, at: new Date().toISOString() });\n };\n\n try {\n // 1. 权限\n runtime.permissions.assertAllowed(def.name);\n\n // 2. schema 校验\n let args: Record<string, unknown>;\n try {\n args = def.schema.parse(rawArgs) as Record<string, unknown>;\n } catch (err) {\n const e = extractError(err);\n record('error', rawArgs, e.message);\n return { tool: def.name, source: ctx.source, dryRun, success: false, error: e, durationMs: Date.now() - t0 };\n }\n\n // 3. 仓库解析\n const handle = await resolveRepo(runtime, ctx, args.repoPath as string | undefined);\n const git = handle.service;\n const repoPath = git.repoPath;\n\n // 4. 高风险自动备份(非预览时)\n let backup: BackupResult | null = null;\n if (!dryRun && def.risk === 'dangerous' && runtime.config.git.backupOnDangerousOps) {\n backup = await new BackupManager(git).createBackup();\n args = { ...args, __backup: { branch: backup.branch, stashRef: backup.stashRef } };\n }\n\n // 5. 执行\n const result = await def.handler(args, { ...ctx, git, repoPath });\n\n // 6. 审计\n record('success', args, undefined, repoPath);\n\n const preview = dryRun ? result : undefined;\n return {\n tool: def.name,\n source: ctx.source,\n dryRun,\n success: true,\n result,\n preview,\n backupCreated: backup,\n durationMs: Date.now() - t0\n };\n } catch (err) {\n const e = extractError(err);\n const isDenied = err instanceof PermissionError;\n record(isDenied ? 'denied' : 'error', rawArgs, e.message);\n return {\n tool: def.name,\n source: ctx.source,\n dryRun,\n success: false,\n error: e,\n durationMs: Date.now() - t0\n };\n }\n}\n\n/** 把干运行/真实结果统一包成 MCP 文本输出 */\nexport function formatResultForMcp(exec: ToolExecutionResult): string {\n if (!exec.success) {\n const prefix = exec.error?.requiredApproval ? '需要审批' : '操作失败';\n return `${prefix}:${exec.error?.message ?? '未知错误'}`;\n }\n const parts: string[] = [];\n if (exec.dryRun) {\n parts.push('[dry-run 预览] 未实际执行任何操作');\n }\n if (exec.backupCreated) {\n parts.push(`[自动备份] 分支 ${exec.backupCreated.branch ?? '(未创建)'}${exec.backupCreated.stashRef ? `,stash ${exec.backupCreated.stashRef}` : ''}`);\n }\n const payload =\n typeof exec.result === 'string'\n ? exec.result\n : JSON.stringify(exec.result, null, 2);\n parts.push(payload);\n return parts.join('\\n\\n');\n}","/**\n * MCP 工具参数 Schema(zod)。\n * 所有工具均支持可选的 repoPath(缺省使用当前打开的仓库)与 dryRun(缺省为配置默认)。\n */\nimport { z } from 'zod';\n\nconst repoPath = z\n .string()\n .optional()\n .describe('仓库绝对路径。不提供时使用当前打开的仓库。');\n\nconst dryRun = z\n .boolean()\n .optional()\n .describe('为 true 时仅返回将执行的命令与影响范围(预览/干运行),不真正修改仓库。');\n\nconst maxCount = z\n .number()\n .int()\n .min(1)\n .max(10000)\n .optional()\n .describe('最多返回的提交数量。');\n\n/** 全部只读工具共享的 schema(仅 repoPath 可选) */\nconst readonlyBase = { repoPath };\n\nexport const GitStatusSchema = z.object({ ...readonlyBase });\nexport type GitStatusArgs = z.infer<typeof GitStatusSchema>;\n\nexport const GitLogSchema = z.object({\n ...readonlyBase,\n maxCount,\n from: z.string().optional().describe('起始提交(含);与 to 配合表示范围 from..to'),\n to: z.string().optional().describe('结束提交(含)'),\n author: z.string().optional().describe('按作者过滤(支持子串)'),\n path: z.string().optional().describe('仅查看该路径的历史'),\n all: z.boolean().optional().describe('包含所有分支(--all)')\n});\nexport type GitLogArgs = z.infer<typeof GitLogSchema>;\n\nexport const GitDiffSchema = z.object({\n ...readonlyBase,\n from: z.string().optional().describe('起点提交'),\n to: z.string().optional().describe('终点提交'),\n path: z.string().optional().describe('限定的文件路径'),\n staged: z.boolean().optional().describe('查看已暂存(索引)差异'),\n maxPatchBytes: z.number().int().positive().optional().describe('diff 正文最大字节数,超出截断')\n});\nexport type GitDiffArgs = z.infer<typeof GitDiffSchema>;\n\nexport const GitShowSchema = z.object({\n ...readonlyBase,\n commit: z.string().describe('要查看的提交 hash'),\n path: z.string().optional().describe('限定文件'),\n maxPatchBytes: z.number().int().positive().optional()\n});\nexport type GitShowArgs = z.infer<typeof GitShowSchema>;\n\nexport const GitBranchListSchema = z.object({ ...readonlyBase });\nexport type GitBranchListArgs = z.infer<typeof GitBranchListSchema>;\n\nexport const GitTagListSchema = z.object({ ...readonlyBase });\nexport type GitTagListArgs = z.infer<typeof GitTagListSchema>;\n\nexport const GitRemoteListSchema = z.object({ ...readonlyBase });\nexport type GitRemoteListArgs = z.infer<typeof GitRemoteListSchema>;\n\nexport const GitFileContentSchema = z.object({\n ...readonlyBase,\n commit: z.string().describe('提交 hash(如 HEAD、main)'),\n path: z.string().describe('仓库内文件相对路径')\n});\nexport type GitFileContentArgs = z.infer<typeof GitFileContentSchema>;\n\nexport const GitGraphSchema = z.object({\n ...readonlyBase,\n maxCount: z.number().int().min(1).max(5000).optional().describe('最大提交数')\n});\nexport type GitGraphArgs = z.infer<typeof GitGraphSchema>;\n\n/** 写操作公共参数 */\nconst writeBase = { repoPath, dryRun };\nconst pathsField = z.array(z.string()).default([]).describe('文件路径列表;缺省为空即全部文件');\n\nexport const GitAddSchema = z.object({ ...writeBase, paths: pathsField });\nexport type GitAddArgs = z.infer<typeof GitAddSchema>;\n\nexport const GitUnstageSchema = z.object({ ...writeBase, paths: pathsField });\nexport type GitUnstageArgs = z.infer<typeof GitUnstageSchema>;\n\nexport const GitCommitSchema = z.object({\n ...writeBase,\n message: z.string().min(1).describe('提交信息'),\n paths: z.array(z.string()).optional().describe('仅提交这些路径(可空)'),\n allowEmpty: z.boolean().optional().describe('允许空提交(--allow-empty)')\n});\nexport type GitCommitArgs = z.infer<typeof GitCommitSchema>;\n\nexport const GitCheckoutSchema = z.object({\n ...writeBase,\n branch: z.string().describe('要切换到的分支名')\n});\nexport type GitCheckoutArgs = z.infer<typeof GitCheckoutSchema>;\n\nexport const GitBranchCreateSchema = z.object({\n ...writeBase,\n name: z.string().describe('新分支名'),\n startPoint: z.string().optional().describe('创建起点(提交/分支),缺省为当前 HEAD')\n});\nexport type GitBranchCreateArgs = z.infer<typeof GitBranchCreateSchema>;\n\nexport const GitBranchDeleteSchema = z.object({\n ...writeBase,\n name: z.string().describe('要删除的分支名(未合并分支会被拒绝)')\n});\nexport type GitBranchDeleteArgs = z.infer<typeof GitBranchDeleteSchema>;\n\nexport const GitMergeSchema = z.object({\n ...writeBase,\n branch: z.string().describe('要合并进来的分支名')\n});\nexport type GitMergeArgs = z.infer<typeof GitMergeSchema>;\n\nexport const GitPullSchema = z.object({\n ...writeBase,\n remote: z.string().optional().describe('远程名(缺省 origin)'),\n branch: z.string().optional().describe('远端分支名')\n});\nexport type GitPullArgs = z.infer<typeof GitPullSchema>;\n\nexport const GitPushSchema = z.object({\n ...writeBase,\n remote: z.string().optional().describe('远程名(缺省 origin)'),\n branch: z.string().optional().describe('分支名')\n});\nexport type GitPushArgs = z.infer<typeof GitPushSchema>;\n\nexport const GitTagCreateSchema = z.object({\n ...writeBase,\n name: z.string().describe('标签名'),\n message: z.string().optional().describe('附注标签消息(带则创建 annotated tag)'),\n commit: z.string().optional().describe('打标签的提交,缺省为 HEAD')\n});\nexport type GitTagCreateArgs = z.infer<typeof GitTagCreateSchema>;\n\nexport const GitStashSchema = z.object({\n ...writeBase,\n message: z.string().optional().describe('stash 消息'),\n includeUntracked: z.boolean().optional().describe('包含未跟踪文件(-u)'),\n paths: pathsField.describe('仅暂存这些文件(对应 WebStorm Shelve 的选择性暂存;空则暂存全部)')\n});\nexport type GitStashArgs = z.infer<typeof GitStashSchema>;\n\nexport const GitStashListSchema = z.object({ ...readonlyBase });\nexport type GitStashListArgs = z.infer<typeof GitStashListSchema>;\n\nexport const GitStashShowSchema = z.object({\n ...readonlyBase,\n index: z.number().int().min(0).optional().describe('stash 序号,缺省为 stash@{0}'),\n maxPatchBytes: z.number().int().positive().optional().describe('diff 正文最大字节数,超出截断')\n});\nexport type GitStashShowArgs = z.infer<typeof GitStashShowSchema>;\n\nexport const GitStashApplySchema = z.object({\n ...writeBase,\n index: z.number().int().min(0).optional().describe('stash 序号,缺省为 stash@{0}')\n});\nexport type GitStashApplyArgs = z.infer<typeof GitStashApplySchema>;\n\nexport const GitStashDropSchema = z.object({\n ...writeBase,\n index: z.number().int().min(0).optional().describe('stash 序号,缺省为 stash@{0}')\n});\nexport type GitStashDropArgs = z.infer<typeof GitStashDropSchema>;\n\nexport const GitStashPopSchema = z.object({\n ...writeBase,\n index: z.number().int().min(0).optional().describe('stash 序号,缺省为最新的 stash@{0}')\n});\nexport type GitStashPopArgs = z.infer<typeof GitStashPopSchema>;\n\n/** 高风险工具 */\nexport const GitResetHardSchema = z.object({ ...writeBase, target: z.string().describe('要重置到的提交') });\nexport type GitResetHardArgs = z.infer<typeof GitResetHardSchema>;\n\nexport const GitCleanSchema = z.object({ ...writeBase });\nexport type GitCleanArgs = z.infer<typeof GitCleanSchema>;\n\nexport const GitPushForceSchema = z.object({\n ...writeBase,\n remote: z.string().optional(),\n branch: z.string().optional()\n});\nexport type GitPushForceArgs = z.infer<typeof GitPushForceSchema>;\n\nexport const GitBranchDeleteForceSchema = z.object({\n ...writeBase,\n name: z.string().describe('要强制删除的分支名')\n});\nexport type GitBranchDeleteForceArgs = z.infer<typeof GitBranchDeleteForceSchema>;\n\nexport const GitRebaseSchema = z.object({\n ...writeBase,\n branch: z.string().describe('要变基到的分支/提交')\n});\nexport type GitRebaseArgs = z.infer<typeof GitRebaseSchema>;","/**\n * 工具注册表:全部 MCP 工具的静态定义(名称/描述/风险等级/schema/handler)。\n * handler 直接调用 core GitService 的方法;统一安全链路由 executeTool 承担。\n */\nimport type { GitService } from '@shaohui_jin/git-cockpit-core';\nimport * as S from './schemas.js';\nimport type { ToolDef } from './handlers.js';\n\ntype Args = Record<string, unknown> & { repoPath?: string; dryRun?: boolean };\n\nexport const TOOL_DEFS: ToolDef[] = [\n // ---------------------------------------------------------------------------\n // 只读工具(默认开放)\n // ---------------------------------------------------------------------------\n {\n name: 'git_status',\n description: '获取当前仓库的工作区状态:当前分支、已暂存/未暂存/未跟踪文件、冲突文件、领先/落后于上游等。',\n risk: 'readonly',\n schema: S.GitStatusSchema,\n handler: async (_args: Args, ctx) => ctx.git.getStatus()\n },\n {\n name: 'git_log',\n description: '获取提交历史(默认 HEAD 起,最多返回 maxCount 条)。支持按作者、路径、提交范围过滤。',\n risk: 'readonly',\n schema: S.GitLogSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.getLog({\n maxCount: args.maxCount as number | undefined,\n from: args.from as string | undefined,\n to: args.to as string | undefined,\n author: args.author as string | undefined,\n path: args.path as string | undefined,\n all: args.all as boolean | undefined\n })\n },\n {\n name: 'git_diff',\n description: '获取工作区/暂存区/提交范围的差异。支持指定文件、staged、大 diff 截断。返回文件级统计与完整 unified diff 文本。',\n risk: 'readonly',\n schema: S.GitDiffSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.getDiff({\n from: args.from as string | undefined,\n to: args.to as string | undefined,\n path: args.path as string | undefined,\n staged: args.staged as boolean | undefined,\n maxPatchBytes: args.maxPatchBytes as number | undefined\n })\n },\n {\n name: 'git_show',\n description: '显示某个提交的详细信息(元信息 + 相对父提交的 diff)。',\n risk: 'readonly',\n schema: S.GitShowSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.getShow(args.commit as string, {\n path: args.path as string | undefined,\n maxPatchBytes: args.maxPatchBytes as number | undefined\n })\n },\n {\n name: 'git_branch_list',\n description: '列出所有本地与远程分支,标注当前分支及其指向的提交。',\n risk: 'readonly',\n schema: S.GitBranchListSchema,\n handler: async (_args: Args, ctx) => ctx.git.listBranches()\n },\n {\n name: 'git_tag_list',\n description: '列出所有标签(按创建时间倒序)。',\n risk: 'readonly',\n schema: S.GitTagListSchema,\n handler: async (_args: Args, ctx) => ctx.git.listTags()\n },\n {\n name: 'git_remote_list',\n description: '列出远程仓库信息(名称、fetch/push URL)。',\n risk: 'readonly',\n schema: S.GitRemoteListSchema,\n handler: async (_args: Args, ctx) => ctx.git.listRemotes()\n },\n {\n name: 'git_file_content',\n description: '读取指定提交中某个文件的内容(大文件自动截断 2MB)。',\n risk: 'readonly',\n schema: S.GitFileContentSchema,\n handler: async (args: Args, ctx) => ctx.git.getFileContent(args.commit as string, args.path as string)\n },\n {\n name: 'git_graph',\n description: '获取分支拓扑图数据(全部分支提交、父提交、引用装饰、HEAD 位置),供可视化渲染。',\n risk: 'readonly',\n schema: S.GitGraphSchema,\n handler: async (args: Args, ctx) => ctx.git.getGraph(args.maxCount as number | undefined)\n },\n\n // ---------------------------------------------------------------------------\n // 写操作工具(默认开放,需预览/确认)\n // ---------------------------------------------------------------------------\n {\n name: 'git_add',\n description: '暂存指定文件;paths 为空表示暂存全部。支持 dry_run 预览。',\n risk: 'write',\n schema: S.GitAddSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.add((args.paths as string[]) ?? [], { dryRun: args.dryRun as boolean | undefined })\n },\n {\n name: 'git_unstage',\n description: '取消暂存指定文件(git reset HEAD -- <paths>)。支持 dry_run 预览。',\n risk: 'write',\n schema: S.GitUnstageSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.unstage((args.paths as string[]) ?? [], { dryRun: args.dryRun as boolean | undefined })\n },\n {\n name: 'git_commit',\n description: '创建提交。需要指定 message;paths 可限定仅提交部分文件;allowEmpty 允许空提交。支持 dry_run 预览。',\n risk: 'write',\n schema: S.GitCommitSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.commit(args.message as string, {\n dryRun: args.dryRun as boolean | undefined,\n allowEmpty: args.allowEmpty as boolean | undefined,\n paths: args.paths as string[] | undefined\n })\n },\n {\n name: 'git_checkout',\n description: '切换到指定分支。若本地更改会被覆盖将拒绝并给出提示。支持 dry_run 预览。',\n risk: 'write',\n schema: S.GitCheckoutSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.checkoutBranch(args.branch as string, { dryRun: args.dryRun as boolean | undefined })\n },\n {\n name: 'git_branch_create',\n description: '创建新分支(默认从当前 HEAD;startPoint 可指定起点)。支持 dry_run 预览。',\n risk: 'write',\n schema: S.GitBranchCreateSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.createBranch(args.name as string, {\n dryRun: args.dryRun as boolean | undefined,\n startPoint: args.startPoint as string | undefined\n })\n },\n {\n name: 'git_branch_delete',\n description: '安全删除分支(-d,未合并分支会拒绝)。支持 dry_run 预览。',\n risk: 'write',\n schema: S.GitBranchDeleteSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.deleteBranch(args.name as string, { dryRun: args.dryRun as boolean | undefined })\n },\n {\n name: 'git_merge',\n description: '把指定分支合并到当前分支(普通合并)。产生冲突时会提示解决。支持 dry_run 预览。',\n risk: 'write',\n schema: S.GitMergeSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.merge(args.branch as string, { dryRun: args.dryRun as boolean | undefined })\n },\n {\n name: 'git_pull',\n description: '从远程拉取并合并(非强制)。远程有冲突将提示。支持 dry_run 预览。',\n risk: 'write',\n schema: S.GitPullSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.pull({\n dryRun: args.dryRun as boolean | undefined,\n remote: args.remote as string | undefined,\n branch: args.branch as string | undefined\n })\n },\n {\n name: 'git_push',\n description: '推送到远程(非强制)。推送被拒绝(远程有新提交)会给出提示。支持 dry_run 预览。',\n risk: 'write',\n schema: S.GitPushSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.push({\n dryRun: args.dryRun as boolean | undefined,\n remote: args.remote as string | undefined,\n branch: args.branch as string | undefined\n })\n },\n {\n name: 'git_tag_create',\n description: '创建标签;提供 message 则创建附注标签。支持 dry_run 预览。',\n risk: 'write',\n schema: S.GitTagCreateSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.createTag(args.name as string, {\n dryRun: args.dryRun as boolean | undefined,\n message: args.message as string | undefined,\n commit: args.commit as string | undefined\n })\n },\n {\n name: 'git_stash',\n description: '暂存(stash)当前工作区更改,可选包含未跟踪文件(-u);paths 可指定仅暂存部分文件(对应 WebStorm Shelve 的选择性暂存)。支持 dry_run 预览。',\n risk: 'write',\n schema: S.GitStashSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.stash(args.message as string | undefined, {\n dryRun: args.dryRun as boolean | undefined,\n includeUntracked: args.includeUntracked as boolean | undefined,\n paths: (args.paths as string[]) ?? []\n })\n },\n {\n name: 'git_stash_list',\n description: '列出全部 stash 记录(stash@{n} / 说明 / 时间)。',\n risk: 'readonly',\n schema: S.GitStashListSchema,\n handler: async (_args: Args, ctx) => ctx.git.listStashes()\n },\n {\n name: 'git_stash_show',\n description: '查看某条 stash 的差异内容(不修改仓库)。',\n risk: 'readonly',\n schema: S.GitStashShowSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.stashShow({\n index: args.index as number | undefined,\n maxPatchBytes: args.maxPatchBytes as number | undefined\n })\n },\n {\n name: 'git_stash_apply',\n description: '应用某条 stash(保留记录,可反复应用)。产生冲突会提示。支持 dry_run 预览。',\n risk: 'write',\n schema: S.GitStashApplySchema,\n handler: async (args: Args, ctx) =>\n ctx.git.stashApply({ dryRun: args.dryRun as boolean | undefined, index: args.index as number | undefined })\n },\n {\n name: 'git_stash_drop',\n description: '删除某条 stash 记录(删除后不可直接恢复)。支持 dry_run 预览。',\n risk: 'write',\n schema: S.GitStashDropSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.stashDrop({ dryRun: args.dryRun as boolean | undefined, index: args.index as number | undefined })\n },\n {\n name: 'git_stash_pop',\n description: '恢复最新(或指定 index)的 stash。恢复产生冲突会提示。支持 dry_run 预览。',\n risk: 'write',\n schema: S.GitStashPopSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.stashPop({ dryRun: args.dryRun as boolean | undefined, index: args.index as number | undefined })\n },\n\n // ---------------------------------------------------------------------------\n // 高风险工具(默认禁用,需开启/审批;自动备份)\n // ---------------------------------------------------------------------------\n {\n name: 'git_reset_hard',\n description: '硬重置到指定提交(丢弃索引与工作区更改,高风险不可逆,执行前自动备份)。',\n risk: 'dangerous',\n schema: S.GitResetHardSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.resetHard(args.target as string, { dryRun: args.dryRun as boolean | undefined })\n },\n {\n name: 'git_clean',\n description: '清理(删除)所有未跟踪文件与目录(高风险不可逆,执行前自动备份)。支持 dry_run 预览。',\n risk: 'dangerous',\n schema: S.GitCleanSchema,\n handler: async (args: Args, ctx) => ctx.git.clean({ dryRun: args.dryRun as boolean | undefined })\n },\n {\n name: 'git_push_force',\n description: '以 --force-with-lease 强制推送(覆盖远程历史,高风险,执行前自动备份)。',\n risk: 'dangerous',\n schema: S.GitPushForceSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.pushForce({\n dryRun: args.dryRun as boolean | undefined,\n remote: args.remote as string | undefined,\n branch: args.branch as string | undefined\n })\n },\n {\n name: 'git_branch_delete_force',\n description: '强制删除分支(-D,不检查合并状态,高风险)。支持 dry_run 预览。',\n risk: 'dangerous',\n schema: S.GitBranchDeleteForceSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.deleteBranchForce(args.name as string, { dryRun: args.dryRun as boolean | undefined })\n },\n {\n name: 'git_rebase',\n description: '把当前分支变基到指定分支(重写提交历史,高风险,产生冲突需手动解决后 git rebase --continue)。',\n risk: 'dangerous',\n schema: S.GitRebaseSchema,\n handler: async (args: Args, ctx) =>\n ctx.git.rebase(args.branch as string, { dryRun: args.dryRun as boolean | undefined })\n }\n];\n\nexport const TOOL_DEF_MAP: ReadonlyMap<string, ToolDef> = new Map(TOOL_DEFS.map((d) => [d.name, d]));\n\n/** 供 mcpServer 注册工具列表(名称、描述、schema) */\nexport function toolSummaries(): { name: string; description: string }[] {\n return TOOL_DEFS.map((d) => ({ name: d.name, description: d.description }));\n}\n\nexport type { GitService };"],"mappings":"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","names":["dryRun","repoPath","z","session"]}
@@ -1,114 +0,0 @@
1
- import{az as ht,c as q,G as Le,d as Fe,a6 as $n,O as W,W as d,aj as O,aA as Ln,aB as mt,L as w,a0 as p,P as T,$ as P,u as X,M as A,F as se,ae as be,_ as I,Y as Dn,k as Q,aq as gt,S as Ue,ac as Oe,Z as J,w as Ve,i as In,e as dt,X as Xe,ak as Je,aC as Vn,aD as Pn,aw as On,aE as An}from"./vue-CYNDxJyv.js";import{E as ne,a as bt,e as Fn}from"./element-plus-D8uC5V5h.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))e(l);new MutationObserver(l=>{for(const f of l)if(f.type==="childList")for(const r of f.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&e(r)}).observe(document,{childList:!0,subtree:!0});function n(l){const f={};return l.integrity&&(f.integrity=l.integrity),l.referrerPolicy&&(f.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?f.credentials="include":l.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function e(l){if(l.ep)return;l.ep=!0;const f=n(l);fetch(l.href,f)}})();class ct extends Error{constructor(t,n,e,l){super(t),this.status=n,this.code=e,this.requiredApproval=l,this.name="ApiError"}}async function me(s,t,n){let e;try{e=await fetch(t,{method:s,headers:n!==void 0?{"Content-Type":"application/json"}:void 0,body:n!==void 0?JSON.stringify(n):void 0})}catch(l){throw new ct(`无法连接后端服务(${t}):${l instanceof Error?l.message:String(l)}`,0)}if(!e.ok){let l=e.statusText,f,r;try{const h=await e.json();typeof h.error=="string"?(l=h.error,f=h.code,r=h.requiredApproval):h.error&&typeof h.error=="object"?(l=h.error.message??l,f=h.error.code??h.code,r=h.error.requiredApproval??h.requiredApproval):h.message&&(l=h.message,f=h.code,r=h.requiredApproval)}catch{}throw new ct(l,e.status,f,r)}return await e.json()}function Rn(){return me("GET","/api/repos")}function Mn(s){return me("POST","/api/repos/open",{path:s})}function zn(s){return me("POST",`/api/repos/${s}/activate`)}function Hn(s){return me("DELETE",`/api/repos/${s}`)}function Bn(s){return me("GET",`/api/repos/${s}/status`)}function Un(s,t={}){const n=new URLSearchParams;t.maxCount&&n.set("maxCount",String(t.maxCount)),t.all&&n.set("all","true"),t.path&&n.set("path",t.path),t.from&&n.set("from",t.from),t.to&&n.set("to",t.to),t.author&&n.set("author",t.author);const e=n.toString();return me("GET",`/api/repos/${s}/log${e?`?${e}`:""}`)}function Wn(s,t={}){const n=new URLSearchParams;t.from&&n.set("from",t.from),t.to&&n.set("to",t.to),t.path&&n.set("path",t.path),t.staged&&n.set("staged","true");const e=n.toString();return me("GET",`/api/repos/${s}/diff${e?`?${e}`:""}`)}function jn(s,t){return me("GET",`/api/repos/${s}/show/${encodeURIComponent(t)}`)}function qt(s){return me("GET",`/api/repos/${s}/branches`)}function Gn(s){return me("GET",`/api/repos/${s}/stashes`)}function ut(s,t,n={}){return me("POST",`/api/repos/${s}/tools/${t}`,{params:n})}function qn(s={}){const t=new URLSearchParams;s.limit&&t.set("limit",String(s.limit)),s.tool&&t.set("tool",s.tool);const n=t.toString();return me("GET",`/api/logs${n?`?${n}`:""}`)}function Kn(){return me("GET","/api/settings")}function Xn(s){return me("PUT","/api/settings",{permissions:s})}function Jn(){return me("GET","/api/health")}function Yn(s){const t=new EventSource("/api/events");return s.onRepoChanged&&t.addEventListener("repo-changed",n=>{var e;return(e=s.onRepoChanged)==null?void 0:e.call(s,JSON.parse(n.data))}),s.onLog&&t.addEventListener("log",()=>{var n;return(n=s.onLog)==null?void 0:n.call(s)}),s.onError&&(t.onerror=n=>{var e;return(e=s.onError)==null?void 0:e.call(s,n)}),()=>t.close()}const ft="git-cockpit:currentRepoId";function At(){try{const s=Number(window.localStorage.getItem(ft));return Number.isInteger(s)&&s>0?s:null}catch{return null}}function lt(s){try{s===null?window.localStorage.removeItem(ft):window.localStorage.setItem(ft,String(s))}catch{}}const Ye=ht("repos",{state:()=>({repos:[],currentId:At(),loading:!1,error:null,healthOk:null}),getters:{current(s){return s.repos.find(t=>t.id===s.currentId)??null},currentPath(s){var t;return((t=s.repos.find(n=>n.id===s.currentId))==null?void 0:t.path)??null}},actions:{async checkHealth(){try{const s=await Jn();this.healthOk=s.ok}catch{this.healthOk=!1}return this.healthOk===!0},async load(){var s;this.loading=!0,this.error=null;try{const{repos:t}=await Rn();this.repos=t;const n=At();n!==null&&t.some(e=>e.id===n)?this.currentId=n:(!this.currentId||!t.some(e=>e.id===this.currentId))&&(this.currentId=((s=t[0])==null?void 0:s.id)??null),lt(this.currentId)}catch(t){this.error=t instanceof Error?t.message:String(t)}finally{this.loading=!1}},async open(s){const{repo:t}=await Mn(s);return await this.load(),t},async activate(s){const{repo:t}=await zn(s);return this.currentId=s,lt(s),await this.load(),t},async remove(s){await Hn(s),this.currentId===s&&(this.currentId=null),await this.load()},switchTo(s){this.currentId=s,lt(s)}}}),Kt=ht("settings",{state:()=>({permissions:null,tools:[],loading:!1,saving:!1,error:null}),actions:{async load(){this.loading=!0,this.error=null;try{const s=await Kn();this.permissions=s.permissions,this.tools=s.tools}catch(s){this.error=s instanceof Error?s.message:String(s)}finally{this.loading=!1}},async save(s){if(this.permissions){this.saving=!0,this.error=null;try{await Xn(s),this.permissions={...this.permissions,...s}}catch(t){throw this.error=t instanceof Error?t.message:String(t),t}finally{this.saving=!1}}}}}),Xt=q(0),Qn=()=>{Xt.value+=1};function Qe(){return{revision:Xt,bump:Qn}}const Zn={class:"repo-box"},es=["title"],ts={class:"menu-icon"},ns={class:"aside-footer"},ss=Le({__name:"App",setup(s){const t=Ye(),n=Kt(),e=Ln(),l=mt(),{bump:f}=Qe(),r=[{path:"/status",label:"状态",icon:"◧"},{path:"/history",label:"历史",icon:"◫"},{path:"/repos",label:"仓库管理",icon:"▤"},{path:"/logs",label:"操作日志",icon:"≡"},{path:"/settings",label:"设置",icon:"⚙"}],h=Q(()=>{if(!t.currentId)return"未选择仓库";const o=t.repos.find(c=>c.id===t.currentId);return(o==null?void 0:o.path)??"未选择仓库"});let y=null;return Fe(async()=>{await t.checkHealth(),await Promise.all([t.load(),n.load().catch(()=>{})]),y=Yn({onRepoChanged:()=>f(),onLog:()=>f(),onError:()=>{}})}),$n(()=>{y==null||y()}),(o,c)=>{const k=O("el-menu-item"),b=O("el-menu"),a=O("el-tag"),u=O("el-aside"),_=O("router-view"),v=O("el-main"),N=O("el-container");return w(),W(N,{class:"app-shell"},{default:d(()=>[p(u,{width:"220px",class:"app-aside"},{default:d(()=>[c[4]||(c[4]=T("div",{class:"brand"},[T("span",{class:"brand-mark"},"⌘"),T("span",{class:"brand-name"},"Git Cockpit")],-1)),T("div",Zn,[c[0]||(c[0]=T("div",{class:"repo-box-label"},"当前仓库",-1)),T("div",{class:"repo-box-path mono",title:h.value},P(h.value),9,es)]),p(b,{"default-active":X(e).path,class:"nav-menu"},{default:d(()=>[(w(),A(se,null,be(r,L=>p(k,{key:L.path,index:L.path,onClick:E=>X(l).push(L.path)},{default:d(()=>[T("span",ts,P(L.icon),1),T("span",null,P(L.label),1)]),_:2},1032,["index","onClick"])),64))]),_:1},8,["default-active"]),T("div",ns,[X(t).healthOk?(w(),W(a,{key:0,size:"small",type:"success"},{default:d(()=>[...c[1]||(c[1]=[I("后端已连接",-1)])]),_:1})):X(t).healthOk===!1?(w(),W(a,{key:1,size:"small",type:"danger"},{default:d(()=>[...c[2]||(c[2]=[I("后端离线",-1)])]),_:1})):(w(),W(a,{key:2,size:"small",type:"info"},{default:d(()=>[...c[3]||(c[3]=[I("连接中…",-1)])]),_:1}))])]),_:1}),p(N,{class:"app-main"},{default:d(()=>[p(v,{class:"main-content"},{default:d(()=>[p(_,null,{default:d(({Component:L})=>[(w(),W(Dn(L)))]),_:1})]),_:1})]),_:1})]),_:1})}}}),De=(s,t)=>{const n=s.__vccOpts||s;for(const[e,l]of t)n[e]=l;return n},ls=De(ss,[["__scopeId","data-v-17b27ba6"]]),as={class:"page"},is={class:"open-row"},os={class:"list-header"},rs={key:1,class:"tree-scroll"},ds=["title"],cs=["title","onDblclick"],us={class:"node-name mono"},fs={class:"node-time"},ps={class:"node-actions"},hs=Le({__name:"ReposView",setup(s){const t=Ye(),n=mt(),e=q(""),l=q(!1),f=Q(()=>{const b=[],a=new Map;t.repos.forEach((_,v)=>a.set(_.id,v));for(const _ of t.repos){const v=_.path.split(/[\\/]+/).filter(E=>E.length>0);if(v.length===0)continue;let N=b,L="";for(const[E,$]of v.entries()){L=L?`${L}/${$}`:$;const H=E===v.length-1,M=N.find(F=>!F.repo&&F.label===$);if(H)N.push({key:"repo:"+_.path,label:$,fullPath:_.path,repo:_});else{const F=M??{key:"dir:"+L,label:$,fullPath:L};M||N.push(F),F.children??(F.children=[]),N=F.children}}}const u=_=>{_.sort((v,N)=>{const L=v.repo?1:0,E=N.repo?1:0;return L!==E?L-E:L===1?(a.get(v.repo.id)??0)-(a.get(N.repo.id)??0):v.label.localeCompare(N.label)});for(const v of _)v.children&&u(v.children)};return u(b),b}),r=Q(()=>{const b=t.current;if(b){const u=b.path.split(/[\\/]+/).filter(N=>N.length>0),_=[];let v="";for(let N=0;N<u.length-1;N++)v=v?`${v}/${u[N]}`:u[N],_.push("dir:"+v);if(_.length>0)return _}const a=f.value[0];return a&&!a.repo?[a.key]:[]});async function h(){const b=e.value.trim();if(!b){ne.warning("请输入仓库路径");return}l.value=!0;try{const a=await t.open(b);ne.success(`已打开 ${a.path}`),t.switchTo(a.id),await n.push("/status")}catch(a){ne.error(a instanceof Error?a.message:String(a))}finally{l.value=!1}}async function y(b,a){try{await bt.confirm(`确定从列表移除 ${a}?注意:不会删除磁盘上的仓库文件。`,"移除仓库",{type:"warning",confirmButtonText:"移除",cancelButtonText:"取消"})}catch{return}try{await t.remove(b),ne.success("已移除")}catch(u){ne.error(u instanceof Error?u.message:String(u))}}async function o(b){try{await t.activate(b)}catch{t.switchTo(b)}n.push("/status")}function c(b){const a=new Date(b);return Number.isNaN(a.getTime())?b:a.toLocaleString()}function k(b){b.repo&&o(b.repo.id)}return Fe(()=>t.load()),(b,a)=>{const u=O("el-input"),_=O("el-button"),v=O("el-card"),N=O("el-empty"),L=O("el-tree");return w(),A("div",as,[a[7]||(a[7]=T("h2",{class:"page-title"},"仓库管理",-1)),p(v,{class:"open-card",shadow:"never"},{header:d(()=>[...a[2]||(a[2]=[I("打开本地仓库",-1)])]),default:d(()=>[T("div",is,[p(u,{modelValue:e.value,"onUpdate:modelValue":a[0]||(a[0]=E=>e.value=E),placeholder:"输入本地 Git 仓库路径,例如 D:\\project\\repo 或 /Users/me/code/app",clearable:"",onKeyup:gt(h,["enter"])},null,8,["modelValue"]),p(_,{type:"primary",loading:l.value,onClick:h},{default:d(()=>[...a[3]||(a[3]=[I("打开",-1)])]),_:1},8,["loading"])])]),_:1}),p(v,{shadow:"never",class:"list-card"},{header:d(()=>[T("div",os,[T("span",null,"最近打开的仓库("+P(X(t).repos.length)+")",1),p(_,{text:"",type:"primary",loading:X(t).loading,onClick:a[1]||(a[1]=E=>X(t).load())},{default:d(()=>[...a[4]||(a[4]=[I("刷新",-1)])]),_:1},8,["loading"])])]),default:d(()=>[!X(t).loading&&X(t).repos.length===0?(w(),W(N,{key:0,description:"尚未打开任何仓库"})):(w(),A("div",rs,[p(L,{data:f.value,props:{label:"label",children:"children"},"node-key":"key",accordion:"","default-expanded-keys":r.value,indent:14,class:"repo-tree"},{default:d(({data:E})=>[E.repo?(w(),A("div",{key:1,class:Ue(["repo-node",{current:E.repo.id===X(t).currentId}]),title:E.repo.path,onDblclick:$=>k(E)},[T("span",us,P(E.label),1),T("span",fs,P(c(E.repo.lastOpenedAt)),1),T("span",ps,[p(_,{size:"small",text:"",type:"primary",onClick:Oe($=>k(E),["stop"])},{default:d(()=>[...a[5]||(a[5]=[I("进入",-1)])]),_:1},8,["onClick"]),p(_,{size:"small",text:"",type:"danger",onClick:Oe($=>y(E.repo.id,E.repo.path),["stop"])},{default:d(()=>[...a[6]||(a[6]=[I("移除",-1)])]),_:1},8,["onClick"])])],42,cs)):(w(),A("span",{key:0,class:"tree-dir",title:E.fullPath},P(E.label),9,ds))]),_:1},8,["data","default-expanded-keys"])]))]),_:1})])}}}),ms=De(hs,[["__scopeId","data-v-9d40cd16"]]);function gs(s){const t=mt(),n=q(!1),e=q(null),l=q(!1),f=Q(()=>s()!==null);async function r(k,b={}){const a=s();if(a===null)return ne.warning("请先选择仓库"),!1;try{const u=await ut(a,k,{...b,dryRun:!0});return u.success?(e.value={tool:k,params:b,preview:u.preview??u.result},n.value=!0,!0):(o(u),!1)}catch(u){return c(u),!1}}async function h(){const k=s(),b=e.value;if(k===null||!b)return null;l.value=!0,n.value=!1;try{const a=await ut(k,b.tool,b.params);return a.success?(a.backupCreated?ne.success(`${b.tool} 执行成功(已自动备份:${a.backupCreated.branch??"分支"}${a.backupCreated.stashRef?` / ${a.backupCreated.stashRef}`:""})`):ne.success(`${b.tool} 执行成功`),a):(o(a),a)}catch(a){return c(a),null}finally{l.value=!1,e.value=null}}function y(){n.value=!1,e.value=null}function o(k){var b,a,u;if(((b=k.error)==null?void 0:b.code)==="PERMISSION_DENIED"){k.error.requiredApproval?bt.confirm(`操作 ${k.tool} 属于高风险操作,当前默认禁用,需要在设置中开启后才能执行。是否前往设置?`,"需要审批",{confirmButtonText:"去开启",cancelButtonText:"取消",type:"warning"}).then(()=>t.push("/settings")).catch(()=>{}):ne.error(((a=k.error)==null?void 0:a.message)??"操作被拒绝");return}ne.error(((u=k.error)==null?void 0:u.message)??"操作失败")}function c(k){const b=k instanceof Error?k.message:String(k);ne.error(b)}return{confirmVisible:n,pending:e,executing:l,canRun:f,previewAndConfirm:r,executeConfirmed:h,cancel:y}}const bs={key:2,class:"cmd-box"},vs={class:"cmd-pre mono"},ys={key:3,class:"files-box"},_s={class:"cmd-label"},ws={key:4,class:"note-text"},ks={class:"risk-tag"},Cs=Le({__name:"ConfirmDialog",props:{visible:{type:Boolean},tool:{},preview:{default:null},note:{default:""}},emits:["update:visible","confirm","cancel"],setup(s,{emit:t}){const n=s,e=t,l=Q(()=>{const c=n.preview;return c&&"command"in c&&typeof c.command=="string"?c.command:""}),f=Q(()=>{const c=n.preview;return c&&"risk"in c&&typeof c.risk=="string"?c.risk:"write"}),r=Q(()=>{const c=n.preview;return c&&"affectedFiles"in c&&Array.isArray(c.affectedFiles)?c.affectedFiles:[]}),h=Q(()=>f.value==="dangerous"?{type:"danger",label:"高风险"}:f.value==="write"?{type:"warning",label:"写操作"}:{type:"info",label:"只读"});function y(){e("confirm")}function o(){e("cancel"),e("update:visible",!1),ne.info("操作已取消")}return(c,k)=>{const b=O("el-alert"),a=O("el-scrollbar"),u=O("el-tag"),_=O("el-button"),v=O("el-dialog");return w(),W(v,{"model-value":s.visible,title:`执行操作:${s.tool}`,width:"560px","close-on-click-modal":!1,onClosed:k[0]||(k[0]=N=>e("update:visible",!1))},{footer:d(()=>[T("span",ks,[p(u,{type:h.value.type,size:"small",effect:"dark"},{default:d(()=>[I(P(h.value.label),1)]),_:1},8,["type"])]),p(_,{onClick:o},{default:d(()=>[...k[4]||(k[4]=[I("取消",-1)])]),_:1}),p(_,{type:"primary",danger:f.value==="dangerous",onClick:y},{default:d(()=>[...k[5]||(k[5]=[I("确认执行",-1)])]),_:1},8,["danger"])]),default:d(()=>[f.value==="dangerous"?(w(),W(b,{key:0,type:"error",closable:!1,"show-icon":"",class:"risk-alert"},{title:d(()=>[...k[1]||(k[1]=[I("这是",-1),T("b",null,"高风险",-1),I("操作,将自动创建备份(临时分支 + stash)",-1)])]),_:1})):f.value==="write"?(w(),W(b,{key:1,type:"warning",closable:!1,"show-icon":"",class:"risk-alert"},{title:d(()=>[...k[2]||(k[2]=[I("写操作:执行后将修改仓库状态",-1)])]),_:1})):J("",!0),l.value?(w(),A("div",bs,[k[3]||(k[3]=T("div",{class:"cmd-label"},"将执行的命令(dry-run 预览,未实际执行)",-1)),T("pre",vs,P(l.value),1)])):J("",!0),r.value.length?(w(),A("div",ys,[T("div",_s,"涉及文件("+P(r.value.length)+")",1),p(a,{"max-height":"140px"},{default:d(()=>[(w(!0),A(se,null,be(r.value,N=>(w(),A("div",{key:N,class:"file-item mono"},P(N),1))),128))]),_:1})])):J("",!0),s.note?(w(),A("div",ws,P(s.note),1)):J("",!0)]),_:1},8,["model-value","title"])}}}),xs=De(Cs,[["__scopeId","data-v-5d42c09b"]]);var ie;(function(s){s.INSERT="insert",s.DELETE="delete",s.CONTEXT="context"})(ie||(ie={}));const Ts={LINE_BY_LINE:"line-by-line"},Ss={NONE:"none"},Ns={WORD:"word"};var Pe;(function(s){s.AUTO="auto",s.DARK="dark",s.LIGHT="light"})(Pe||(Pe={}));const Es=["-","[","]","/","{","}","(",")","*","+","?",".","\\","^","$","|"],$s=RegExp("["+Es.join("\\")+"]","g");function Ls(s){return s.replace($s,"\\$&")}function Ft(s){return s&&s.replace(/\\/g,"/")}function Ds(s){let t,n,e,l=0;for(t=0,e=s.length;t<e;t++)n=s.charCodeAt(t),l=(l<<5)-l+n,l|=0;return l}function Jt(s){const t=s.length;let n=-1/0;for(let e=0;e<t;e++)n=Math.max(n,s[e]);return n}function Rt(s,t){const n=s.split(".");return n.length>1?n[n.length-1]:t}function Mt(s,t){return t.reduce((n,e)=>n||s.startsWith(e),!1)}const zt=["a/","b/","i/","w/","c/","o/"];function $e(s,t,n){const e=n!==void 0?[...zt,n]:zt,l=t?new RegExp(`^${Ls(t)} "?(.+?)"?$`):new RegExp('^"?(.+?)"?$'),[,f=""]=l.exec(s)||[],r=e.find(y=>f.indexOf(y)===0);return(r?f.slice(r.length):f).replace(/\s+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(?:\.\d+)? [+-]\d{4}.*$/,"")}function Is(s,t){return $e(s,"---",t)}function Vs(s,t){return $e(s,"+++",t)}function Ps(s,t={}){const n=[];let e=null,l=null,f=null,r=null,h=null,y=null,o=null;const c="--- ",k="+++ ",b="@@",a=/^old mode (\d{6})/,u=/^new mode (\d{6})/,_=/^deleted file mode (\d{6})/,v=/^new file mode (\d{6})/,N=/^copy from "?(.+)"?/,L=/^copy to "?(.+)"?/,E=/^rename from "?(.+)"?/,$=/^rename to "?(.+)"?/,H=/^similarity index (\d+)%/,M=/^dissimilarity index (\d+)%/,F=/^index ([\da-z]+)\.\.([\da-z]+)\s*(\d{6})?/,m=/^Binary files (.*) and (.*) differ/,x=/^GIT binary patch/,S=/^index ([\da-z]+),([\da-z]+)\.\.([\da-z]+)/,z=/^mode (\d{6}),(\d{6})\.\.(\d{6})/,ee=/^new file mode (\d{6})/,ce=/^deleted file mode (\d{6}),(\d{6})/,re=s.replace(/\/g,"").replace(/\r\n?/g,`
2
- `).split(`
3
- `);function K(){l!==null&&e!==null&&(e.blocks.push(l),l=null)}function ue(){e!==null&&(!e.oldName&&y!==null&&(e.oldName=y),!e.newName&&o!==null&&(e.newName=o),e.newName&&(n.push(e),e=null)),y=null,o=null}function de(){K(),ue(),e={blocks:[],deletedLines:0,addedLines:0}}function fe(D){K();let j;e!==null&&((j=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@.*/.exec(D))?(e.isCombined=!1,f=parseInt(j[1],10),h=parseInt(j[2],10)):(j=/^@@@ -(\d+)(?:,\d+)? -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@@.*/.exec(D))?(e.isCombined=!0,f=parseInt(j[1],10),r=parseInt(j[2],10),h=parseInt(j[3],10)):(D.startsWith(b)&&console.error("Failed to parse lines, starting in 0!"),f=0,h=0,e.isCombined=!1)),l={lines:[],oldStartLine:f,oldStartLine2:r,newStartLine:h,header:D}}function te(D){if(e===null||l===null||f===null||h===null)return;const j={content:D},C=e.isCombined?["+ "," +","++"]:["+"],Z=e.isCombined?["- "," -","--"]:["-"];Mt(D,C)?(e.addedLines++,j.type=ie.INSERT,j.oldNumber=void 0,j.newNumber=h++):Mt(D,Z)?(e.deletedLines++,j.type=ie.DELETE,j.oldNumber=f++,j.newNumber=void 0):(j.type=ie.CONTEXT,j.oldNumber=f++,j.newNumber=h++),l.lines.push(j)}function ve(D,j){let C=j;for(;C<re.length-3;){if(D.startsWith("diff"))return!1;if(re[C].startsWith(c)&&re[C+1].startsWith(k)&&re[C+2].startsWith(b))return!0;C++}return!1}return re.forEach((D,j)=>{if(!D||D.startsWith("*"))return;let C;const Z=re[j-1],Ne=re[j+1],Re=re[j+2];if(D.startsWith("diff --git")||D.startsWith("diff --combined")){if(de(),(C=/^diff --git "?([a-ciow]\/.+)"? "?([a-ciow]\/.+)"?/.exec(D))&&(y=$e(C[1],void 0,t.dstPrefix),o=$e(C[2],void 0,t.srcPrefix)),e===null)throw new Error("Where is my file !!!");e.isGitDiff=!0;return}if(D.startsWith("Binary files")&&!(e!=null&&e.isGitDiff)){if(de(),(C=/^Binary files "?([a-ciow]\/.+)"? and "?([a-ciow]\/.+)"? differ/.exec(D))&&(y=$e(C[1],void 0,t.dstPrefix),o=$e(C[2],void 0,t.srcPrefix)),e===null)throw new Error("Where is my file !!!");e.isBinary=!0;return}if((!e||!e.isGitDiff&&e&&D.startsWith(c)&&Ne.startsWith(k)&&Re.startsWith(b))&&de(),e!=null&&e.isTooBig)return;if(e&&(typeof t.diffMaxChanges=="number"&&e.addedLines+e.deletedLines>t.diffMaxChanges||typeof t.diffMaxLineLength=="number"&&D.length>t.diffMaxLineLength)){e.isTooBig=!0,e.addedLines=0,e.deletedLines=0,e.blocks=[],l=null;const Ee=typeof t.diffTooBigMessage=="function"?t.diffTooBigMessage(n.length):"Diff too big to be displayed";fe(Ee);return}if(D.startsWith(c)&&Ne.startsWith(k)||D.startsWith(k)&&Z.startsWith(c)){if(e&&!e.oldName&&D.startsWith("--- ")&&(C=Is(D,t.srcPrefix))){e.oldName=C,e.language=Rt(e.oldName,e.language);return}if(e&&!e.newName&&D.startsWith("+++ ")&&(C=Vs(D,t.dstPrefix))){e.newName=C,e.language=Rt(e.newName,e.language);return}}if(e&&(D.startsWith(b)||e.isGitDiff&&e.oldName&&e.newName&&!l)){fe(D);return}if(l&&(D.startsWith("+")||D.startsWith("-")||D.startsWith(" "))){te(D);return}const ke=!ve(D,j);if(e===null)throw new Error("Where is my file !!!");(C=a.exec(D))?e.oldMode=C[1]:(C=u.exec(D))?e.newMode=C[1]:(C=_.exec(D))?(e.deletedFileMode=C[1],e.isDeleted=!0):(C=v.exec(D))?(e.newFileMode=C[1],e.isNew=!0):(C=N.exec(D))?(ke&&(e.oldName=C[1]),e.isCopy=!0):(C=L.exec(D))?(ke&&(e.newName=C[1]),e.isCopy=!0):(C=E.exec(D))?(ke&&(e.oldName=C[1]),e.isRename=!0):(C=$.exec(D))?(ke&&(e.newName=C[1]),e.isRename=!0):(C=m.exec(D))?(e.isBinary=!0,e.oldName=$e(C[1],void 0,t.srcPrefix),e.newName=$e(C[2],void 0,t.dstPrefix),fe("Binary file")):x.test(D)?(e.isBinary=!0,fe(D)):(C=H.exec(D))?e.unchangedPercentage=parseInt(C[1],10):(C=M.exec(D))?e.changedPercentage=parseInt(C[1],10):(C=F.exec(D))?(e.checksumBefore=C[1],e.checksumAfter=C[2],C[3]&&(e.mode=C[3])):(C=S.exec(D))?(e.checksumBefore=[C[2],C[3]],e.checksumAfter=C[1]):(C=z.exec(D))?(e.oldMode=[C[2],C[3]],e.newMode=C[1]):(C=ee.exec(D))?(e.newFileMode=C[1],e.isNew=!0):(C=ce.exec(D))&&(e.deletedFileMode=C[1],e.isDeleted=!0)}),K(),ue(),n}class Yt{diff(t,n,e={}){let l;typeof e=="function"?(l=e,e={}):"callback"in e&&(l=e.callback);const f=this.castInput(t,e),r=this.castInput(n,e),h=this.removeEmpty(this.tokenize(f,e)),y=this.removeEmpty(this.tokenize(r,e));return this.diffWithOptionsObj(h,y,e,l)}diffWithOptionsObj(t,n,e,l){var f;const r=L=>{if(L=this.postProcess(L,e),l){setTimeout(function(){l(L)},0);return}else return L},h=n.length,y=t.length;let o=1,c=h+y;e.maxEditLength!=null&&(c=Math.min(c,e.maxEditLength));const k=(f=e.timeout)!==null&&f!==void 0?f:1/0,b=Date.now()+k,a=[{oldPos:-1,lastComponent:void 0}];let u=this.extractCommon(a[0],n,t,0,e);if(a[0].oldPos+1>=y&&u+1>=h)return r(this.buildValues(a[0].lastComponent,n,t));let _=-1/0,v=1/0;const N=()=>{for(let L=Math.max(_,-o);L<=Math.min(v,o);L+=2){let E;const $=a[L-1],H=a[L+1];$&&(a[L-1]=void 0);let M=!1;if(H){const m=H.oldPos-L;M=H&&0<=m&&m<h}const F=$&&$.oldPos+1<y;if(!M&&!F){a[L]=void 0;continue}if(!F||M&&$.oldPos<H.oldPos?E=this.addToPath(H,!0,!1,0,e):E=this.addToPath($,!1,!0,1,e),u=this.extractCommon(E,n,t,L,e),E.oldPos+1>=y&&u+1>=h)return r(this.buildValues(E.lastComponent,n,t))||!0;a[L]=E,E.oldPos+1>=y&&(v=Math.min(v,L-1)),u+1>=h&&(_=Math.max(_,L+1))}o++};if(l)(function L(){setTimeout(function(){if(o>c||Date.now()>b)return l(void 0);N()||L()},0)})();else for(;o<=c&&Date.now()<=b;){const L=N();if(L)return L}}addToPath(t,n,e,l,f){const r=t.lastComponent;return r&&!f.oneChangePerToken&&r.added===n&&r.removed===e?{oldPos:t.oldPos+l,lastComponent:{count:r.count+1,added:n,removed:e,previousComponent:r.previousComponent}}:{oldPos:t.oldPos+l,lastComponent:{count:1,added:n,removed:e,previousComponent:r}}}extractCommon(t,n,e,l,f){const r=n.length,h=e.length;let y=t.oldPos,o=y-l,c=0;for(;o+1<r&&y+1<h&&this.equals(e[y+1],n[o+1],f);)o++,y++,c++,f.oneChangePerToken&&(t.lastComponent={count:1,previousComponent:t.lastComponent,added:!1,removed:!1});return c&&!f.oneChangePerToken&&(t.lastComponent={count:c,previousComponent:t.lastComponent,added:!1,removed:!1}),t.oldPos=y,o}equals(t,n,e){return e.comparator?e.comparator(t,n):t===n||!!e.ignoreCase&&t.toLowerCase()===n.toLowerCase()}removeEmpty(t){const n=[];for(let e=0;e<t.length;e++)t[e]&&n.push(t[e]);return n}castInput(t,n){return t}tokenize(t,n){return Array.from(t)}join(t){return t.join("")}postProcess(t,n){return t}get useLongestToken(){return!1}buildValues(t,n,e){const l=[];let f;for(;t;)l.push(t),f=t.previousComponent,delete t.previousComponent,t=f;l.reverse();const r=l.length;let h=0,y=0,o=0;for(;h<r;h++){const c=l[h];if(c.removed)c.value=this.join(e.slice(o,o+c.count)),o+=c.count;else{if(!c.added&&this.useLongestToken){let k=n.slice(y,y+c.count);k=k.map(function(b,a){const u=e[o+a];return u.length>b.length?u:b}),c.value=this.join(k)}else c.value=this.join(n.slice(y,y+c.count));y+=c.count,c.added||(o+=c.count)}}return l}}class Os extends Yt{}const As=new Os;function Fs(s,t,n){return As.diff(s,t,n)}const Ht="a-zA-Z0-9_\\u{AD}\\u{C0}-\\u{D6}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}";class Rs extends Yt{tokenize(t){const n=new RegExp(`(\\r?\\n)|[${Ht}]+|[^\\S\\n\\r]+|[^${Ht}]`,"ug");return t.match(n)||[]}}const Ms=new Rs;function zs(s,t,n){return Ms.diff(s,t,n)}function Hs(s,t){if(s.length===0)return t.length;if(t.length===0)return s.length;const n=[];let e;for(e=0;e<=t.length;e++)n[e]=[e];let l;for(l=0;l<=s.length;l++)n[0][l]=l;for(e=1;e<=t.length;e++)for(l=1;l<=s.length;l++)t.charAt(e-1)===s.charAt(l-1)?n[e][l]=n[e-1][l-1]:n[e][l]=Math.min(n[e-1][l-1]+1,Math.min(n[e][l-1]+1,n[e-1][l]+1));return n[t.length][s.length]}function vt(s){return(t,n)=>{const e=s(t).trim(),l=s(n).trim();return Hs(e,l)/(e.length+l.length)}}function yt(s){function t(e,l,f=new Map){let r=1/0,h;for(let y=0;y<e.length;++y)for(let o=0;o<l.length;++o){const c=JSON.stringify([e[y],l[o]]);let k;f.has(c)&&(k=f.get(c))||(k=s(e[y],l[o]),f.set(c,k)),k<r&&(r=k,h={indexA:y,indexB:o,score:r})}return h}function n(e,l,f=0,r=new Map){const h=t(e,l,r);if(!h||e.length+l.length<3)return[[e,l]];const y=e.slice(0,h.indexA),o=l.slice(0,h.indexB),c=[e[h.indexA]],k=[l[h.indexB]],b=h.indexA+1,a=h.indexB+1,u=e.slice(b),_=l.slice(a),v=n(y,o,f+1,r),N=n(c,k,f+1,r),L=n(u,_,f+1,r);let E=N;return(h.indexA>0||h.indexB>0)&&(E=v.concat(E)),(e.length>b||l.length>a)&&(E=E.concat(L)),E}return n}const he={INSERTS:"d2h-ins",DELETES:"d2h-del",CONTEXT:"d2h-cntx",INFO:"d2h-info",INSERT_CHANGES:"d2h-ins d2h-change",DELETE_CHANGES:"d2h-del d2h-change"},Ze={matching:Ss.NONE,matchWordsThreshold:.25,maxLineLengthHighlight:1e4,diffStyle:Ns.WORD,colorScheme:Pe.LIGHT},Ce="/",Qt=vt(s=>s.value),Bs=yt(Qt);function at(s){return s.indexOf("dev/null")!==-1}function Us(s){return s.replace(/(<ins[^>]*>((.|\n)*?)<\/ins>)/g,"")}function Ws(s){return s.replace(/(<del[^>]*>((.|\n)*?)<\/del>)/g,"")}function Ke(s){switch(s){case ie.CONTEXT:return he.CONTEXT;case ie.INSERT:return he.INSERTS;case ie.DELETE:return he.DELETES}}function _t(s){switch(s){case Pe.DARK:return"d2h-dark-color-scheme";case Pe.AUTO:return"d2h-auto-color-scheme";case Pe.LIGHT:default:return"d2h-light-color-scheme"}}function js(s){return s?2:1}function Ae(s){return s.slice(0).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")}function xe(s,t,n=!0){const e=js(t);return{prefix:s.substring(0,e),content:n?Ae(s.substring(e)):s.substring(e)}}function et(s){const t=Ft(s.oldName),n=Ft(s.newName);if(t!==n&&!at(t)&&!at(n)){const e=[],l=[],f=t.split(Ce),r=n.split(Ce),h=f.length,y=r.length;let o=0,c=h-1,k=y-1;for(;o<c&&o<k&&f[o]===r[o];)e.push(r[o]),o+=1;for(;c>o&&k>o&&f[c]===r[k];)l.unshift(r[k]),c-=1,k-=1;const b=e.join(Ce),a=l.join(Ce),u=f.slice(o,c+1).join(Ce),_=r.slice(o,k+1).join(Ce);return b.length&&a.length?b+Ce+"{"+u+" → "+_+"}"+Ce+a:b.length?b+Ce+"{"+u+" → "+_+"}":a.length?"{"+u+" → "+_+"}"+Ce+a:t+" → "+n}else return at(n)?t:n}function wt(s){return`d2h-${Ds(et(s)).toString().slice(-6)}`}function kt(s){let t="file-changed";return s.isRename||s.isCopy?t="file-renamed":s.isNew?t="file-added":s.isDeleted?t="file-deleted":s.newName!==s.oldName&&(t="file-renamed"),t}function Zt(s,t,n,e={}){const{matching:l,maxLineLengthHighlight:f,matchWordsThreshold:r,diffStyle:h}=Object.assign(Object.assign({},Ze),e),y=xe(s,n,!1),o=xe(t,n,!1);if(y.content.length>f||o.content.length>f)return{oldLine:{prefix:y.prefix,content:Ae(y.content)},newLine:{prefix:o.prefix,content:Ae(o.content)}};const c=h==="char"?Fs(y.content,o.content):zs(y.content,o.content),k=[];if(h==="word"&&l==="words"){const a=c.filter(v=>v.removed),u=c.filter(v=>v.added);Bs(u,a).forEach(v=>{v[0].length===1&&v[1].length===1&&Qt(v[0][0],v[1][0])<r&&(k.push(v[0][0]),k.push(v[1][0]))})}const b=c.reduce((a,u)=>{const _=u.added?"ins":u.removed?"del":null,v=k.indexOf(u)>-1?' class="d2h-change"':"",N=Ae(u.value);return _!==null?`${a}<${_}${v}>${N}</${_}>`:`${a}${N}`},"");return{oldLine:{prefix:y.prefix,content:Us(b)},newLine:{prefix:o.prefix,content:Ws(b)}}}const Bt="file-summary",Gs="icon",qs={colorScheme:Ze.colorScheme};class Ks{constructor(t,n={}){this.hoganUtils=t,this.config=Object.assign(Object.assign({},qs),n)}render(t){const n=t.map(e=>this.hoganUtils.render(Bt,"line",{fileHtmlId:wt(e),oldName:e.oldName,newName:e.newName,fileName:et(e),deletedLines:"-"+e.deletedLines,addedLines:"+"+e.addedLines},{fileIcon:this.hoganUtils.template(Gs,kt(e))})).join(`
4
- `);return this.hoganUtils.render(Bt,"wrapper",{colorScheme:_t(this.config.colorScheme),filesNumber:t.length,files:n})}}const en=Object.assign(Object.assign({},Ze),{renderNothingWhenEmpty:!1,matchingMaxComparisons:2500,maxLineSizeInBlockForComparison:200}),He="generic",Ut="line-by-line",Xs="icon",Js="tag";class Ys{constructor(t,n={}){this.hoganUtils=t,this.config=Object.assign(Object.assign({},en),n)}render(t){const n=t.map(e=>{let l;return e.blocks.length?l=this.generateFileHtml(e):l=this.generateEmptyDiff(),this.makeFileDiffHtml(e,l)}).join(`
5
- `);return this.hoganUtils.render(He,"wrapper",{colorScheme:_t(this.config.colorScheme),content:n})}makeFileDiffHtml(t,n){if(this.config.renderNothingWhenEmpty&&Array.isArray(t.blocks)&&t.blocks.length===0)return"";const e=this.hoganUtils.template(Ut,"file-diff"),l=this.hoganUtils.template(He,"file-path"),f=this.hoganUtils.template(Xs,"file"),r=this.hoganUtils.template(Js,kt(t));return e.render({file:t,fileHtmlId:wt(t),diffs:n,filePath:l.render({fileDiffName:et(t)},{fileIcon:f,fileTag:r})})}generateEmptyDiff(){return this.hoganUtils.render(He,"empty-diff",{contentClass:"d2h-code-line",CSSLineClass:he})}generateFileHtml(t){const n=yt(vt(e=>xe(e.content,t.isCombined).content));return t.blocks.map(e=>{let l=this.hoganUtils.render(He,"block-header",{CSSLineClass:he,blockHeader:t.isTooBig?e.header:Ae(e.header),lineClass:"d2h-code-linenumber",contentClass:"d2h-code-line"});return this.applyLineGroupping(e).forEach(([f,r,h])=>{if(r.length&&h.length&&!f.length)this.applyRematchMatching(r,h,n).map(([y,o])=>{const{left:c,right:k}=this.processChangedLines(t,t.isCombined,y,o);l+=c,l+=k});else if(f.length)f.forEach(y=>{const{prefix:o,content:c}=xe(y.content,t.isCombined);l+=this.generateSingleLineHtml(t,{type:he.CONTEXT,prefix:o,content:c,oldNumber:y.oldNumber,newNumber:y.newNumber})});else if(r.length||h.length){const{left:y,right:o}=this.processChangedLines(t,t.isCombined,r,h);l+=y,l+=o}else console.error("Unknown state reached while processing groups of lines",f,r,h)}),l}).join(`
6
- `)}applyLineGroupping(t){const n=[];let e=[],l=[];for(let f=0;f<t.lines.length;f++){const r=t.lines[f];(r.type!==ie.INSERT&&l.length||r.type===ie.CONTEXT&&e.length>0)&&(n.push([[],e,l]),e=[],l=[]),r.type===ie.CONTEXT?n.push([[r],[],[]]):r.type===ie.INSERT&&e.length===0?n.push([[],[],[r]]):r.type===ie.INSERT&&e.length>0?l.push(r):r.type===ie.DELETE&&e.push(r)}return(e.length||l.length)&&(n.push([[],e,l]),e=[],l=[]),n}applyRematchMatching(t,n,e){const l=t.length*n.length,f=Jt(t.concat(n).map(h=>h.content.length));return l<this.config.matchingMaxComparisons&&f<this.config.maxLineSizeInBlockForComparison&&(this.config.matching==="lines"||this.config.matching==="words")?e(t,n):[[t,n]]}processChangedLines(t,n,e,l){const f={right:"",left:""},r=Math.max(e.length,l.length);for(let h=0;h<r;h++){const y=e[h],o=l[h],c=y!==void 0&&o!==void 0?Zt(y.content,o.content,n,this.config):void 0,k=y!==void 0&&y.oldNumber!==void 0?Object.assign(Object.assign({},c!==void 0?{prefix:c.oldLine.prefix,content:c.oldLine.content,type:he.DELETE_CHANGES}:Object.assign(Object.assign({},xe(y.content,n)),{type:Ke(y.type)})),{oldNumber:y.oldNumber,newNumber:y.newNumber}):void 0,b=o!==void 0&&o.newNumber!==void 0?Object.assign(Object.assign({},c!==void 0?{prefix:c.newLine.prefix,content:c.newLine.content,type:he.INSERT_CHANGES}:Object.assign(Object.assign({},xe(o.content,n)),{type:Ke(o.type)})),{oldNumber:o.oldNumber,newNumber:o.newNumber}):void 0,{left:a,right:u}=this.generateLineHtml(t,k,b);f.left+=a,f.right+=u}return f}generateLineHtml(t,n,e){return{left:this.generateSingleLineHtml(t,n),right:this.generateSingleLineHtml(t,e)}}generateSingleLineHtml(t,n){if(n===void 0)return"";const e=this.hoganUtils.render(Ut,"numbers",{oldNumber:n.oldNumber||"",newNumber:n.newNumber||""});return this.hoganUtils.render(He,"line",{type:n.type,lineClass:"d2h-code-linenumber",contentClass:"d2h-code-line",prefix:n.prefix===" "?"&nbsp;":n.prefix,content:n.content,lineNumber:e,line:n,file:t})}}const tn=Object.assign(Object.assign({},Ze),{renderNothingWhenEmpty:!1,matchingMaxComparisons:2500,maxLineSizeInBlockForComparison:200}),Be="generic",Qs="side-by-side",Zs="icon",el="tag";class tl{constructor(t,n={}){this.hoganUtils=t,this.config=Object.assign(Object.assign({},tn),n)}render(t){const n=t.map(e=>{let l;return e.blocks.length?l=this.generateFileHtml(e):l=this.generateEmptyDiff(),this.makeFileDiffHtml(e,l)}).join(`
7
- `);return this.hoganUtils.render(Be,"wrapper",{colorScheme:_t(this.config.colorScheme),content:n})}makeFileDiffHtml(t,n){if(this.config.renderNothingWhenEmpty&&Array.isArray(t.blocks)&&t.blocks.length===0)return"";const e=this.hoganUtils.template(Qs,"file-diff"),l=this.hoganUtils.template(Be,"file-path"),f=this.hoganUtils.template(Zs,"file"),r=this.hoganUtils.template(el,kt(t));return e.render({file:t,fileHtmlId:wt(t),diffs:n,filePath:l.render({fileDiffName:et(t)},{fileIcon:f,fileTag:r})})}generateEmptyDiff(){return{right:"",left:this.hoganUtils.render(Be,"empty-diff",{contentClass:"d2h-code-side-line",CSSLineClass:he})}}generateFileHtml(t){const n=yt(vt(e=>xe(e.content,t.isCombined).content));return t.blocks.map(e=>{const l={left:this.makeHeaderHtml(e.header,t),right:this.makeHeaderHtml("")};return this.applyLineGroupping(e).forEach(([f,r,h])=>{if(r.length&&h.length&&!f.length)this.applyRematchMatching(r,h,n).map(([y,o])=>{const{left:c,right:k}=this.processChangedLines(t.isCombined,y,o);l.left+=c,l.right+=k});else if(f.length)f.forEach(y=>{const{prefix:o,content:c}=xe(y.content,t.isCombined),{left:k,right:b}=this.generateLineHtml({type:he.CONTEXT,prefix:o,content:c,number:y.oldNumber},{type:he.CONTEXT,prefix:o,content:c,number:y.newNumber});l.left+=k,l.right+=b});else if(r.length||h.length){const{left:y,right:o}=this.processChangedLines(t.isCombined,r,h);l.left+=y,l.right+=o}else console.error("Unknown state reached while processing groups of lines",f,r,h)}),l}).reduce((e,l)=>({left:e.left+l.left,right:e.right+l.right}),{left:"",right:""})}applyLineGroupping(t){const n=[];let e=[],l=[];for(let f=0;f<t.lines.length;f++){const r=t.lines[f];(r.type!==ie.INSERT&&l.length||r.type===ie.CONTEXT&&e.length>0)&&(n.push([[],e,l]),e=[],l=[]),r.type===ie.CONTEXT?n.push([[r],[],[]]):r.type===ie.INSERT&&e.length===0?n.push([[],[],[r]]):r.type===ie.INSERT&&e.length>0?l.push(r):r.type===ie.DELETE&&e.push(r)}return(e.length||l.length)&&(n.push([[],e,l]),e=[],l=[]),n}applyRematchMatching(t,n,e){const l=t.length*n.length,f=Jt(t.concat(n).map(h=>h.content.length));return l<this.config.matchingMaxComparisons&&f<this.config.maxLineSizeInBlockForComparison&&(this.config.matching==="lines"||this.config.matching==="words")?e(t,n):[[t,n]]}makeHeaderHtml(t,n){return this.hoganUtils.render(Be,"block-header",{CSSLineClass:he,blockHeader:n!=null&&n.isTooBig?t:Ae(t),lineClass:"d2h-code-side-linenumber",contentClass:"d2h-code-side-line"})}processChangedLines(t,n,e){const l={right:"",left:""},f=Math.max(n.length,e.length);for(let r=0;r<f;r++){const h=n[r],y=e[r],o=h!==void 0&&y!==void 0?Zt(h.content,y.content,t,this.config):void 0,c=h!==void 0&&h.oldNumber!==void 0?Object.assign(Object.assign({},o!==void 0?{prefix:o.oldLine.prefix,content:o.oldLine.content,type:he.DELETE_CHANGES}:Object.assign(Object.assign({},xe(h.content,t)),{type:Ke(h.type)})),{number:h.oldNumber}):void 0,k=y!==void 0&&y.newNumber!==void 0?Object.assign(Object.assign({},o!==void 0?{prefix:o.newLine.prefix,content:o.newLine.content,type:he.INSERT_CHANGES}:Object.assign(Object.assign({},xe(y.content,t)),{type:Ke(y.type)})),{number:y.newNumber}):void 0,{left:b,right:a}=this.generateLineHtml(c,k);l.left+=b,l.right+=a}return l}generateLineHtml(t,n){return{left:this.generateSingleHtml(t),right:this.generateSingleHtml(n)}}generateSingleHtml(t){const n="d2h-code-side-linenumber",e="d2h-code-side-line";return this.hoganUtils.render(Be,"line",{type:(t==null?void 0:t.type)||`${he.CONTEXT} d2h-emptyplaceholder`,lineClass:t!==void 0?n:`${n} d2h-code-side-emptyplaceholder`,contentClass:t!==void 0?e:`${e} d2h-code-side-emptyplaceholder`,prefix:(t==null?void 0:t.prefix)===" "?"&nbsp;":t==null?void 0:t.prefix,content:t==null?void 0:t.content,lineNumber:t==null?void 0:t.number})}}var it={},Wt;function nl(){return Wt||(Wt=1,(function(s){(function(t){var n=/\S/,e=/\"/g,l=/\n/g,f=/\r/g,r=/\\/g,h=/\u2028/,y=/\u2029/;t.tags={"#":1,"^":2,"<":3,$:4,"/":5,"!":6,">":7,"=":8,_v:9,"{":10,"&":11,_t:12},t.scan=function(x,S){var z=x.length,ee=0,ce=1,re=2,K=ee,ue=null,de=null,fe="",te=[],ve=!1,D=0,j=0,C="{{",Z="}}";function Ne(){fe.length>0&&(te.push({tag:"_t",text:new String(fe)}),fe="")}function Re(){for(var pe=!0,Y=j;Y<te.length;Y++)if(pe=t.tags[te[Y].tag]<t.tags._v||te[Y].tag=="_t"&&te[Y].text.match(n)===null,!pe)return!1;return pe}function ke(pe,Y){if(Ne(),pe&&Re())for(var ye=j,Te;ye<te.length;ye++)te[ye].text&&((Te=te[ye+1])&&Te.tag==">"&&(Te.indent=te[ye].text.toString()),te.splice(ye,1));else Y||te.push({tag:`
8
- `});ve=!1,j=te.length}function Ee(pe,Y){var ye="="+Z,Te=pe.indexOf(ye,Y),Me=c(pe.substring(pe.indexOf("=",Y)+1,Te)).split(" ");return C=Me[0],Z=Me[Me.length-1],Te+ye.length-1}for(S&&(S=S.split(" "),C=S[0],Z=S[1]),D=0;D<z;D++)K==ee?k(C,x,D)?(--D,Ne(),K=ce):x.charAt(D)==`
9
- `?ke(ve):fe+=x.charAt(D):K==ce?(D+=C.length-1,de=t.tags[x.charAt(D+1)],ue=de?x.charAt(D+1):"_v",ue=="="?(D=Ee(x,D),K=ee):(de&&D++,K=re),ve=D):k(Z,x,D)?(te.push({tag:ue,n:c(fe),otag:C,ctag:Z,i:ue=="/"?ve-C.length:D+Z.length}),fe="",D+=Z.length-1,K=ee,ue=="{"&&(Z=="}}"?D++:o(te[te.length-1]))):fe+=x.charAt(D);return ke(ve,!0),te};function o(m){m.n.substr(m.n.length-1)==="}"&&(m.n=m.n.substring(0,m.n.length-1))}function c(m){return m.trim?m.trim():m.replace(/^\s*|\s*$/g,"")}function k(m,x,S){if(x.charAt(S)!=m.charAt(0))return!1;for(var z=1,ee=m.length;z<ee;z++)if(x.charAt(S+z)!=m.charAt(z))return!1;return!0}var b={_t:!0,"\n":!0,$:!0,"/":!0};function a(m,x,S,z){var ee=[],ce=null,re=null,K=null;for(re=S[S.length-1];m.length>0;){if(K=m.shift(),re&&re.tag=="<"&&!(K.tag in b))throw new Error("Illegal content in < super tag.");if(t.tags[K.tag]<=t.tags.$||u(K,z))S.push(K),K.nodes=a(m,K.tag,S,z);else if(K.tag=="/"){if(S.length===0)throw new Error("Closing tag without opener: /"+K.n);if(ce=S.pop(),K.n!=ce.n&&!_(K.n,ce.n,z))throw new Error("Nesting error: "+ce.n+" vs. "+K.n);return ce.end=K.i,ee}else K.tag==`
10
- `&&(K.last=m.length==0||m[0].tag==`
11
- `);ee.push(K)}if(S.length>0)throw new Error("missing closing tag: "+S.pop().n);return ee}function u(m,x){for(var S=0,z=x.length;S<z;S++)if(x[S].o==m.n)return m.tag="#",!0}function _(m,x,S){for(var z=0,ee=S.length;z<ee;z++)if(S[z].c==m&&S[z].o==x)return!0}function v(m){var x=[];for(var S in m)x.push('"'+E(S)+'": function(c,p,t,i) {'+m[S]+"}");return"{ "+x.join(",")+" }"}function N(m){var x=[];for(var S in m.partials)x.push('"'+E(S)+'":{name:"'+E(m.partials[S].name)+'", '+N(m.partials[S])+"}");return"partials: {"+x.join(",")+"}, subs: "+v(m.subs)}t.stringify=function(m,x,S){return"{code: function (c,p,i) { "+t.wrapMain(m.code)+" },"+N(m)+"}"};var L=0;t.generate=function(m,x,S){L=0;var z={code:"",subs:{},partials:{}};return t.walk(m,z),S.asString?this.stringify(z,x,S):this.makeTemplate(z,x,S)},t.wrapMain=function(m){return'var t=this;t.b(i=i||"");'+m+"return t.fl();"},t.template=t.Template,t.makeTemplate=function(m,x,S){var z=this.makePartials(m);return z.code=new Function("c","p","i",this.wrapMain(m.code)),new this.template(z,x,this,S)},t.makePartials=function(m){var x,S={subs:{},partials:m.partials,name:m.name};for(x in S.partials)S.partials[x]=this.makePartials(S.partials[x]);for(x in m.subs)S.subs[x]=new Function("c","p","t","i",m.subs[x]);return S};function E(m){return m.replace(r,"\\\\").replace(e,'\\"').replace(l,"\\n").replace(f,"\\r").replace(h,"\\u2028").replace(y,"\\u2029")}function $(m){return~m.indexOf(".")?"d":"f"}function H(m,x){var S="<"+(x.prefix||""),z=S+m.n+L++;return x.partials[z]={name:m.n,partials:{}},x.code+='t.b(t.rp("'+E(z)+'",c,p,"'+(m.indent||"")+'"));',z}t.codegen={"#":function(m,x){x.code+="if(t.s(t."+$(m.n)+'("'+E(m.n)+'",c,p,1),c,p,0,'+m.i+","+m.end+',"'+m.otag+" "+m.ctag+'")){t.rs(c,p,function(c,p,t){',t.walk(m.nodes,x),x.code+="});c.pop();}"},"^":function(m,x){x.code+="if(!t.s(t."+$(m.n)+'("'+E(m.n)+'",c,p,1),c,p,1,0,0,"")){',t.walk(m.nodes,x),x.code+="};"},">":H,"<":function(m,x){var S={partials:{},code:"",subs:{},inPartial:!0};t.walk(m.nodes,S);var z=x.partials[H(m,x)];z.subs=S.subs,z.partials=S.partials},$:function(m,x){var S={subs:{},code:"",partials:x.partials,prefix:m.n};t.walk(m.nodes,S),x.subs[m.n]=S.code,x.inPartial||(x.code+='t.sub("'+E(m.n)+'",c,p,i);')},"\n":function(m,x){x.code+=F('"\\n"'+(m.last?"":" + i"))},_v:function(m,x){x.code+="t.b(t.v(t."+$(m.n)+'("'+E(m.n)+'",c,p,0)));'},_t:function(m,x){x.code+=F('"'+E(m.text)+'"')},"{":M,"&":M};function M(m,x){x.code+="t.b(t.t(t."+$(m.n)+'("'+E(m.n)+'",c,p,0)));'}function F(m){return"t.b("+m+");"}t.walk=function(m,x){for(var S,z=0,ee=m.length;z<ee;z++)S=t.codegen[m[z].tag],S&&S(m[z],x);return x},t.parse=function(m,x,S){return S=S||{},a(m,"",[],S.sectionTags||[])},t.cache={},t.cacheKey=function(m,x){return[m,!!x.asString,!!x.disableLambda,x.delimiters,!!x.modelGet].join("||")},t.compile=function(m,x){x=x||{};var S=t.cacheKey(m,x),z=this.cache[S];if(z){var ee=z.partials;for(var ce in ee)delete ee[ce].instance;return z}return z=this.generate(this.parse(this.scan(m,x.delimiters),m,x),m,x),this.cache[S]=z}})(s)})(it)),it}var ot={},jt;function sl(){return jt||(jt=1,(function(s){(function(t){t.Template=function(a,u,_,v){a=a||{},this.r=a.code||this.r,this.c=_,this.options=v||{},this.text=u||"",this.partials=a.partials||{},this.subs=a.subs||{},this.buf=""},t.Template.prototype={r:function(a,u,_){return""},v:k,t:c,render:function(u,_,v){return this.ri([u],_||{},v)},ri:function(a,u,_){return this.r(a,u,_)},ep:function(a,u){var _=this.partials[a],v=u[_.name];if(_.instance&&_.base==v)return _.instance;if(typeof v=="string"){if(!this.c)throw new Error("No compiler available.");v=this.c.compile(v,this.options)}if(!v)return null;if(this.partials[a].base=v,_.subs){u.stackText||(u.stackText={});for(key in _.subs)u.stackText[key]||(u.stackText[key]=this.activeSub!==void 0&&u.stackText[this.activeSub]?u.stackText[this.activeSub]:this.text);v=e(v,_.subs,_.partials,this.stackSubs,this.stackPartials,u.stackText)}return this.partials[a].instance=v,v},rp:function(a,u,_,v){var N=this.ep(a,_);return N?N.ri(u,_,v):""},rs:function(a,u,_){var v=a[a.length-1];if(!b(v)){_(a,u,this);return}for(var N=0;N<v.length;N++)a.push(v[N]),_(a,u,this),a.pop()},s:function(a,u,_,v,N,L,E){var $;return b(a)&&a.length===0?!1:(typeof a=="function"&&(a=this.ms(a,u,_,v,N,L,E)),$=!!a,!v&&$&&u&&u.push(typeof a=="object"?a:u[u.length-1]),$)},d:function(a,u,_,v){var N,L=a.split("."),E=this.f(L[0],u,_,v),$=this.options.modelGet,H=null;if(a==="."&&b(u[u.length-2]))E=u[u.length-1];else for(var M=1;M<L.length;M++)N=n(L[M],E,$),N!==void 0?(H=E,E=N):E="";return v&&!E?!1:(!v&&typeof E=="function"&&(u.push(H),E=this.mv(E,u,_),u.pop()),E)},f:function(a,u,_,v){for(var N=!1,L=null,E=!1,$=this.options.modelGet,H=u.length-1;H>=0;H--)if(L=u[H],N=n(a,L,$),N!==void 0){E=!0;break}return E?(!v&&typeof N=="function"&&(N=this.mv(N,u,_)),N):v?!1:""},ls:function(a,u,_,v,N,L){var E=this.options.delimiters;return this.options.delimiters=L,this.b(this.ct(c(a.call(u,N,_)),u,v)),this.options.delimiters=E,!1},ct:function(a,u,_){if(this.options.disableLambda)throw new Error("Lambda features disabled.");return this.c.compile(a,this.options).render(u,_)},b:function(a){this.buf+=a},fl:function(){var a=this.buf;return this.buf="",a},ms:function(a,u,_,v,N,L,E){var $,H=u[u.length-1],M=a.call(H);return typeof M=="function"?v?!0:($=this.activeSub&&this.subsText&&this.subsText[this.activeSub]?this.subsText[this.activeSub]:this.text,this.ls(M,H,u,_,$.substring(N,L),E)):M},mv:function(a,u,_){var v=u[u.length-1],N=a.call(v);return typeof N=="function"?this.ct(c(N.call(v)),v,_):N},sub:function(a,u,_,v){var N=this.subs[a];N&&(this.activeSub=a,N(u,_,this,v),this.activeSub=!1)}};function n(a,u,_){var v;return u&&typeof u=="object"&&(u[a]!==void 0?v=u[a]:_&&u.get&&typeof u.get=="function"&&(v=u.get(a))),v}function e(a,u,_,v,N,L){function E(){}E.prototype=a;function $(){}$.prototype=a.subs;var H,M=new E;M.subs=new $,M.subsText={},M.buf="",v=v||{},M.stackSubs=v,M.subsText=L;for(H in u)v[H]||(v[H]=u[H]);for(H in v)M.subs[H]=v[H];N=N||{},M.stackPartials=N;for(H in _)N[H]||(N[H]=_[H]);for(H in N)M.partials[H]=N[H];return M}var l=/&/g,f=/</g,r=/>/g,h=/\'/g,y=/\"/g,o=/[&<>\"\']/;function c(a){return String(a??"")}function k(a){return a=c(a),o.test(a)?a.replace(l,"&amp;").replace(f,"&lt;").replace(r,"&gt;").replace(h,"&#39;").replace(y,"&quot;"):a}var b=Array.isArray||function(a){return Object.prototype.toString.call(a)==="[object Array]"}})(s)})(ot)),ot}var rt,Gt;function ll(){if(Gt)return rt;Gt=1;var s=nl();return s.Template=sl().Template,s.template=s.Template,rt=s,rt}var le=ll();const oe={};oe["file-summary-line"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<li class="d2h-file-list-line">'),e.b(`
12
- `+n),e.b(' <span class="d2h-file-name-wrapper">'),e.b(`
13
- `+n),e.b(e.rp("<fileIcon0",s,t," ")),e.b(' <a href="#'),e.b(e.v(e.f("fileHtmlId",s,t,0))),e.b('" class="d2h-file-name">'),e.b(e.v(e.f("fileName",s,t,0))),e.b("</a>"),e.b(`
14
- `+n),e.b(' <span class="d2h-file-stats">'),e.b(`
15
- `+n),e.b(' <span class="d2h-lines-added">'),e.b(e.v(e.f("addedLines",s,t,0))),e.b("</span>"),e.b(`
16
- `+n),e.b(' <span class="d2h-lines-deleted">'),e.b(e.v(e.f("deletedLines",s,t,0))),e.b("</span>"),e.b(`
17
- `+n),e.b(" </span>"),e.b(`
18
- `+n),e.b(" </span>"),e.b(`
19
- `+n),e.b("</li>"),e.fl()},partials:{"<fileIcon0":{name:"fileIcon",partials:{},subs:{}}},subs:{}});oe["file-summary-wrapper"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<div class="d2h-file-list-wrapper '),e.b(e.v(e.f("colorScheme",s,t,0))),e.b('">'),e.b(`
20
- `+n),e.b(' <div class="d2h-file-list-header">'),e.b(`
21
- `+n),e.b(' <span class="d2h-file-list-title">Files changed ('),e.b(e.v(e.f("filesNumber",s,t,0))),e.b(")</span>"),e.b(`
22
- `+n),e.b(' <a class="d2h-file-switch d2h-hide">hide</a>'),e.b(`
23
- `+n),e.b(' <a class="d2h-file-switch d2h-show">show</a>'),e.b(`
24
- `+n),e.b(" </div>"),e.b(`
25
- `+n),e.b(' <ol class="d2h-file-list">'),e.b(`
26
- `+n),e.b(" "),e.b(e.t(e.f("files",s,t,0))),e.b(`
27
- `+n),e.b(" </ol>"),e.b(`
28
- `+n),e.b("</div>"),e.fl()},partials:{},subs:{}});oe["generic-block-header"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b("<tr>"),e.b(`
29
- `+n),e.b(' <td class="'),e.b(e.v(e.f("lineClass",s,t,0))),e.b(" "),e.b(e.v(e.d("CSSLineClass.INFO",s,t,0))),e.b('"></td>'),e.b(`
30
- `+n),e.b(' <td class="'),e.b(e.v(e.d("CSSLineClass.INFO",s,t,0))),e.b('">'),e.b(`
31
- `+n),e.b(' <div class="'),e.b(e.v(e.f("contentClass",s,t,0))),e.b('">'),e.s(e.f("blockHeader",s,t,1),s,t,0,156,173,"{{ }}")&&(e.rs(s,t,function(l,f,r){r.b(r.t(r.f("blockHeader",l,f,0)))}),s.pop()),e.s(e.f("blockHeader",s,t,1),s,t,1,0,0,"")||e.b("&nbsp;"),e.b("</div>"),e.b(`
32
- `+n),e.b(" </td>"),e.b(`
33
- `+n),e.b("</tr>"),e.fl()},partials:{},subs:{}});oe["generic-empty-diff"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b("<tr>"),e.b(`
34
- `+n),e.b(' <td class="'),e.b(e.v(e.d("CSSLineClass.INFO",s,t,0))),e.b('">'),e.b(`
35
- `+n),e.b(' <div class="'),e.b(e.v(e.f("contentClass",s,t,0))),e.b('">'),e.b(`
36
- `+n),e.b(" File without changes"),e.b(`
37
- `+n),e.b(" </div>"),e.b(`
38
- `+n),e.b(" </td>"),e.b(`
39
- `+n),e.b("</tr>"),e.fl()},partials:{},subs:{}});oe["generic-file-path"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<span class="d2h-file-name-wrapper">'),e.b(`
40
- `+n),e.b(e.rp("<fileIcon0",s,t," ")),e.b(' <span class="d2h-file-name">'),e.b(e.v(e.f("fileDiffName",s,t,0))),e.b("</span>"),e.b(`
41
- `+n),e.b(e.rp("<fileTag1",s,t," ")),e.b("</span>"),e.b(`
42
- `+n),e.b('<label class="d2h-file-collapse">'),e.b(`
43
- `+n),e.b(' <input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">'),e.b(`
44
- `+n),e.b(" Viewed"),e.b(`
45
- `+n),e.b("</label>"),e.fl()},partials:{"<fileIcon0":{name:"fileIcon",partials:{},subs:{}},"<fileTag1":{name:"fileTag",partials:{},subs:{}}},subs:{}});oe["generic-line"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b("<tr>"),e.b(`
46
- `+n),e.b(' <td class="'),e.b(e.v(e.f("lineClass",s,t,0))),e.b(" "),e.b(e.v(e.f("type",s,t,0))),e.b('">'),e.b(`
47
- `+n),e.b(" "),e.b(e.t(e.f("lineNumber",s,t,0))),e.b(`
48
- `+n),e.b(" </td>"),e.b(`
49
- `+n),e.b(' <td class="'),e.b(e.v(e.f("type",s,t,0))),e.b('">'),e.b(`
50
- `+n),e.b(' <div class="'),e.b(e.v(e.f("contentClass",s,t,0))),e.b('">'),e.b(`
51
- `+n),e.s(e.f("prefix",s,t,1),s,t,0,162,238,"{{ }}")&&(e.rs(s,t,function(l,f,r){r.b(' <span class="d2h-code-line-prefix">'),r.b(r.t(r.f("prefix",l,f,0))),r.b("</span>"),r.b(`
52
- `+n)}),s.pop()),e.s(e.f("prefix",s,t,1),s,t,1,0,0,"")||(e.b(' <span class="d2h-code-line-prefix">&nbsp;</span>'),e.b(`
53
- `+n)),e.s(e.f("content",s,t,1),s,t,0,371,445,"{{ }}")&&(e.rs(s,t,function(l,f,r){r.b(' <span class="d2h-code-line-ctn">'),r.b(r.t(r.f("content",l,f,0))),r.b("</span>"),r.b(`
54
- `+n)}),s.pop()),e.s(e.f("content",s,t,1),s,t,1,0,0,"")||(e.b(' <span class="d2h-code-line-ctn"><br></span>'),e.b(`
55
- `+n)),e.b(" </div>"),e.b(`
56
- `+n),e.b(" </td>"),e.b(`
57
- `+n),e.b("</tr>"),e.fl()},partials:{},subs:{}});oe["generic-wrapper"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<div class="d2h-wrapper '),e.b(e.v(e.f("colorScheme",s,t,0))),e.b('">'),e.b(`
58
- `+n),e.b(" "),e.b(e.t(e.f("content",s,t,0))),e.b(`
59
- `+n),e.b("</div>"),e.fl()},partials:{},subs:{}});oe["icon-file-added"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<svg aria-hidden="true" class="d2h-icon d2h-added" height="16" title="added" version="1.1" viewBox="0 0 14 16"'),e.b(`
60
- `+n),e.b(' width="14">'),e.b(`
61
- `+n),e.b(' <path d="M13 1H1C0.45 1 0 1.45 0 2v12c0 0.55 0.45 1 1 1h12c0.55 0 1-0.45 1-1V2c0-0.55-0.45-1-1-1z m0 13H1V2h12v12zM6 9H3V7h3V4h2v3h3v2H8v3H6V9z"></path>'),e.b(`
62
- `+n),e.b("</svg>"),e.fl()},partials:{},subs:{}});oe["icon-file-changed"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<svg aria-hidden="true" class="d2h-icon d2h-changed" height="16" title="modified" version="1.1"'),e.b(`
63
- `+n),e.b(' viewBox="0 0 14 16" width="14">'),e.b(`
64
- `+n),e.b(' <path d="M13 1H1C0.45 1 0 1.45 0 2v12c0 0.55 0.45 1 1 1h12c0.55 0 1-0.45 1-1V2c0-0.55-0.45-1-1-1z m0 13H1V2h12v12zM4 8c0-1.66 1.34-3 3-3s3 1.34 3 3-1.34 3-3 3-3-1.34-3-3z"></path>'),e.b(`
65
- `+n),e.b("</svg>"),e.fl()},partials:{},subs:{}});oe["icon-file-deleted"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<svg aria-hidden="true" class="d2h-icon d2h-deleted" height="16" title="removed" version="1.1"'),e.b(`
66
- `+n),e.b(' viewBox="0 0 14 16" width="14">'),e.b(`
67
- `+n),e.b(' <path d="M13 1H1C0.45 1 0 1.45 0 2v12c0 0.55 0.45 1 1 1h12c0.55 0 1-0.45 1-1V2c0-0.55-0.45-1-1-1z m0 13H1V2h12v12zM11 9H3V7h8v2z"></path>'),e.b(`
68
- `+n),e.b("</svg>"),e.fl()},partials:{},subs:{}});oe["icon-file-renamed"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<svg aria-hidden="true" class="d2h-icon d2h-moved" height="16" title="renamed" version="1.1"'),e.b(`
69
- `+n),e.b(' viewBox="0 0 14 16" width="14">'),e.b(`
70
- `+n),e.b(' <path d="M6 9H3V7h3V4l5 4-5 4V9z m8-7v12c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h12c0.55 0 1 0.45 1 1z m-1 0H1v12h12V2z"></path>'),e.b(`
71
- `+n),e.b("</svg>"),e.fl()},partials:{},subs:{}});oe["icon-file"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<svg aria-hidden="true" class="d2h-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12">'),e.b(`
72
- `+n),e.b(' <path d="M6 5H2v-1h4v1zM2 8h7v-1H2v1z m0 2h7v-1H2v1z m0 2h7v-1H2v1z m10-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z"></path>'),e.b(`
73
- `+n),e.b("</svg>"),e.fl()},partials:{},subs:{}});oe["line-by-line-file-diff"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<div id="'),e.b(e.v(e.f("fileHtmlId",s,t,0))),e.b('" class="d2h-file-wrapper" data-lang="'),e.b(e.v(e.d("file.language",s,t,0))),e.b('">'),e.b(`
74
- `+n),e.b(' <div class="d2h-file-header">'),e.b(`
75
- `+n),e.b(" "),e.b(e.t(e.f("filePath",s,t,0))),e.b(`
76
- `+n),e.b(" </div>"),e.b(`
77
- `+n),e.b(' <div class="d2h-file-diff">'),e.b(`
78
- `+n),e.b(' <div class="d2h-code-wrapper">'),e.b(`
79
- `+n),e.b(' <table class="d2h-diff-table">'),e.b(`
80
- `+n),e.b(' <tbody class="d2h-diff-tbody">'),e.b(`
81
- `+n),e.b(" "),e.b(e.t(e.f("diffs",s,t,0))),e.b(`
82
- `+n),e.b(" </tbody>"),e.b(`
83
- `+n),e.b(" </table>"),e.b(`
84
- `+n),e.b(" </div>"),e.b(`
85
- `+n),e.b(" </div>"),e.b(`
86
- `+n),e.b("</div>"),e.fl()},partials:{},subs:{}});oe["line-by-line-numbers"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<div class="line-num1">'),e.b(e.v(e.f("oldNumber",s,t,0))),e.b("</div>"),e.b(`
87
- `+n),e.b('<div class="line-num2">'),e.b(e.v(e.f("newNumber",s,t,0))),e.b("</div>"),e.fl()},partials:{},subs:{}});oe["side-by-side-file-diff"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<div id="'),e.b(e.v(e.f("fileHtmlId",s,t,0))),e.b('" class="d2h-file-wrapper" data-lang="'),e.b(e.v(e.d("file.language",s,t,0))),e.b('">'),e.b(`
88
- `+n),e.b(' <div class="d2h-file-header">'),e.b(`
89
- `+n),e.b(" "),e.b(e.t(e.f("filePath",s,t,0))),e.b(`
90
- `+n),e.b(" </div>"),e.b(`
91
- `+n),e.b(' <div class="d2h-files-diff">'),e.b(`
92
- `+n),e.b(' <div class="d2h-file-side-diff">'),e.b(`
93
- `+n),e.b(' <div class="d2h-code-wrapper">'),e.b(`
94
- `+n),e.b(' <table class="d2h-diff-table">'),e.b(`
95
- `+n),e.b(' <tbody class="d2h-diff-tbody">'),e.b(`
96
- `+n),e.b(" "),e.b(e.t(e.d("diffs.left",s,t,0))),e.b(`
97
- `+n),e.b(" </tbody>"),e.b(`
98
- `+n),e.b(" </table>"),e.b(`
99
- `+n),e.b(" </div>"),e.b(`
100
- `+n),e.b(" </div>"),e.b(`
101
- `+n),e.b(' <div class="d2h-file-side-diff">'),e.b(`
102
- `+n),e.b(' <div class="d2h-code-wrapper">'),e.b(`
103
- `+n),e.b(' <table class="d2h-diff-table">'),e.b(`
104
- `+n),e.b(' <tbody class="d2h-diff-tbody">'),e.b(`
105
- `+n),e.b(" "),e.b(e.t(e.d("diffs.right",s,t,0))),e.b(`
106
- `+n),e.b(" </tbody>"),e.b(`
107
- `+n),e.b(" </table>"),e.b(`
108
- `+n),e.b(" </div>"),e.b(`
109
- `+n),e.b(" </div>"),e.b(`
110
- `+n),e.b(" </div>"),e.b(`
111
- `+n),e.b("</div>"),e.fl()},partials:{},subs:{}});oe["tag-file-added"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<span class="d2h-tag d2h-added d2h-added-tag">ADDED</span>'),e.fl()},partials:{},subs:{}});oe["tag-file-changed"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<span class="d2h-tag d2h-changed d2h-changed-tag">CHANGED</span>'),e.fl()},partials:{},subs:{}});oe["tag-file-deleted"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<span class="d2h-tag d2h-deleted d2h-deleted-tag">DELETED</span>'),e.fl()},partials:{},subs:{}});oe["tag-file-renamed"]=new le.Template({code:function(s,t,n){var e=this;return e.b(n=n||""),e.b('<span class="d2h-tag d2h-moved d2h-moved-tag">RENAMED</span>'),e.fl()},partials:{},subs:{}});class al{constructor({compiledTemplates:t={},rawTemplates:n={}}){const e=Object.entries(n).reduce((l,[f,r])=>{const h=le.compile(r,{asString:!1});return Object.assign(Object.assign({},l),{[f]:h})},{});this.preCompiledTemplates=Object.assign(Object.assign(Object.assign({},oe),t),e)}static compile(t){return le.compile(t,{asString:!1})}render(t,n,e,l,f){const r=this.templateKey(t,n);try{return this.preCompiledTemplates[r].render(e,l,f)}catch{throw new Error(`Could not find template to render '${r}'`)}}template(t,n){return this.preCompiledTemplates[this.templateKey(t,n)]}templateKey(t,n){return`${t}-${n}`}}const il=Object.assign(Object.assign(Object.assign({},en),tn),{outputFormat:Ts.LINE_BY_LINE,drawFileList:!0});function ol(s,t={}){const n=Object.assign(Object.assign({},il),t),e=typeof s=="string"?Ps(s,n):s,l=new al(n),{colorScheme:f}=n,r={colorScheme:f},h=n.drawFileList?new Ks(l,r).render(e):"",y=n.outputFormat==="side-by-side"?new tl(l,n).render(e):new Ys(l,n).render(e);return h+y}const rl={class:"diff-viewer"},dl=["innerHTML"],cl={key:1,class:"diff-fallback mono"},ul=Le({__name:"DiffViewer",props:{patch:{}},setup(s){const t=s,n=Q(()=>{if(!t.patch.trim())return"";try{return ol(t.patch,{drawFileList:!1,outputFormat:"line-by-line",matching:"lines",colorScheme:Pe.DARK,renderNothingWhenEmpty:!0})}catch{return""}}),e=Q(()=>n.value===""?t.patch.split(`
112
- `):[]);return(l,f)=>(w(),A("div",rl,[n.value?(w(),A("div",{key:0,class:"diff-html",innerHTML:n.value},null,8,dl)):e.value.length?(w(),A("pre",cl,[(w(!0),A(se,null,be(e.value,(r,h)=>(w(),A(se,{key:h},[I(P(r)+`
113
- `,1)],64))),128))])):J("",!0)]))}}),pt=De(ul,[["__scopeId","data-v-3ec3d3ee"]]),fl={class:"page status-page"},pl={class:"page-head"},hl={class:"head-branch"},ml={key:0,class:"tracking mono"},gl={key:1,class:"sync ahead"},bl={key:2,class:"sync behind"},vl={class:"repo-path mono"},yl={key:1,class:"empty-tip"},_l={key:2,class:"status-layout"},wl={class:"panel-head"},kl={class:"panel-actions"},Cl={class:"tree-scroll"},xl={class:"group-label"},Tl={key:0,class:"tree-dir"},Sl=["title","onDblclick"],Nl={class:"node-name"},El={class:"node-actions"},$l={key:1,class:"pane-empty"},Ll={class:"status-content"},Dl={class:"toolbar"},Il={class:"toolbar-group"},Vl={class:"card-head"},Pl={class:"card-actions"},Ol={class:"tab-label"},Al={class:"tab-hint"},Fl={key:0,class:"file-empty"},Rl={key:1,class:"file-list"},Ml=["title"],zl={class:"card-head"},Hl={class:"card-title"},Bl={class:"card-actions"},Ul={key:0,class:"file-empty"},Wl={key:1,class:"stash-list mono"},jl={class:"stash-main"},Gl={class:"stash-ref"},ql=["title"],Kl={key:0,class:"stash-date"},Xl={class:"stash-actions"},Jl={class:"diff-wrap"},Yl={class:"diff-summary"},Ql={class:"add"},Zl={class:"del"},ea={key:0,class:"warn"},ta={key:0,class:"file-empty"},na={key:0,class:"stash-files"},sa={class:"stash-files-head"},la={class:"stash-files-title"},aa={class:"card-actions"},ia={class:"file-list compact"},oa={class:"file-path mono"},ra=Le({__name:"StatusView",setup(s){const t=Ye(),{revision:n}=Qe(),e=()=>t.currentId,l=q(null),f=q([]),r=q([]),h=q(!1),y=q(""),o=dt({visible:!1,title:"",diff:null,patch:"",loading:!1}),c=q(!1),k=q(""),b=q(!1),a=q(""),u=q(""),_=q(!1),v=q(""),N=q(!1),L=q(!1),E=q(""),$=dt(new Set),H=Q(()=>$.size),M=q("unstaged"),{confirmVisible:F,pending:m,canRun:x,previewAndConfirm:S,executeConfirmed:z,cancel:ee}=gs(e),ce=Q(()=>{var g;return((g=t.current)==null?void 0:g.path)??""}),re=Q(()=>{var g,i;return((g=l.value)==null?void 0:g.currentShort)??((i=l.value)==null?void 0:i.current)??""}),K=Q(()=>{var g;return((g=l.value)==null?void 0:g.ahead)??0}),ue=Q(()=>{var g;return((g=l.value)==null?void 0:g.behind)??0}),de=Q(()=>{const g=l.value;if(!g)return{unstaged:[],staged:[],untracked:[],all:[]};const i=g.untracked.map(ae=>({path:ae,status:"??",indexStatus:"?",workTreeStatus:"?",staged:!1,untracked:!0,conflicted:!1})),U=[...g.staged,...g.unstaged,...i],R=new Set,G=U.filter(ae=>R.has(ae.path)?!1:(R.add(ae.path),ae.path!==""));return{unstaged:g.unstaged,staged:g.staged,untracked:i,all:G}}),fe=Q(()=>[{key:"unstaged",label:"未暂存",hint:"已修改,未 git add",count:de.value.unstaged.length},{key:"staged",label:"已暂存",hint:"已 git add,未提交",count:de.value.staged.length},{key:"untracked",label:"未跟踪",hint:"工作区新文件",count:de.value.untracked.length},{key:"all",label:"全部",hint:"全部更改",count:de.value.all.length}]),te=Q(()=>de.value[M.value]??[]),ve=Q(()=>de.value.all.length);function D(g){const i=[];for(const{name:U,branch:R}of g){const G=U.split("/").filter(_e=>_e.length>0);if(G.length===0)continue;let ae=i,ge="";for(const[_e,Ie]of G.entries()){ge=ge?`${ge}/${Ie}`:Ie;const je=ae.find(nt=>nt.label===Ie),we=je??{key:"node:"+ge,label:Ie};je||ae.push(we),_e===G.length-1?(we.branch=R,we.fullName=U,we.remote=R.remote):(we.children||(we.children=[]),ae=we.children)}}return j(i),i}function j(g){g.sort((i,U)=>{const R=i.branch?1:0,G=U.branch?1:0;return R!==G?R-G:i.label.localeCompare(U.label)});for(const i of g)i.children&&j(i.children)}function C(g){let i=0;for(const U of g)i+=U.branch?1:C(U.children??[]);return i}const Z=Q(()=>{const g=f.value.filter(G=>!G.remote),i=f.value.filter(G=>G.remote),U=new Map;for(const G of i){const ae=G.name.indexOf("/"),ge=ae===-1?"":G.name.slice(0,ae);if(!ge)continue;const _e=U.get(ge)??[];_e.push({name:G.name.slice(ae+1),branch:G}),U.set(ge,_e)}const R=[];g.length&&R.push({key:"local",title:`本地分支(${g.length})`,tree:D(g.map(G=>({name:G.name,branch:G})))});for(const[G,ae]of U){const ge=D(ae);R.push({key:"remote:"+G,title:`远程 · ${G}(${C(ge)})`,tree:ge})}return R});function Ne(g){if(!g||g.remote||!g.upstream)return"";const i=[];return(g.ahead??0)>0&&i.push(`↑${g.ahead}`),(g.behind??0)>0&&i.push(`↓${g.behind}`),i.join(" ")}async function Re(){const g=e();if(g!==null){h.value=!0,y.value="";try{l.value=await Bn(g)}catch(i){y.value=i instanceof Error?i.message:String(i),l.value=null}finally{h.value=!1}}}async function ke(){const g=e();if(g!==null)try{const{branches:i}=await qt(g);f.value=i}catch{}}async function Ee(){const g=e();if(g!==null)try{r.value=await Gn(g)}catch{}}async function pe(){await Promise.all([Re(),ke(),Ee()])}async function Y(g,i={}){await S(g,i)&&ne.info("请在确认对话框中查看 dry-run 预览")}async function ye(){const g=await z();g!=null&&g.success&&await pe()}function Te(g){Y("git_add",{paths:[g.path]})}function Me(g){Y("git_unstage",{paths:[g.path]})}function sn(g){g.staged?Me(g):Te(g)}function ln(){Y("git_add",{})}function an(){var i;const g=((i=l.value)==null?void 0:i.staged.map(U=>U.path))??[];if(g.length===0){ne.info("没有已暂存的文件");return}Y("git_unstage",{paths:g})}async function on(g){const i=e();if(i!==null){o.title=`${g.path}(${g.staged?"已 git add":"工作区修改"})`,o.diff=null,o.patch="",o.visible=!0,o.loading=!0;try{o.diff=await Wn(i,{path:g.path,staged:g.staged})}catch(U){ne.error(U instanceof Error?U.message:String(U)),o.visible=!1}finally{o.loading=!1}}}async function rn(g){var U;const i=e();if(i!==null){o.title=`${g.ref} · ${g.message||"(无说明)"}`,o.diff=null,o.patch="",o.visible=!0,o.loading=!0;try{const R=await ut(i,"git_stash_show",{index:g.index});if(R.success){const G=R.result??{};o.patch=G.patch??""}else ne.error(((U=R.error)==null?void 0:U.message)??"查看差异失败"),o.visible=!1}catch(R){ne.error(R instanceof Error?R.message:String(R)),o.visible=!1}finally{o.loading=!1}}}function Ct(g){$.has(g)?$.delete(g):$.add(g)}function xt(g){return $.has(g)}function Tt(){$.clear()}function dn(){for(const g of te.value)$.add(g.path)}function cn(){for(const g of We.value)$.add(g)}const We=Q(()=>{const g=l.value;if(!g)return[];const i=new Set;return[...g.unstaged.map(U=>U.path),...g.untracked].filter(U=>i.has(U)?!1:(i.add(U),U!==""))});function un(){_.value=!0}function fn(){const g=We.value,i=[...$].filter(G=>g.includes(G)),U=i.some(G=>{var ae;return((ae=l.value)==null?void 0:ae.untracked.includes(G))??!1}),R={};v.value.trim()&&(R.message=v.value.trim()),i.length&&(R.paths=i),(N.value||U)&&(R.includeUntracked=!0),_.value=!1,$.clear(),Y("git_stash",R)}function pn(){Y("git_stash",{})}function hn(g){Y("git_stash_apply",{index:g.index})}function mn(g){Y("git_stash_pop",{index:g.index})}function gn(g){bt.confirm(`确定删除 ${g.ref} 吗?删除后不可直接恢复。`,"删除 stash",{type:"warning",confirmButtonText:"继续",cancelButtonText:"取消"}).then(()=>void Y("git_stash_drop",{index:g.index})).catch(()=>{})}function St(g){g.branch&&Y("git_checkout",{branch:g.branch.name})}function bn(){Y("git_pull")}function vn(){Y("git_push")}function Nt(){const g=k.value.trim();if(!g){ne.warning("请输入提交信息");return}c.value=!1,Y("git_commit",{message:g})}function yn(){const g=a.value.trim();if(!g){ne.warning("请输入分支名");return}b.value=!1,Y("git_branch_create",u.value.trim()?{name:g,startPoint:u.value.trim()}:{name:g})}function _n(){const g=E.value.trim()||"HEAD";L.value=!1,E.value="",Y("git_reset_hard",{target:g})}function wn(g){return g.untracked?"?":g.staged?g.indexStatus||"M":g.workTreeStatus||"M"}function kn(g){return g.untracked?"new":g.conflicted?"conflict":g.staged?"add":"mod"}function Cn(g){if(!g)return"";const i=new Date(g);return Number.isNaN(i.getTime())?g:i.toLocaleString()}function xn(g){return g.split(`
114
- `)[0]??""}return Ve(e,()=>{o.diff=null,o.patch="",o.visible=!1,$.clear(),pe()}),Ve(n,()=>{pe()}),Fe(()=>{pe()}),(g,i)=>{var $t,Lt,Dt,It,Vt;const U=O("el-tag"),R=O("el-button"),G=O("el-alert"),ae=O("el-tree"),ge=O("el-empty"),_e=O("el-card"),Ie=O("el-badge"),je=O("el-tooltip"),we=O("el-checkbox"),nt=O("el-tab-pane"),Tn=O("el-tabs"),Sn=O("el-drawer"),ze=O("el-input"),Ge=O("el-dialog"),qe=O("el-form-item"),Et=O("el-form"),Nn=Je("loading");return w(),A("div",fl,[T("div",pl,[i[26]||(i[26]=T("h2",{class:"page-title"},"仓库状态",-1)),T("div",hl,[p(U,{type:"primary",effect:"dark",class:"branch-tag"},{default:d(()=>[I(P(re.value||"—"),1)]),_:1}),($t=l.value)!=null&&$t.tracking?(w(),A("span",ml,P(l.value.tracking),1)):J("",!0),K.value?(w(),A("span",gl,"↑"+P(K.value),1)):J("",!0),ue.value?(w(),A("span",bl,"↓"+P(ue.value),1)):J("",!0),(Lt=l.value)!=null&&Lt.isClean?(w(),W(U,{key:3,type:"success",effect:"plain",size:"small"},{default:d(()=>[...i[24]||(i[24]=[I("工作区干净",-1)])]),_:1})):l.value?(w(),W(U,{key:4,type:"warning",effect:"plain",size:"small"},{default:d(()=>[I(P(ve.value)+" 处更改",1)]),_:1})):J("",!0),T("span",vl,P(ce.value),1)]),p(R,{loading:h.value,onClick:pe},{default:d(()=>[...i[25]||(i[25]=[I("刷新",-1)])]),_:1},8,["loading"])]),y.value?(w(),W(G,{key:0,title:y.value,type:"error",closable:!1,"show-icon":"",class:"mb"},null,8,["title"])):J("",!0),X(x)?(w(),A("div",_l,[p(_e,{shadow:"never",class:"branch-panel"},{header:d(()=>[T("div",wl,[i[29]||(i[29]=T("span",{class:"panel-title"},"分支 Branch",-1)),T("div",kl,[p(R,{size:"small",text:"",onClick:ke},{default:d(()=>[...i[27]||(i[27]=[I("刷新",-1)])]),_:1}),p(R,{size:"small",text:"",type:"primary",onClick:i[0]||(i[0]=V=>b.value=!0)},{default:d(()=>[...i[28]||(i[28]=[I("+ 新建",-1)])]),_:1})])])]),default:d(()=>[T("div",Cl,[(w(!0),A(se,null,be(Z.value,V=>(w(),A(se,{key:V.key},[T("div",xl,P(V.title),1),V.tree.length?(w(),W(ae,{key:0,data:V.tree,props:{label:"label",children:"children"},"node-key":"key","default-expand-all":"",indent:14,class:"branch-tree"},{default:d(({data:B})=>{var Se,st,Pt;return[B.branch?(w(),A("div",{key:1,class:Ue(["branch-node",{current:(Se=B.branch)==null?void 0:Se.current,remote:B.remote}]),title:B.fullName,onDblclick:En=>{var Ot;return((Ot=B.branch)==null?void 0:Ot.current)||St(B)}},[T("span",Nl,P(B.label),1),B.remote?J("",!0):(w(),A("span",{key:0,class:Ue(["node-sync",{clean:!Ne(B.branch)&&((st=B.branch)==null?void 0:st.upstream)}])},P(Ne(B.branch)),3)),T("span",El,[(Pt=B.branch)!=null&&Pt.current?(w(),A(se,{key:0},[p(R,{size:"small",text:"",type:"success",onClick:Oe(bn,["stop"])},{default:d(()=>[...i[30]||(i[30]=[I("拉取",-1)])]),_:1}),p(R,{size:"small",text:"",type:"primary",onClick:Oe(vn,["stop"])},{default:d(()=>[...i[31]||(i[31]=[I("推送",-1)])]),_:1})],64)):(w(),W(R,{key:1,size:"small",text:"",type:"primary",onClick:Oe(En=>St(B),["stop"])},{default:d(()=>[...i[32]||(i[32]=[I("切换",-1)])]),_:1},8,["onClick"]))])],42,Sl)):(w(),A("span",Tl,P(B.label),1))]}),_:1},8,["data"])):(w(),A("div",$l,"暂无分支"))],64))),128)),Z.value.length===0?(w(),W(ge,{key:0,description:"暂无分支","image-size":60})):J("",!0)])]),_:1}),T("div",Ll,[p(_e,{shadow:"never",class:"toolbar-card"},{default:d(()=>{var V;return[T("div",Dl,[T("div",Il,[p(R,{type:"primary",onClick:i[1]||(i[1]=B=>c.value=!0)},{default:d(()=>[...i[33]||(i[33]=[I("提交 Commit",-1)])]),_:1}),p(R,{plain:"",onClick:ln},{default:d(()=>[...i[34]||(i[34]=[I("暂存全部",-1)])]),_:1}),p(R,{plain:"",disabled:(((V=l.value)==null?void 0:V.staged.length)??0)===0,onClick:an},{default:d(()=>[...i[35]||(i[35]=[I("取消暂存全部",-1)])]),_:1},8,["disabled"]),p(Ie,{value:H.value,hidden:H.value===0,offset:[2,4]},{default:d(()=>[p(R,{type:"success",plain:"",onClick:un},{default:d(()=>[...i[36]||(i[36]=[I("暂存改动 Stash",-1)])]),_:1})]),_:1},8,["value","hidden"]),p(je,{content:"Shelve Silently:使用默认说明,一键暂存全部更改",placement:"top"},{default:d(()=>[p(R,{plain:"",onClick:pn},{default:d(()=>[...i[37]||(i[37]=[I("静默 Stash",-1)])]),_:1})]),_:1}),p(R,{type:"danger",plain:"",onClick:i[2]||(i[2]=B=>L.value=!0)},{default:d(()=>[...i[38]||(i[38]=[I("硬重置",-1)])]),_:1}),p(R,{type:"danger",plain:"",onClick:i[3]||(i[3]=B=>Y("git_clean"))},{default:d(()=>[...i[39]||(i[39]=[I("清理未跟踪",-1)])]),_:1})])])]}),_:1}),(Dt=l.value)!=null&&Dt.conflicted.length?(w(),W(G,{key:0,title:"存在合并冲突,请先解决冲突(修改文件后重新 git add 并提交)",type:"error",closable:!1,"show-icon":"",class:"mb"})):J("",!0),p(_e,{shadow:"never",class:"changes-card"},{header:d(()=>[T("div",Vl,[i[42]||(i[42]=T("span",{class:"card-title"},"更改 Changes",-1)),T("div",Pl,[H.value?(w(),W(U,{key:0,size:"small",type:"primary",effect:"plain"},{default:d(()=>[I("已选 "+P(H.value),1)]),_:1})):J("",!0),p(R,{size:"small",text:"",onClick:dn},{default:d(()=>[...i[40]||(i[40]=[I("全选本组",-1)])]),_:1}),H.value?(w(),W(R,{key:1,size:"small",text:"",type:"danger",onClick:Tt},{default:d(()=>[...i[41]||(i[41]=[I("清除选择",-1)])]),_:1})):J("",!0)])])]),default:d(()=>[p(Tn,{modelValue:M.value,"onUpdate:modelValue":i[4]||(i[4]=V=>M.value=V),class:"changes-tabs"},{default:d(()=>[(w(!0),A(se,null,be(fe.value,V=>(w(),W(nt,{key:V.key,name:V.key},{label:d(()=>[T("span",Ol,[I(P(V.label)+" ",1),p(Ie,{value:V.count,hidden:V.count===0,type:"primary",class:"tab-badge"},null,8,["value","hidden"])])]),default:d(()=>[T("div",Al,"「"+P(V.hint)+"」",1),V.count===0?(w(),A("div",Fl,"没有"+P(V.label)+"的文件",1)):(w(),A("div",Rl,[(w(!0),A(se,null,be(de.value[V.key],B=>(w(),A("div",{key:V.key+B.path,class:"file-row"},[p(we,{"model-value":xt(B.path),onChange:Se=>Ct(B.path)},null,8,["model-value","onChange"]),T("span",{class:Ue(["file-status",kn(B)])},P(wn(B)),3),T("span",{class:"file-path mono",title:B.path},P(B.path),9,Ml),p(R,{size:"small",text:"",type:"primary",onClick:Se=>on(B)},{default:d(()=>[...i[43]||(i[43]=[I("查看差异",-1)])]),_:1},8,["onClick"]),B.conflicted?(w(),W(R,{key:0,size:"small",text:"",type:"warning",onClick:Se=>Te(B)},{default:d(()=>[...i[44]||(i[44]=[I("标记已解决(git add)",-1)])]),_:1},8,["onClick"])):(w(),W(R,{key:1,size:"small",text:"",type:B.staged?"warning":"success",onClick:Se=>sn(B)},{default:d(()=>[I(P(B.staged?"取消暂存":"暂存"),1)]),_:2},1032,["type","onClick"]))]))),128))]))]),_:2},1032,["name"]))),128))]),_:1},8,["modelValue"])]),_:1}),p(_e,{shadow:"never",class:"stash-card"},{header:d(()=>[T("div",zl,[T("span",Hl,"暂存列表 Stash("+P(r.value.length)+")",1),T("div",Bl,[p(R,{size:"small",text:"",onClick:Ee},{default:d(()=>[...i[45]||(i[45]=[I("刷新",-1)])]),_:1})])])]),default:d(()=>[r.value.length===0?(w(),A("div",Ul,"没有暂存的更改")):(w(),A("div",Wl,[(w(!0),A(se,null,be(r.value,V=>(w(),A("div",{key:V.ref,class:"stash-row"},[T("div",jl,[T("span",Gl,P(V.ref),1),T("span",{class:"stash-msg",title:V.message},P(xn(V.message)||"(无说明)"),9,ql),V.date?(w(),A("span",Kl,P(Cn(V.date)),1)):J("",!0)]),T("div",Xl,[p(R,{size:"small",text:"",type:"primary",onClick:B=>rn(V)},{default:d(()=>[...i[46]||(i[46]=[I("差异",-1)])]),_:1},8,["onClick"]),p(R,{size:"small",text:"",type:"success",onClick:B=>hn(V)},{default:d(()=>[...i[47]||(i[47]=[I("应用",-1)])]),_:1},8,["onClick"]),p(R,{size:"small",text:"",type:"warning",onClick:B=>mn(V)},{default:d(()=>[...i[48]||(i[48]=[I("恢复",-1)])]),_:1},8,["onClick"]),p(R,{size:"small",text:"",type:"danger",onClick:B=>gn(V)},{default:d(()=>[...i[49]||(i[49]=[I("删除",-1)])]),_:1},8,["onClick"])])]))),128))]))]),_:1})])])):(w(),A("div",yl,"请先在「仓库管理」中打开一个仓库")),p(xs,{visible:X(F),"onUpdate:visible":i[5]||(i[5]=V=>In(F)?F.value=V:null),tool:((It=X(m))==null?void 0:It.tool)??"",preview:((Vt=X(m))==null?void 0:Vt.preview)??null,onConfirm:ye,onCancel:X(ee)},null,8,["visible","tool","preview","onCancel"]),p(Sn,{modelValue:o.visible,"onUpdate:modelValue":i[6]||(i[6]=V=>o.visible=V),title:o.title,size:"56%","destroy-on-close":""},{default:d(()=>[Xe((w(),A("div",Jl,[o.diff?(w(),A(se,{key:0},[T("div",Yl,[T("span",null,P(o.diff.files.length)+" 个文件",1),T("span",Ql,"+"+P(o.diff.insertions),1),T("span",Zl,"-"+P(o.diff.deletions),1),o.diff.truncated?(w(),A("span",ea,"(已截断)")):J("",!0)]),p(pt,{patch:o.diff.rawPatch},null,8,["patch"])],64)):o.patch?(w(),A(se,{key:1},[o.patch?(w(),W(pt,{key:1,patch:o.patch},null,8,["patch"])):(w(),A("div",ta,"无差异"))],64)):o.loading?J("",!0):(w(),W(ge,{key:2,description:"无差异","image-size":60}))])),[[Nn,o.loading]])]),_:1},8,["modelValue","title"]),p(Ge,{modelValue:c.value,"onUpdate:modelValue":i[9]||(i[9]=V=>c.value=V),title:"提交 Commit",width:"520px",onClosed:i[10]||(i[10]=V=>k.value="")},{footer:d(()=>[p(R,{onClick:i[8]||(i[8]=V=>c.value=!1)},{default:d(()=>[...i[50]||(i[50]=[I("取消",-1)])]),_:1}),p(R,{type:"primary",onClick:Nt},{default:d(()=>[...i[51]||(i[51]=[I("下一步(dry-run 预览)",-1)])]),_:1})]),default:d(()=>[p(ze,{modelValue:k.value,"onUpdate:modelValue":i[7]||(i[7]=V=>k.value=V),type:"textarea",rows:5,placeholder:"输入提交信息(message)",onKeydown:gt(Oe(Nt,["ctrl"]),["enter"])},null,8,["modelValue","onKeydown"])]),_:1},8,["modelValue"]),p(Ge,{modelValue:b.value,"onUpdate:modelValue":i[14]||(i[14]=V=>b.value=V),title:"新建分支",width:"480px",onClosed:i[15]||(i[15]=V=>{a.value="",u.value=""})},{footer:d(()=>[p(R,{onClick:i[13]||(i[13]=V=>b.value=!1)},{default:d(()=>[...i[52]||(i[52]=[I("取消",-1)])]),_:1}),p(R,{type:"primary",onClick:yn},{default:d(()=>[...i[53]||(i[53]=[I("下一步(dry-run 预览)",-1)])]),_:1})]),default:d(()=>[p(Et,{"label-width":"100px"},{default:d(()=>[p(qe,{label:"分支名"},{default:d(()=>[p(ze,{modelValue:a.value,"onUpdate:modelValue":i[11]||(i[11]=V=>a.value=V),placeholder:"feature/xxx"},null,8,["modelValue"])]),_:1}),p(qe,{label:"起点(可选)"},{default:d(()=>[p(ze,{modelValue:u.value,"onUpdate:modelValue":i[12]||(i[12]=V=>u.value=V),placeholder:"默认当前 HEAD,如 main 或 commit hash"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),p(Ge,{modelValue:_.value,"onUpdate:modelValue":i[19]||(i[19]=V=>_.value=V),title:"暂存改动 Stash",width:"560px"},{footer:d(()=>[p(R,{onClick:i[18]||(i[18]=V=>_.value=!1)},{default:d(()=>[...i[57]||(i[57]=[I("取消",-1)])]),_:1}),p(R,{type:"primary",onClick:fn},{default:d(()=>[...i[58]||(i[58]=[I("下一步(dry-run 预览)",-1)])]),_:1})]),default:d(()=>[p(G,{class:"stash-tip",title:"可勾选左侧更改列表的文件随本次 stash 一起保存;不勾选则保存全部更改。",type:"info",closable:!1,"show-icon":""}),p(Et,{"label-width":"90px"},{default:d(()=>[p(qe,{label:"说明(可选)"},{default:d(()=>[p(ze,{modelValue:v.value,"onUpdate:modelValue":i[16]||(i[16]=V=>v.value=V),placeholder:"留空则使用默认说明(WIP on 分支: 提交)"},null,8,["modelValue"])]),_:1}),p(qe,{label:"包含未跟踪"},{default:d(()=>[p(we,{modelValue:N.value,"onUpdate:modelValue":i[17]||(i[17]=V=>N.value=V)},{default:d(()=>[...i[54]||(i[54]=[I("包含未跟踪文件(-u)。勾选文件后会自动包含其中的未跟踪文件",-1)])]),_:1},8,["modelValue"])]),_:1})]),_:1}),We.value.length?(w(),A("div",na,[T("div",sa,[T("span",la,"选择文件(已选 "+P(H.value)+")",1),T("div",aa,[p(R,{size:"small",text:"",onClick:cn},{default:d(()=>[...i[55]||(i[55]=[I("全选",-1)])]),_:1}),p(R,{size:"small",text:"",onClick:Tt},{default:d(()=>[...i[56]||(i[56]=[I("清除选择",-1)])]),_:1})])]),T("div",ia,[(w(!0),A(se,null,be(We.value,V=>{var B,Se;return w(),A("div",{key:V,class:"file-row"},[p(we,{"model-value":xt(V),onChange:st=>Ct(V)},null,8,["model-value","onChange"]),T("span",{class:Ue(["file-status",(B=l.value)!=null&&B.untracked.includes(V)?"new":"mod"])},P((Se=l.value)!=null&&Se.untracked.includes(V)?"?":"M"),3),T("span",oa,P(V),1)])}),128))])])):J("",!0)]),_:1},8,["modelValue"]),p(Ge,{modelValue:L.value,"onUpdate:modelValue":i[22]||(i[22]=V=>L.value=V),title:"硬重置(高风险)",width:"480px",onClosed:i[23]||(i[23]=V=>E.value="")},{footer:d(()=>[p(R,{onClick:i[21]||(i[21]=V=>L.value=!1)},{default:d(()=>[...i[59]||(i[59]=[I("取消",-1)])]),_:1}),p(R,{type:"danger",onClick:_n},{default:d(()=>[...i[60]||(i[60]=[I("下一步(dry-run 预览)",-1)])]),_:1})]),default:d(()=>[p(G,{title:"将丢弃索引与工作区所有更改(不可逆),执行前会自动创建备份",type:"error",closable:!1,"show-icon":"",class:"mb"}),p(ze,{modelValue:E.value,"onUpdate:modelValue":i[20]||(i[20]=V=>E.value=V),placeholder:"重置目标,默认 HEAD,如 HEAD~1 / commit hash / main"},null,8,["modelValue"])]),_:1},8,["modelValue"])])}}}),da=De(ra,[["__scopeId","data-v-889338b7"]]),ca={class:"page"},ua={class:"filter-bar"},fa={class:"mono hash"},pa={class:"subject"},ha={key:0,class:"refs"},ma={class:"sub"},ga={class:"commit-head"},ba={class:"mono commit-hash"},va={class:"commit-subject"},ya={class:"commit-meta"},_a={key:0},wa={key:0,class:"commit-body"},ka={class:"diff-wrap"},Ca={class:"diff-summary"},xa={class:"add"},Ta={class:"del"},Sa={key:0,class:"warn"},Na=Le({__name:"HistoryView",setup(s){const t=Ye(),{revision:n}=Qe(),e=()=>t.currentId,l=q([]),f=q([]),r=q(!1),h=q(""),y=q("head"),o=q(""),c=q(""),k=q(50),b=q(!1),a=q(null),u=q(null),_=Q(()=>f.value.filter(M=>!M.remote)),v=Q(()=>{var M;return((M=f.value.find(F=>F.current))==null?void 0:M.name)??""});async function N(){const M=e();if(M!==null)try{const{branches:F}=await qt(M);f.value=F}catch{}}async function L(){const M=e();if(M!==null){r.value=!0,h.value="";try{const F={maxCount:k.value};y.value==="all"?F.all=!0:y.value==="branch"&&o.value&&(F.from=o.value),c.value.trim()&&(F.path=c.value.trim()),l.value=await Un(M,F)}catch(F){h.value=F instanceof Error?F.message:String(F),l.value=[]}finally{r.value=!1}}}async function E(){await Promise.all([N(),L()])}async function $(M){const F=e();if(F!==null){r.value=!0;try{const{diff:m}=await jn(F,M.hash);a.value=M,console.log(m),u.value=m,b.value=!0}catch(m){m instanceof ct&&m.code==="COMMIT_NOT_FOUND"?ne.warning(`提交不存在(${M.shortHash}),可能已被清理,请刷新列表`):ne.error(m instanceof Error?m.message:String(m))}finally{r.value=!1}}}function H(M){const F=new Date(M);return Number.isNaN(F.getTime())?M:F.toLocaleString()}return Ve(e,()=>void E()),Ve(n,()=>void L()),Ve([y,o,k],()=>void L()),Fe(()=>void E()),(M,F)=>{const m=O("el-alert"),x=O("el-radio-button"),S=O("el-radio-group"),z=O("el-option"),ee=O("el-select"),ce=O("el-input"),re=O("el-button"),K=O("el-card"),ue=O("el-table-column"),de=O("el-tag"),fe=O("el-table"),te=O("el-empty"),ve=O("el-divider"),D=O("el-drawer"),j=Je("loading");return w(),A("div",ca,[F[8]||(F[8]=T("h2",{class:"page-title"},"提交历史",-1)),h.value?(w(),W(m,{key:0,title:h.value,type:"error",closable:!1,"show-icon":"",class:"mb"},null,8,["title"])):J("",!0),p(K,{shadow:"never",class:"mb"},{default:d(()=>[T("div",ua,[p(S,{modelValue:y.value,"onUpdate:modelValue":F[0]||(F[0]=C=>y.value=C)},{default:d(()=>[p(x,{value:"head"},{default:d(()=>[I("当前分支("+P(v.value)+")",1)]),_:1}),p(x,{value:"all"},{default:d(()=>[...F[5]||(F[5]=[I("全部分支",-1)])]),_:1}),p(x,{value:"branch"},{default:d(()=>[...F[6]||(F[6]=[I("指定分支",-1)])]),_:1})]),_:1},8,["modelValue"]),y.value==="branch"?(w(),W(ee,{key:0,modelValue:o.value,"onUpdate:modelValue":F[1]||(F[1]=C=>o.value=C),filterable:"",placeholder:"选择分支",class:"branch-select"},{default:d(()=>[(w(!0),A(se,null,be(_.value,C=>(w(),W(z,{key:C.name,label:C.name,value:C.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])):J("",!0),p(ce,{modelValue:c.value,"onUpdate:modelValue":F[2]||(F[2]=C=>c.value=C),clearable:"",placeholder:"按路径过滤(可选)",class:"path-input",onKeyup:gt(L,["enter"])},null,8,["modelValue"]),p(ee,{modelValue:k.value,"onUpdate:modelValue":F[3]||(F[3]=C=>k.value=C),class:"count-select"},{default:d(()=>[p(z,{label:"20 条",value:20}),p(z,{label:"50 条",value:50}),p(z,{label:"100 条",value:100})]),_:1},8,["modelValue"]),p(re,{loading:r.value,onClick:L},{default:d(()=>[...F[7]||(F[7]=[I("刷新",-1)])]),_:1},8,["loading"])])]),_:1}),p(K,{shadow:"never"},{default:d(()=>[Xe((w(),W(fe,{data:l.value,size:"default","highlight-current-row":"",onRowClick:$},{default:d(()=>[p(ue,{label:"提交",width:"100"},{default:d(({row:C})=>[T("span",fa,P(C.shortHash),1)]),_:1}),p(ue,{label:"信息","min-width":"300"},{default:d(({row:C})=>[T("div",pa,P(C.subject),1),C.refs?(w(),A("div",ha,[(w(!0),A(se,null,be(C.refs.split(",").map(Z=>Z.trim()).filter(Boolean),Z=>(w(),W(de,{key:Z,size:"small",effect:"plain",class:"ref-tag"},{default:d(()=>[I(P(Z.startsWith("tag: ")?Z:Z.includes("/")&&!Z.startsWith("HEAD")?Z.split("/").pop():Z),1)]),_:2},1024))),128))])):J("",!0)]),_:1}),p(ue,{label:"作者",width:"170"},{default:d(({row:C})=>[T("div",null,P(C.authorName),1),T("div",ma,P(C.authorEmail),1)]),_:1}),p(ue,{label:"时间",width:"180"},{default:d(({row:C})=>[I(P(H(C.authorDate)),1)]),_:1})]),_:1},8,["data"])),[[j,r.value]]),!r.value&&l.value.length===0?(w(),W(te,{key:0,description:"暂无提交记录"})):J("",!0)]),_:1}),p(D,{modelValue:b.value,"onUpdate:modelValue":F[4]||(F[4]=C=>b.value=C),size:"60%","destroy-on-close":""},{default:d(()=>[a.value?(w(),A(se,{key:0},[T("div",ga,[T("div",ba,P(a.value.hash),1),T("h3",va,P(a.value.subject),1),T("div",ya,[T("span",null,P(a.value.authorName)+" <"+P(a.value.authorEmail)+">",1),T("span",null,P(H(a.value.authorDate)),1),a.value.refs?(w(),A("span",_a,"refs: "+P(a.value.refs),1)):J("",!0)]),a.value.body?(w(),A("pre",wa,P(a.value.body),1)):J("",!0)]),p(ve),T("div",ka,[u.value?(w(),A(se,{key:0},[T("div",Ca,[T("span",null,P(u.value.files.length)+" 个文件",1),T("span",xa,"+"+P(u.value.insertions),1),T("span",Ta,"-"+P(u.value.deletions),1),u.value.truncated?(w(),A("span",Sa,"(已截断)")):J("",!0)]),p(pt,{patch:u.value.rawPatch},null,8,["patch"])],64)):(w(),W(te,{key:1,description:"无差异","image-size":60}))])],64)):J("",!0)]),_:1},8,["modelValue"])])}}}),Ea=De(Na,[["__scopeId","data-v-409543e4"]]),$a=ht("logs",{state:()=>({logs:[],loading:!1,error:null,limit:50,toolFilter:""}),actions:{async load(){this.loading=!0,this.error=null;try{const{logs:s}=await qn({limit:this.limit,tool:this.toolFilter||void 0});this.logs=s}catch(s){this.error=s instanceof Error?s.message:String(s)}finally{this.loading=!1}}}}),La={class:"page"},Da={class:"filter-bar"},Ia={class:"tool-cell"},Va={class:"mono repo-path"},Pa=["title"],Oa=["title"],Aa=["title"],Fa=Le({__name:"LogsView",setup(s){const t=$a(),{revision:n}=Qe(),e=Q(()=>{const o=new Set;for(const c of t.logs)o.add(c.tool);return[...o].sort()}),l=o=>o.includes("reset")||o.includes("clean")||o.includes("force")||o.includes("rebase")?"dangerous":"write";function f(o){return l(o)==="dangerous"?"danger":o.startsWith("git_")?"primary":"success"}function r(o){const c=new Date(o);return Number.isNaN(c.getTime())?o:c.toLocaleString()}function h(o){return o==="mcp"?"primary":o==="web"?"success":"warning"}function y(o){if(o==null)return"";if(typeof o=="string")return o;try{const c=JSON.stringify(o);return c===void 0?"":c}catch{return String(o)}}return Ve(n,()=>{t.load()}),Fe(()=>{t.load()}),(o,c)=>{const k=O("el-option"),b=O("el-select"),a=O("el-button"),u=O("el-card"),_=O("el-table-column"),v=O("el-tag"),N=O("el-table"),L=O("el-empty"),E=Je("loading");return w(),A("div",La,[c[7]||(c[7]=T("h2",{class:"page-title"},"操作日志",-1)),p(u,{shadow:"never",class:"mb"},{default:d(()=>[T("div",Da,[p(b,{modelValue:X(t).toolFilter,"onUpdate:modelValue":c[0]||(c[0]=$=>X(t).toolFilter=$),clearable:"",placeholder:"按工具过滤",class:"tool-select",onChange:X(t).load},{default:d(()=>[(w(!0),A(se,null,be(e.value,$=>(w(),W(k,{key:$,label:$,value:$},null,8,["label","value"]))),128))]),_:1},8,["modelValue","onChange"]),p(b,{modelValue:X(t).limit,"onUpdate:modelValue":c[1]||(c[1]=$=>X(t).limit=$),class:"limit-select",onChange:X(t).load},{default:d(()=>[p(k,{label:"最近 20 条",value:20}),p(k,{label:"最近 50 条",value:50}),p(k,{label:"最近 100 条",value:100})]),_:1},8,["modelValue","onChange"]),p(a,{loading:X(t).loading,onClick:X(t).load},{default:d(()=>[...c[2]||(c[2]=[I("刷新",-1)])]),_:1},8,["loading","onClick"]),c[3]||(c[3]=T("span",{class:"tip"},"记录来源:Web / MCP / CLI 全部写入操作(只读操作不记录)",-1))])]),_:1}),p(u,{shadow:"never"},{default:d(()=>[Xe((w(),W(N,{data:X(t).logs,size:"default"},{default:d(()=>[p(_,{label:"时间",width:"180"},{default:d(({row:$})=>[I(P(r($.timestamp)),1)]),_:1}),p(_,{label:"来源",width:"90"},{default:d(({row:$})=>[p(v,{type:h($.source),size:"small",effect:"plain"},{default:d(()=>[I(P($.source.toUpperCase()),1)]),_:2},1032,["type"])]),_:1}),p(_,{label:"工具",width:"200"},{default:d(({row:$})=>[T("div",Ia,[p(v,{type:f($.tool),size:"small",effect:"dark"},{default:d(()=>[I(P($.tool),1)]),_:2},1032,["type"]),$.dryRun?(w(),W(v,{key:0,size:"small",type:"info",effect:"plain",class:"dry-tag"},{default:d(()=>[...c[4]||(c[4]=[I("dry-run",-1)])]),_:1})):J("",!0)])]),_:1}),p(_,{label:"仓库","min-width":"200"},{default:d(({row:$})=>[T("span",Va,P($.repoPath??"—"),1)]),_:1}),p(_,{label:"参数(脱敏)","min-width":"180"},{default:d(({row:$})=>[T("span",{class:"mono params",title:y($.params)},P(y($.params)||"—"),9,Pa)]),_:1}),p(_,{label:"结果","min-width":"150"},{default:d(({row:$})=>[$.error?(w(),A(se,{key:0},[p(v,{type:"danger",size:"small",effect:"plain",class:"result-tag"},{default:d(()=>[...c[5]||(c[5]=[I("失败",-1)])]),_:1}),T("div",{class:"err-text",title:$.error},P($.error),9,Oa)],64)):(w(),A(se,{key:1},[p(v,{type:"success",size:"small",effect:"plain",class:"result-tag"},{default:d(()=>[...c[6]||(c[6]=[I("成功",-1)])]),_:1}),T("div",{class:"ok-text",title:$.result},P($.result),9,Aa)],64))]),_:1}),p(_,{label:"耗时",width:"90"},{default:d(({row:$})=>[I(P($.durationMs)+" ms",1)]),_:1})]),_:1},8,["data"])),[[E,X(t).loading]]),!X(t).loading&&X(t).logs.length===0?(w(),W(L,{key:0,description:"暂无操作日志"})):J("",!0)]),_:1})])}}}),Ra=De(Fa,[["__scopeId","data-v-79ac665b"]]),Ma={class:"page"},za={class:"card-head"},Ha={class:"mono"},Ba={class:"desc"},Ua={key:1,class:"action-bar"},Wa=Le({__name:"SettingsView",setup(s){const t=Kt(),n=dt({disabledTools:[],requireApprovalFor:[],dryRunDefault:!1}),e=q(!1),l=Q(()=>{const b=t.permissions;return b?JSON.stringify([...n.disabledTools].sort())!==JSON.stringify([...b.disabledTools].sort())||JSON.stringify([...n.requireApprovalFor].sort())!==JSON.stringify([...b.requireApprovalFor].sort())||n.dryRunDefault!==b.dryRunDefault:!1}),f=Q(()=>t.tools.filter(b=>b.riskLevel==="dangerous")),r=Q(()=>f.value.map(b=>b.name));function h(){const b=t.permissions;b&&(n.disabledTools=[...b.disabledTools],n.requireApprovalFor=[...b.requireApprovalFor],n.dryRunDefault=b.dryRunDefault,e.value=!0)}Ve(()=>t.permissions,b=>{b&&!l.value&&h()});async function y(b,a){a?n.disabledTools=n.disabledTools.filter(u=>u!==b.name):(n.disabledTools.includes(b.name)||n.disabledTools.push(b.name),n.requireApprovalFor=n.requireApprovalFor.filter(u=>u!==b.name))}function o(b){return b==="readonly"?"success":b==="write"?"primary":"danger"}function c(b){return b==="readonly"?"只读":b==="write"?"写操作":"高风险"}async function k(){try{await t.save({disabledTools:[...n.disabledTools],requireApprovalFor:[...n.requireApprovalFor],dryRunDefault:n.dryRunDefault}),ne.success("设置已保存")}catch(b){ne.error(b instanceof Error?b.message:String(b))}}return Fe(async()=>{await t.load(),h()}),(b,a)=>{const u=O("el-alert"),_=O("el-switch"),v=O("el-form-item"),N=O("el-form"),L=O("el-card"),E=O("el-tag"),$=O("el-table-column"),H=O("el-table"),M=O("el-option"),F=O("el-select"),m=O("el-button"),x=Je("loading");return w(),A("div",Ma,[a[10]||(a[10]=T("h2",{class:"page-title"},"设置",-1)),X(t).error?(w(),W(u,{key:0,title:X(t).error,type:"error",closable:!1,"show-icon":"",class:"mb"},null,8,["title"])):J("",!0),p(L,{shadow:"never",class:"mb"},{header:d(()=>[...a[2]||(a[2]=[I("默认行为",-1)])]),default:d(()=>[p(N,{"label-width":"180px","label-position":"left"},{default:d(()=>[p(v,{label:"写操作默认 dry-run 预览"},{default:d(()=>[p(_,{modelValue:n.dryRunDefault,"onUpdate:modelValue":a[0]||(a[0]=S=>n.dryRunDefault=S)},null,8,["modelValue"]),a[3]||(a[3]=T("span",{class:"form-tip"},"开启后所有写操作(MCP/CLI)默认只生成预览,不真正执行",-1))]),_:1})]),_:1})]),_:1}),p(L,{shadow:"never",class:"mb"},{header:d(()=>[T("div",za,[a[5]||(a[5]=T("span",null,"工具开关与风险等级",-1)),p(E,{size:"small",type:"warning",effect:"plain"},{default:d(()=>[...a[4]||(a[4]=[I("高危工具默认禁用,需在下方开启",-1)])]),_:1})])]),default:d(()=>[Xe((w(),W(H,{data:X(t).tools,size:"default"},{default:d(()=>[p($,{label:"工具",width:"230"},{default:d(({row:S})=>[T("span",Ha,P(S.name),1)]),_:1}),p($,{label:"风险",width:"90"},{default:d(({row:S})=>[p(E,{type:o(S.riskLevel),size:"small",effect:"dark"},{default:d(()=>[I(P(c(S.riskLevel)),1)]),_:2},1032,["type"])]),_:1}),p($,{label:"描述","min-width":"240"},{default:d(({row:S})=>[T("span",Ba,P(S.description),1)]),_:1}),p($,{label:"启用",width:"100",align:"center"},{default:d(({row:S})=>[p(_,{"model-value":!n.disabledTools.includes(S.name),onChange:z=>y(S,z===!0)},null,8,["model-value","onChange"])]),_:1})]),_:1},8,["data"])),[[x,X(t).loading]])]),_:1}),p(L,{shadow:"never",class:"mb"},{header:d(()=>[...a[6]||(a[6]=[I("审批规则",-1)])]),default:d(()=>[p(N,{"label-position":"top"},{default:d(()=>[p(v,{label:"执行前需要审批的工具(勾选后,执行时需在确认框中手工确认)"},{default:d(()=>[p(F,{modelValue:n.requireApprovalFor,"onUpdate:modelValue":a[1]||(a[1]=S=>n.requireApprovalFor=S),multiple:"",filterable:"","collapse-tags":"",placeholder:"选择需要审批的工具",style:{width:"100%"}},{default:d(()=>[(w(!0),A(se,null,be(r.value,S=>(w(),W(M,{key:S,label:S,value:S,disabled:n.disabledTools.includes(S)},null,8,["label","value","disabled"]))),128))]),_:1},8,["modelValue"]),a[7]||(a[7]=T("span",{class:"form-tip"},"审批仅对已启用的高危工具生效;禁用后自动移除",-1))]),_:1})]),_:1})]),_:1}),e.value?(w(),A("div",Ua,[p(m,{type:"primary",loading:X(t).saving,disabled:!l.value,onClick:k},{default:d(()=>[...a[8]||(a[8]=[I("保存设置",-1)])]),_:1},8,["loading","disabled"]),p(m,{disabled:!l.value,onClick:h},{default:d(()=>[...a[9]||(a[9]=[I("放弃修改",-1)])]),_:1},8,["disabled"])])):J("",!0)])}}}),ja=De(Wa,[["__scopeId","data-v-eb3ae411"]]),nn=Vn({history:Pn(),routes:[{path:"/",redirect:"/status"},{path:"/repos",name:"repos",component:ms,meta:{title:"仓库管理"}},{path:"/status",name:"status",component:da,meta:{title:"状态"}},{path:"/history",name:"history",component:Ea,meta:{title:"历史"}},{path:"/logs",name:"logs",component:Ra,meta:{title:"操作日志"}},{path:"/settings",name:"settings",component:ja,meta:{title:"设置"}}]});nn.afterEach(s=>{const t=s.meta.title;document.title=t?`${t} · Git Cockpit`:"Git Cockpit"});document.documentElement.classList.add("dark");const tt=On(ls);tt.use(An());tt.use(nn);tt.use(Fn,{size:"default"});tt.mount("#app");