prime-dev-cli 1.0.16 → 1.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/.next/BUILD_ID +1 -1
- package/dist/server/.next/app-build-manifest.json +2 -2
- package/dist/server/.next/build-manifest.json +2 -2
- package/dist/server/.next/cache/.rscinfo +1 -1
- package/dist/server/.next/cache/.tsbuildinfo +1 -1
- package/dist/server/.next/cache/eslint/.cache_1qa5vxt +1 -1
- package/dist/server/.next/fallback-build-manifest.json +2 -2
- package/dist/server/.next/next-minimal-server.js.nft.json +1 -1
- package/dist/server/.next/next-server.js.nft.json +1 -1
- package/dist/server/.next/prerender-manifest.json +9 -9
- package/dist/server/.next/server/app/_not-found.html +1 -1
- package/dist/server/.next/server/app/_not-found.rsc +1 -1
- package/dist/server/.next/server/app/configuration/page/app-build-manifest.json +1 -1
- package/dist/server/.next/server/app/configuration/page_client-reference-manifest.js +1 -1
- package/dist/server/.next/server/app/configuration.html +1 -1
- package/dist/server/.next/server/app/configuration.rsc +2 -2
- package/dist/server/.next/server/app/index.html +1 -1
- package/dist/server/.next/server/app/index.rsc +1 -1
- package/dist/server/.next/server/app/initialization/page/app-build-manifest.json +1 -1
- package/dist/server/.next/server/app/initialization/page_client-reference-manifest.js +1 -1
- package/dist/server/.next/server/app/initialization.html +1 -1
- package/dist/server/.next/server/app/initialization.rsc +2 -2
- package/dist/server/.next/server/chunks/[root-of-the-server]__072f5c45._.js +7 -7
- package/dist/server/.next/server/chunks/[root-of-the-server]__072f5c45._.js.map +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__7fc974c9._.js +10 -10
- package/dist/server/.next/server/chunks/[root-of-the-server]__7fc974c9._.js.map +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__899d82eb._.js +6 -6
- package/dist/server/.next/server/chunks/[root-of-the-server]__899d82eb._.js.map +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__f6d4fb58._.js +6 -6
- package/dist/server/.next/server/chunks/[root-of-the-server]__f6d4fb58._.js.map +1 -1
- package/dist/server/.next/server/chunks/ssr/_5d353cf8._.js +1 -1
- package/dist/server/.next/server/chunks/ssr/_5d353cf8._.js.map +1 -1
- package/dist/server/.next/server/chunks/ssr/packages_server_src_7cef6dbd._.js +1 -1
- package/dist/server/.next/server/chunks/ssr/packages_server_src_7cef6dbd._.js.map +1 -1
- package/dist/server/.next/server/pages/404.html +1 -1
- package/dist/server/.next/server/pages/500.html +1 -1
- package/dist/server/.next/server/server-reference-manifest.js +1 -1
- package/dist/server/.next/server/server-reference-manifest.json +1 -1
- package/dist/server/.next/static/chunks/{684226c5a0f22bc1.js → 5f8beee58a024d75.js} +2 -2
- package/dist/server/.next/static/chunks/{765c1fd313250591.js.map → 7e0a49ac2b139df9.js.map} +1 -1
- package/dist/server/.next/static/chunks/{2c0e57fbc9520adc.js → 9650e7136a9bfc30.js} +2 -2
- package/dist/server/.next/static/chunks/f31695470ae3a484.js.map +1 -0
- package/dist/server/.next/trace +1 -1
- package/package.json +1 -1
- package/dist/server/.next/static/chunks/2c669537f498f2db.js.map +0 -1
- /package/dist/server/.next/static/{bC3bTGQyq6cbRR_M7T8N6 → Xoig0sIWc0oIgbMH6U6Ew}/_buildManifest.js +0 -0
- /package/dist/server/.next/static/{bC3bTGQyq6cbRR_M7T8N6 → Xoig0sIWc0oIgbMH6U6Ew}/_clientMiddlewareManifest.json +0 -0
- /package/dist/server/.next/static/{bC3bTGQyq6cbRR_M7T8N6 → Xoig0sIWc0oIgbMH6U6Ew}/_ssgManifest.js +0 -0
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
module.exports={29549:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},30331:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},88941:e=>{"use strict";var{g:t,__dirname:s}=e;{e.s({PROJECT_CONFIG_PATH:()=>s,ProjectStatus:()=>
|
|
1
|
+
module.exports={29549:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},30331:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},88941:e=>{"use strict";var{g:t,__dirname:s}=e;{e.s({PROJECT_CONFIG_PATH:()=>s,ProjectStatus:()=>i,WORKSPACE_CONFIG:()=>t});var r=e.i(13442),n=e.i(30331);let t={WORKSPACE_ROOT:(0,n.join)((0,r.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,r.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},s=(0,n.join)((0,r.homedir)(),".prime-projects.json");var i=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e.INCOMPLETE="incomplete",e}({})}},83886:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("fs",()=>require("fs"))},87485:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("child_process",()=>require("child_process"))},77159:e=>{"use strict";var{g:t,__dirname:s}=e;e.s({checkMultipleProjectsExist:()=>f,checkProjectExists:()=>d,checkProjectStatus:()=>l,cleanupIncompleteProject:()=>m,cloneRepository:()=>c,createWorkspaceDirectory:()=>a,isValidGitUrl:()=>u,sanitizeProjectName:()=>p});var r=e.i(87485),n=e.i(83886),i=e.i(30331),o=e.i(88941);async function a(e){try{return(0,n.existsSync)(e)||(0,n.mkdirSync)(e,{recursive:!0}),{success:!0}}catch(e){return{success:!1,error:`创建工作空间目录失败: ${e instanceof Error?e.message:String(e)}`}}}async function c(e){let{repoUrl:t,targetDir:s,timeout:n,onProgress:a,onError:c,onLog:u}=e,p=(0,i.basename)(t,".git");return new Promise(e=>{let l=Date.now(),d={projectName:p,status:o.ProjectStatus.CLONING,progress:0,message:"开始克隆项目...",startTime:l};a?.(0,"开始克隆项目...");let g=(0,i.join)(s,p),m=["clone","--progress","--verbose",t,g];u?.(p,"stdout",`[开始克隆] 执行命令: git ${m.join(" ")}
|
|
2
2
|
`),u?.(p,"stdout",`[目标目录] ${g}
|
|
3
3
|
`),u?.(p,"stdout",`[仓库地址] ${t}
|
|
4
4
|
`);let f=(0,r.spawn)("git",m,{cwd:s,stdio:["pipe","pipe","pipe"]}),x="",j=0;u?.(p,"stdout",`[进程启动] Git 进程 PID: ${f.pid}
|
|
5
5
|
`);let y=setTimeout(()=>{u?.(p,"stderr",`[超时警告] Git 进程运行超过 ${n/1e3}s,即将终止
|
|
6
|
-
`),f.kill("SIGTERM");let t={...d,status:
|
|
7
|
-
`),
|
|
6
|
+
`),f.kill("SIGTERM");let t={...d,status:o.ProjectStatus.FAILED,progress:j,message:"克隆操作超时",error:`克隆操作超时 (${n/1e3}s)`,endTime:Date.now()};u?.(p,"stderr",`[进程终止] 克隆操作超时
|
|
7
|
+
`),c?.(`${p}: 克隆操作超时`),e(t)},n);f.stdout?.on("data",e=>{let t=e.toString();u?.(p,"stdout",t),j=Math.min(j+10,80),a?.(j,"正在克隆代码...")}),f.stderr?.on("data",e=>{let t=e.toString();x+=t,t.includes("remote:")||t.includes("Receiving objects")||t.includes("Resolving deltas")||t.includes("Counting objects")||t.includes("Enumerating objects")||t.includes("Compressing objects")||t.includes("upload-pack")||t.includes("POST git-")||t.includes("正克隆到")||t.includes("Cloning into")?u?.(p,"progress",t):u?.(p,"stderr",t),t.includes("Receiving objects")||t.includes("Resolving deltas")?(j=Math.min(j+5,90),a?.(j,"正在接收对象...")):t.includes("Counting objects")?(j=Math.min(j+2,70),a?.(j,"正在计算对象...")):t.includes("Enumerating objects")&&(j=Math.min(j+2,50),a?.(j,"正在枚举对象..."))}),f.on("close",t=>{clearTimeout(y);let s=Date.now(),r=s-l;if(u?.(p,"stdout",`[进程结束] Git 进程退出,代码: ${t},耗时: ${Math.round(r/1e3)}s
|
|
8
8
|
`),0===t){u?.(p,"stdout",`[克隆成功] 项目已成功克隆到: ${g}
|
|
9
|
-
`);let t={...d,status:
|
|
9
|
+
`);let t={...d,status:o.ProjectStatus.SUCCESS,progress:100,message:"克隆完成",endTime:s};a?.(100,"克隆完成"),e(t)}else{let r=function(e){let t=e.toLowerCase();return t.includes("authentication failed")||t.includes("access denied")?"身份验证失败,请检查仓库访问权限":t.includes("repository not found")||t.includes("not found")?"仓库不存在或无法访问":t.includes("network")||t.includes("connection")?"网络连接问题,请检查网络设置":t.includes("timeout")?"网络超时,请重试":t.includes("permission denied")?"权限被拒绝,请检查文件系统权限":t.includes("already exists")?"目标目录已存在":e.slice(0,200)+(e.length>200?"...":"")}(x);u?.(p,"stderr",`[克隆失败] 错误信息: ${r}
|
|
10
10
|
`),u?.(p,"stderr",`[完整错误输出]
|
|
11
11
|
${x}
|
|
12
|
-
`);let n={...d,status:
|
|
12
|
+
`);let n={...d,status:o.ProjectStatus.FAILED,progress:j,message:"克隆失败",error:r||`Git 进程退出,代码: ${t}`,endTime:s};c?.(`${p}: ${n.error}`),e(n)}}),f.on("error",t=>{clearTimeout(y),u?.(p,"stderr",`[进程错误] Git 进程启动失败: ${t.message}
|
|
13
13
|
`),u?.(p,"stderr",`[错误详情] ${t.stack||"No stack trace"}
|
|
14
|
-
`);let s={...d,status:
|
|
14
|
+
`);let s={...d,status:o.ProjectStatus.FAILED,progress:j,message:"进程启动失败",error:`进程启动失败: ${t.message}`,endTime:Date.now()};c?.(`${p}: ${t.message}`),e(s)})})}function u(e){return/^(https?:\/\/|git@)[^\s]+\.git$/i.test(e)}function p(e){return e.replace(/[^a-zA-Z0-9\-_]/g,"")}async function l(e,t){try{let s=(0,i.join)(e,t);if(!(0,n.existsSync)(s))return{exists:!1,status:"not_exists",needsCleanup:!1};let r=(0,i.join)(s,".git");if(!(0,n.existsSync)(r))return{exists:!0,status:"incomplete",needsCleanup:!0};if(!await g(s))return console.log(`检测到不完整的Git仓库: ${s}`),{exists:!0,status:"incomplete",needsCleanup:!0};return{exists:!0,status:"complete",needsCleanup:!1}}catch(e){return console.error(`检查项目 ${t} 状态时出错:`,e),{exists:!1,status:"not_exists",needsCleanup:!1}}}async function d(e,t){return"complete"===(await l(e,t)).status}async function g(e){try{let t=(0,i.join)(e,".git");for(let e of["HEAD","config","refs"]){let s=(0,i.join)(t,e);if(!(0,n.existsSync)(s))return!1}let s=(await n.promises.readdir(e)).filter(e=>".git"!==e);if(0===s.length)return!1;let r=(0,i.join)(t,"HEAD"),o=await n.promises.readFile(r,"utf-8");if(!o.trim()||o.includes("unborn"))return!1;return!0}catch(e){return console.error("检查Git仓库完整性时出错:",e),!1}}async function m(e){try{console.log(`正在清理不完整的项目: ${e}`),await n.promises.rm(e,{recursive:!0,force:!0}),console.log(`清理完成: ${e}`)}catch(t){console.error(`清理项目失败 ${e}:`,t)}}async function f(e,t){let s={},r=t.map(async t=>{let r=await d(e,t);s[t]=r});return await Promise.all(r),s}},19294:function(e){var{g:t,__dirname:s,m:r,e:n}=e},18089:e=>{"use strict";var{g:t,__dirname:s}=e;e.s({POST:()=>a});var r=e.i(88941),n=e.i(77159),i=e.i(83886),o=e.i(30331);async function a(e){try{let{projectName:t}=await e.json();if(!t||"string"!=typeof t)return new Response(JSON.stringify({success:!1,error:"项目名称是必需的"}),{status:400,headers:{"Content-Type":"application/json"}});if((0,n.sanitizeProjectName)(t)!==t)return new Response(JSON.stringify({success:!1,error:"项目名称包含无效字符"}),{status:400,headers:{"Content-Type":"application/json"}});let s=r.WORKSPACE_CONFIG.WORKSPACE_ROOT,a=(0,o.join)(s,t);if(!(0,i.existsSync)(a))return new Response(JSON.stringify({success:!1,error:"项目目录不存在",projectName:t,projectPath:a}),{status:404,headers:{"Content-Type":"application/json"}});return new Response(JSON.stringify({success:!0,projectPath:a,cursorUrl:`cursor://file${a}`}),{status:200,headers:{"Content-Type":"application/json"}})}catch(t){let e=t instanceof Error?t.message:String(t);return console.error("获取项目路径失败:",t),new Response(JSON.stringify({success:!1,error:`获取项目路径失败: ${e}`}),{status:500,headers:{"Content-Type":"application/json"}})}}},4550:e=>{"use strict";var{g:t,__dirname:s}=e;{e.s({patchFetch:()=>a,routeModule:()=>t,serverHooks:()=>u,workAsyncStorage:()=>s,workUnitAsyncStorage:()=>c});var r=e.i(45746),n=e.i(93828),i=e.i(18250),o=e.i(18089);let t=new r.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/open-project/route",pathname:"/api/open-project",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/open-project/route.ts",nextConfigOutput:"",userland:o}),{workAsyncStorage:s,workUnitAsyncStorage:c,serverHooks:u}=t;function a(){return(0,i.patchFetch)({workAsyncStorage:s,workUnitAsyncStorage:c})}}}};
|
|
15
15
|
|
|
16
16
|
//# sourceMappingURL=%5Broot-of-the-server%5D__f6d4fb58._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/git-operations.ts","turbopack:///[project]/packages/server/src/app/api/open-project/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { spawn, ChildProcess } from 'child_process';\nimport { existsSync, mkdirSync } from 'fs';\nimport { promises as fs } from 'fs';\nimport { join, basename } from 'path';\nimport {\n ProjectStatus,\n type GitOperationConfig,\n type ProjectProgress,\n} from './workspace-types';\n\n/**\n * 创建工作空间目录\n * @param workspacePath 工作空间路径\n * @returns 创建结果\n */\nexport async function createWorkspaceDirectory(workspacePath: string): Promise<{ success: boolean; error?: string }> {\n try {\n if (!existsSync(workspacePath)) {\n mkdirSync(workspacePath, { recursive: true });\n }\n return { success: true };\n } catch (error) {\n return { \n success: false, \n error: `创建工作空间目录失败: ${error instanceof Error ? error.message : String(error)}` \n };\n }\n}\n\n/**\n * 执行 Git 克隆操作\n * @param config Git 操作配置\n * @returns Promise<ProjectProgress>\n */\nexport async function cloneRepository(config: GitOperationConfig): Promise<ProjectProgress> {\n const { repoUrl, targetDir, timeout, onProgress, onError, onLog } = config;\n const projectName = basename(repoUrl, '.git');\n \n return new Promise<ProjectProgress>((resolve) => {\n const startTime = Date.now();\n \n // 更新开始状态\n const initialProgress: ProjectProgress = {\n projectName,\n status: ProjectStatus.CLONING,\n progress: 0,\n message: '开始克隆项目...',\n startTime,\n };\n onProgress?.(0, '开始克隆项目...');\n\n // 执行 git clone 命令\n const targetPath = join(targetDir, projectName);\n // 添加 --progress 参数来强制显示进度,--verbose 显示详细信息\n const gitArgs = ['clone', '--progress', '--verbose', repoUrl, targetPath];\n \n // 记录命令启动信息\n onLog?.(projectName, 'stdout', `[开始克隆] 执行命令: git ${gitArgs.join(' ')}\\n`);\n onLog?.(projectName, 'stdout', `[目标目录] ${targetPath}\\n`);\n onLog?.(projectName, 'stdout', `[仓库地址] ${repoUrl}\\n`);\n \n const gitProcess: ChildProcess = spawn('git', gitArgs, {\n cwd: targetDir,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let errorOutput = '';\n let progressValue = 0;\n \n // 记录进程启动成功\n onLog?.(projectName, 'stdout', `[进程启动] Git 进程 PID: ${gitProcess.pid}\\n`);\n\n // 设置超时\n const timeoutId = setTimeout(() => {\n onLog?.(projectName, 'stderr', `[超时警告] Git 进程运行超过 ${timeout / 1000}s,即将终止\\n`);\n gitProcess.kill('SIGTERM');\n \n const errorResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '克隆操作超时',\n error: `克隆操作超时 (${timeout / 1000}s)`,\n endTime: Date.now(),\n };\n onLog?.(projectName, 'stderr', `[进程终止] 克隆操作超时\\n`);\n onError?.(`${projectName}: 克隆操作超时`);\n resolve(errorResult);\n }, timeout);\n\n // 处理标准输出\n gitProcess.stdout?.on('data', (data: Buffer) => {\n const stdoutText = data.toString();\n \n // 实时发送日志\n onLog?.(projectName, 'stdout', stdoutText);\n \n // 模拟进度更新(Git 克隆没有内置进度,这里基于时间估算)\n progressValue = Math.min(progressValue + 10, 80);\n onProgress?.(progressValue, '正在克隆代码...');\n });\n\n // 处理错误输出\n gitProcess.stderr?.on('data', (data: Buffer) => {\n const stderrText = data.toString();\n errorOutput += stderrText;\n \n // 判断是进度信息还是错误信息\n const isProgressInfo = stderrText.includes('remote:') || \n stderrText.includes('Receiving objects') || \n stderrText.includes('Resolving deltas') ||\n stderrText.includes('Counting objects') ||\n stderrText.includes('Enumerating objects') ||\n stderrText.includes('Compressing objects') ||\n stderrText.includes('upload-pack') ||\n stderrText.includes('POST git-') ||\n stderrText.includes('正克隆到') ||\n stderrText.includes('Cloning into');\n \n // 根据内容类型发送不同的日志\n if (isProgressInfo) {\n onLog?.(projectName, 'progress', stderrText);\n } else {\n onLog?.(projectName, 'stderr', stderrText);\n }\n \n // Git 的进度信息通常在 stderr 中\n if (stderrText.includes('Receiving objects') || stderrText.includes('Resolving deltas')) {\n progressValue = Math.min(progressValue + 5, 90);\n onProgress?.(progressValue, '正在接收对象...');\n } else if (stderrText.includes('Counting objects')) {\n progressValue = Math.min(progressValue + 2, 70);\n onProgress?.(progressValue, '正在计算对象...');\n } else if (stderrText.includes('Enumerating objects')) {\n progressValue = Math.min(progressValue + 2, 50);\n onProgress?.(progressValue, '正在枚举对象...');\n }\n });\n\n // 处理进程结束\n gitProcess.on('close', (code: number | null) => {\n clearTimeout(timeoutId);\n const endTime = Date.now();\n const duration = endTime - startTime;\n \n onLog?.(projectName, 'stdout', `[进程结束] Git 进程退出,代码: ${code},耗时: ${Math.round(duration / 1000)}s\\n`);\n \n if (code === 0) {\n // 克隆成功\n onLog?.(projectName, 'stdout', `[克隆成功] 项目已成功克隆到: ${targetPath}\\n`);\n const successResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.SUCCESS,\n progress: 100,\n message: '克隆完成',\n endTime,\n };\n onProgress?.(100, '克隆完成');\n resolve(successResult);\n } else {\n // 克隆失败\n const parsedError = parseGitError(errorOutput);\n onLog?.(projectName, 'stderr', `[克隆失败] 错误信息: ${parsedError}\\n`);\n onLog?.(projectName, 'stderr', `[完整错误输出]\\n${errorOutput}\\n`);\n \n const failureResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '克隆失败',\n error: parsedError || `Git 进程退出,代码: ${code}`,\n endTime,\n };\n onError?.(`${projectName}: ${failureResult.error}`);\n resolve(failureResult);\n }\n });\n\n // 处理进程错误\n gitProcess.on('error', (error: Error) => {\n clearTimeout(timeoutId);\n onLog?.(projectName, 'stderr', `[进程错误] Git 进程启动失败: ${error.message}\\n`);\n onLog?.(projectName, 'stderr', `[错误详情] ${error.stack || 'No stack trace'}\\n`);\n \n const errorResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '进程启动失败',\n error: `进程启动失败: ${error.message}`,\n endTime: Date.now(),\n };\n onError?.(`${projectName}: ${error.message}`);\n resolve(errorResult);\n });\n });\n}\n\n/**\n * 解析 Git 错误信息,提供用户友好的错误描述\n * @param errorOutput Git stderr 输出\n * @returns 用户友好的错误描述\n */\nfunction parseGitError(errorOutput: string): string {\n const lowerOutput = errorOutput.toLowerCase();\n \n if (lowerOutput.includes('authentication failed') || lowerOutput.includes('access denied')) {\n return '身份验证失败,请检查仓库访问权限';\n }\n \n if (lowerOutput.includes('repository not found') || lowerOutput.includes('not found')) {\n return '仓库不存在或无法访问';\n }\n \n if (lowerOutput.includes('network') || lowerOutput.includes('connection')) {\n return '网络连接问题,请检查网络设置';\n }\n \n if (lowerOutput.includes('timeout')) {\n return '网络超时,请重试';\n }\n \n if (lowerOutput.includes('permission denied')) {\n return '权限被拒绝,请检查文件系统权限';\n }\n \n if (lowerOutput.includes('already exists')) {\n return '目标目录已存在';\n }\n \n // 返回原始错误的前200个字符\n return errorOutput.slice(0, 200) + (errorOutput.length > 200 ? '...' : '');\n}\n\n/**\n * 验证 Git 仓库 URL 格式\n * @param url Git 仓库 URL\n * @returns 是否有效\n */\nexport function isValidGitUrl(url: string): boolean {\n const gitUrlPattern = /^(https?:\\/\\/|git@)[^\\s]+\\.git$/i;\n return gitUrlPattern.test(url);\n}\n\n/**\n * 清理项目名称,移除不安全字符\n * @param projectName 项目名称\n * @returns 清理后的项目名称\n */\nexport function sanitizeProjectName(projectName: string): string {\n return projectName.replace(/[^a-zA-Z0-9\\-_]/g, '');\n}\n\n/**\n * 项目检查结果类型\n */\nexport type ProjectCheckResult = {\n exists: boolean;\n status: 'not_exists' | 'complete' | 'incomplete';\n needsCleanup: boolean;\n};\n\n/**\n * 检查项目状态(详细版本)\n * @param workspacePath 工作空间路径\n * @param projectName 项目名称\n * @returns Promise<ProjectCheckResult> 详细的项目状态\n */\nexport async function checkProjectStatus(workspacePath: string, projectName: string): Promise<ProjectCheckResult> {\n try {\n const projectPath = join(workspacePath, projectName);\n \n // 检查项目目录是否存在\n if (!existsSync(projectPath)) {\n return {\n exists: false,\n status: 'not_exists',\n needsCleanup: false\n };\n }\n \n // 检查是否为 Git 仓库(存在 .git 目录)\n const gitPath = join(projectPath, '.git');\n if (!existsSync(gitPath)) {\n return {\n exists: true,\n status: 'incomplete',\n needsCleanup: true\n };\n }\n \n // 更严格的完整性检查\n const isComplete = await isGitRepositoryComplete(projectPath);\n if (!isComplete) {\n console.log(`检测到不完整的Git仓库: ${projectPath}`);\n return {\n exists: true,\n status: 'incomplete',\n needsCleanup: true\n };\n }\n \n return {\n exists: true,\n status: 'complete',\n needsCleanup: false\n };\n } catch (error) {\n console.error(`检查项目 ${projectName} 状态时出错:`, error);\n return {\n exists: false,\n status: 'not_exists',\n needsCleanup: false\n };\n }\n}\n\n/**\n * 检查项目是否已存在于工作空间中(兼容版本)\n * @param workspacePath 工作空间路径\n * @param projectName 项目名称\n * @returns Promise<boolean> 项目是否存在且为有效的 Git 仓库\n */\nexport async function checkProjectExists(workspacePath: string, projectName: string): Promise<boolean> {\n const result = await checkProjectStatus(workspacePath, projectName);\n return result.status === 'complete';\n}\n\n/**\n * 检查Git仓库是否完整\n * @param projectPath 项目路径\n * @returns Promise<boolean> 仓库是否完整\n */\nasync function isGitRepositoryComplete(projectPath: string): Promise<boolean> {\n try {\n const gitPath = join(projectPath, '.git');\n \n // 检查关键的Git文件是否存在\n const requiredFiles = ['HEAD', 'config', 'refs'];\n for (const file of requiredFiles) {\n const filePath = join(gitPath, file);\n if (!existsSync(filePath)) {\n return false;\n }\n }\n \n // 检查是否有实际的项目文件(不只是.git目录)\n const entries = await fs.readdir(projectPath);\n const nonGitFiles = entries.filter((entry: string) => entry !== '.git');\n \n // 如果只有.git目录,说明克隆未完成\n if (nonGitFiles.length === 0) {\n return false;\n }\n \n // 检查HEAD文件是否有效\n const headPath = join(gitPath, 'HEAD');\n const headContent = await fs.readFile(headPath, 'utf-8');\n if (!headContent.trim() || headContent.includes('unborn')) {\n return false;\n }\n \n return true;\n } catch (error) {\n console.error('检查Git仓库完整性时出错:', error);\n return false;\n }\n}\n\n/**\n * 清理不完整的项目目录\n * @param projectPath 项目路径\n */\nexport async function cleanupIncompleteProject(projectPath: string): Promise<void> {\n try {\n console.log(`正在清理不完整的项目: ${projectPath}`);\n await fs.rm(projectPath, { recursive: true, force: true });\n console.log(`清理完成: ${projectPath}`);\n } catch (error) {\n console.error(`清理项目失败 ${projectPath}:`, error);\n // 清理失败不抛出错误,避免阻塞后续流程\n }\n}\n\n/**\n * 批量检查多个项目的存在状态\n * @param workspacePath 工作空间路径\n * @param projectNames 项目名称列表\n * @returns Promise<Record<string, boolean>> 项目名称到存在状态的映射\n */\nexport async function checkMultipleProjectsExist(\n workspacePath: string, \n projectNames: string[]\n): Promise<Record<string, boolean>> {\n const results: Record<string, boolean> = {};\n \n // 并行检查所有项目\n const checks = projectNames.map(async (projectName) => {\n const exists = await checkProjectExists(workspacePath, projectName);\n results[projectName] = exists;\n });\n \n await Promise.all(checks);\n return results;\n}\n\n/**\n * 在 Cursor 中打开项目\n * @param projectPath 项目的绝对路径\n * @returns Promise<{ success: boolean; error?: string }>\n */\nexport async function openProjectInCursor(projectPath: string): Promise<{ success: boolean; error?: string }> {\n return new Promise((resolve) => {\n // 验证项目路径存在\n if (!existsSync(projectPath)) {\n resolve({\n success: false,\n error: `项目路径不存在: ${projectPath}`\n });\n return;\n }\n\n // 执行 cursor 命令\n const cursorProcess = spawn('cursor', [projectPath], {\n stdio: ['ignore', 'pipe', 'pipe'],\n detached: true, // 让进程在后台独立运行\n env: {\n ...process.env,\n NODE_ENV: 'development', // 强制设置为开发模式\n }\n });\n\n let errorOutput = '';\n\n // 设置超时(10秒)\n const timeoutId = setTimeout(() => {\n cursorProcess.kill('SIGTERM');\n resolve({\n success: false,\n error: 'Cursor 命令执行超时'\n });\n }, 10000);\n\n // 处理错误输出\n cursorProcess.stderr?.on('data', (data: Buffer) => {\n errorOutput += data.toString();\n });\n\n // 处理进程退出\n cursorProcess.on('exit', (code: number | null) => {\n clearTimeout(timeoutId);\n \n if (code === 0) {\n resolve({ success: true });\n } else {\n resolve({\n success: false,\n error: `Cursor 退出代码: ${code}${errorOutput ? `, 错误: ${errorOutput}` : ''}`\n });\n }\n });\n\n // 处理进程错误(如命令不存在)\n cursorProcess.on('error', (error: Error) => {\n clearTimeout(timeoutId);\n \n if (error.message.includes('ENOENT')) {\n resolve({\n success: false,\n error: 'Cursor 命令未找到,请确保 Cursor CLI 已正确安装并在 PATH 中'\n });\n } else {\n resolve({\n success: false,\n error: `启动 Cursor 失败: ${error.message}`\n });\n }\n });\n\n // 让进程独立运行,不等待其完成\n cursorProcess.unref();\n });\n} ","import { NextRequest } from 'next/server';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { openProjectInCursor, sanitizeProjectName } from '@/lib/git-operations';\nimport { join } from 'path';\n\n/**\n * 在 Cursor 中打开项目 API 端点\n */\nexport async function POST(request: NextRequest) {\n try {\n const body = await request.json();\n const { projectName } = body;\n\n // 验证项目名称\n if (!projectName || typeof projectName !== 'string') {\n return new Response(\n JSON.stringify({ \n success: false, \n error: '项目名称是必需的' \n }),\n { \n status: 400,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n }\n\n // 清理项目名称,防止路径遍历攻击\n const cleanProjectName = sanitizeProjectName(projectName);\n if (cleanProjectName !== projectName) {\n return new Response(\n JSON.stringify({ \n success: false, \n error: '项目名称包含无效字符' \n }),\n { \n status: 400,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n }\n\n // 构造项目路径\n const workspacePath = WORKSPACE_CONFIG.WORKSPACE_ROOT;\n const projectPath = join(workspacePath, projectName);\n\n // 执行打开操作\n const result = await openProjectInCursor(projectPath);\n\n if (result.success) {\n return new Response(\n JSON.stringify({ \n success: true, \n message: `项目 ${projectName} 已在 Cursor 中打开`,\n projectPath \n }),\n { \n status: 200,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n } else {\n return new Response(\n JSON.stringify({ \n success: false, \n error: result.error,\n projectName,\n projectPath\n }),\n { \n status: 500,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n }\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(\"打开项目失败:\", error);\n \n return new Response(\n JSON.stringify({ \n success: false, \n error: `打开项目失败: ${errorMessage}` \n }),\n { \n status: 500,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n }\n}","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[3]}
|
|
1
|
+
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/git-operations.ts","turbopack:///[project]/packages/server/src/app/api/open-project/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { spawn, ChildProcess } from 'child_process';\nimport { existsSync, mkdirSync } from 'fs';\nimport { promises as fs } from 'fs';\nimport { join, basename } from 'path';\nimport {\n ProjectStatus,\n type GitOperationConfig,\n type ProjectProgress,\n} from './workspace-types';\n\n/**\n * 创建工作空间目录\n * @param workspacePath 工作空间路径\n * @returns 创建结果\n */\nexport async function createWorkspaceDirectory(workspacePath: string): Promise<{ success: boolean; error?: string }> {\n try {\n if (!existsSync(workspacePath)) {\n mkdirSync(workspacePath, { recursive: true });\n }\n return { success: true };\n } catch (error) {\n return { \n success: false, \n error: `创建工作空间目录失败: ${error instanceof Error ? error.message : String(error)}` \n };\n }\n}\n\n/**\n * 执行 Git 克隆操作\n * @param config Git 操作配置\n * @returns Promise<ProjectProgress>\n */\nexport async function cloneRepository(config: GitOperationConfig): Promise<ProjectProgress> {\n const { repoUrl, targetDir, timeout, onProgress, onError, onLog } = config;\n const projectName = basename(repoUrl, '.git');\n \n return new Promise<ProjectProgress>((resolve) => {\n const startTime = Date.now();\n \n // 更新开始状态\n const initialProgress: ProjectProgress = {\n projectName,\n status: ProjectStatus.CLONING,\n progress: 0,\n message: '开始克隆项目...',\n startTime,\n };\n onProgress?.(0, '开始克隆项目...');\n\n // 执行 git clone 命令\n const targetPath = join(targetDir, projectName);\n // 添加 --progress 参数来强制显示进度,--verbose 显示详细信息\n const gitArgs = ['clone', '--progress', '--verbose', repoUrl, targetPath];\n \n // 记录命令启动信息\n onLog?.(projectName, 'stdout', `[开始克隆] 执行命令: git ${gitArgs.join(' ')}\\n`);\n onLog?.(projectName, 'stdout', `[目标目录] ${targetPath}\\n`);\n onLog?.(projectName, 'stdout', `[仓库地址] ${repoUrl}\\n`);\n \n const gitProcess: ChildProcess = spawn('git', gitArgs, {\n cwd: targetDir,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let errorOutput = '';\n let progressValue = 0;\n \n // 记录进程启动成功\n onLog?.(projectName, 'stdout', `[进程启动] Git 进程 PID: ${gitProcess.pid}\\n`);\n\n // 设置超时\n const timeoutId = setTimeout(() => {\n onLog?.(projectName, 'stderr', `[超时警告] Git 进程运行超过 ${timeout / 1000}s,即将终止\\n`);\n gitProcess.kill('SIGTERM');\n \n const errorResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '克隆操作超时',\n error: `克隆操作超时 (${timeout / 1000}s)`,\n endTime: Date.now(),\n };\n onLog?.(projectName, 'stderr', `[进程终止] 克隆操作超时\\n`);\n onError?.(`${projectName}: 克隆操作超时`);\n resolve(errorResult);\n }, timeout);\n\n // 处理标准输出\n gitProcess.stdout?.on('data', (data: Buffer) => {\n const stdoutText = data.toString();\n \n // 实时发送日志\n onLog?.(projectName, 'stdout', stdoutText);\n \n // 模拟进度更新(Git 克隆没有内置进度,这里基于时间估算)\n progressValue = Math.min(progressValue + 10, 80);\n onProgress?.(progressValue, '正在克隆代码...');\n });\n\n // 处理错误输出\n gitProcess.stderr?.on('data', (data: Buffer) => {\n const stderrText = data.toString();\n errorOutput += stderrText;\n \n // 判断是进度信息还是错误信息\n const isProgressInfo = stderrText.includes('remote:') || \n stderrText.includes('Receiving objects') || \n stderrText.includes('Resolving deltas') ||\n stderrText.includes('Counting objects') ||\n stderrText.includes('Enumerating objects') ||\n stderrText.includes('Compressing objects') ||\n stderrText.includes('upload-pack') ||\n stderrText.includes('POST git-') ||\n stderrText.includes('正克隆到') ||\n stderrText.includes('Cloning into');\n \n // 根据内容类型发送不同的日志\n if (isProgressInfo) {\n onLog?.(projectName, 'progress', stderrText);\n } else {\n onLog?.(projectName, 'stderr', stderrText);\n }\n \n // Git 的进度信息通常在 stderr 中\n if (stderrText.includes('Receiving objects') || stderrText.includes('Resolving deltas')) {\n progressValue = Math.min(progressValue + 5, 90);\n onProgress?.(progressValue, '正在接收对象...');\n } else if (stderrText.includes('Counting objects')) {\n progressValue = Math.min(progressValue + 2, 70);\n onProgress?.(progressValue, '正在计算对象...');\n } else if (stderrText.includes('Enumerating objects')) {\n progressValue = Math.min(progressValue + 2, 50);\n onProgress?.(progressValue, '正在枚举对象...');\n }\n });\n\n // 处理进程结束\n gitProcess.on('close', (code: number | null) => {\n clearTimeout(timeoutId);\n const endTime = Date.now();\n const duration = endTime - startTime;\n \n onLog?.(projectName, 'stdout', `[进程结束] Git 进程退出,代码: ${code},耗时: ${Math.round(duration / 1000)}s\\n`);\n \n if (code === 0) {\n // 克隆成功\n onLog?.(projectName, 'stdout', `[克隆成功] 项目已成功克隆到: ${targetPath}\\n`);\n const successResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.SUCCESS,\n progress: 100,\n message: '克隆完成',\n endTime,\n };\n onProgress?.(100, '克隆完成');\n resolve(successResult);\n } else {\n // 克隆失败\n const parsedError = parseGitError(errorOutput);\n onLog?.(projectName, 'stderr', `[克隆失败] 错误信息: ${parsedError}\\n`);\n onLog?.(projectName, 'stderr', `[完整错误输出]\\n${errorOutput}\\n`);\n \n const failureResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '克隆失败',\n error: parsedError || `Git 进程退出,代码: ${code}`,\n endTime,\n };\n onError?.(`${projectName}: ${failureResult.error}`);\n resolve(failureResult);\n }\n });\n\n // 处理进程错误\n gitProcess.on('error', (error: Error) => {\n clearTimeout(timeoutId);\n onLog?.(projectName, 'stderr', `[进程错误] Git 进程启动失败: ${error.message}\\n`);\n onLog?.(projectName, 'stderr', `[错误详情] ${error.stack || 'No stack trace'}\\n`);\n \n const errorResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '进程启动失败',\n error: `进程启动失败: ${error.message}`,\n endTime: Date.now(),\n };\n onError?.(`${projectName}: ${error.message}`);\n resolve(errorResult);\n });\n });\n}\n\n/**\n * 解析 Git 错误信息,提供用户友好的错误描述\n * @param errorOutput Git stderr 输出\n * @returns 用户友好的错误描述\n */\nfunction parseGitError(errorOutput: string): string {\n const lowerOutput = errorOutput.toLowerCase();\n \n if (lowerOutput.includes('authentication failed') || lowerOutput.includes('access denied')) {\n return '身份验证失败,请检查仓库访问权限';\n }\n \n if (lowerOutput.includes('repository not found') || lowerOutput.includes('not found')) {\n return '仓库不存在或无法访问';\n }\n \n if (lowerOutput.includes('network') || lowerOutput.includes('connection')) {\n return '网络连接问题,请检查网络设置';\n }\n \n if (lowerOutput.includes('timeout')) {\n return '网络超时,请重试';\n }\n \n if (lowerOutput.includes('permission denied')) {\n return '权限被拒绝,请检查文件系统权限';\n }\n \n if (lowerOutput.includes('already exists')) {\n return '目标目录已存在';\n }\n \n // 返回原始错误的前200个字符\n return errorOutput.slice(0, 200) + (errorOutput.length > 200 ? '...' : '');\n}\n\n/**\n * 验证 Git 仓库 URL 格式\n * @param url Git 仓库 URL\n * @returns 是否有效\n */\nexport function isValidGitUrl(url: string): boolean {\n const gitUrlPattern = /^(https?:\\/\\/|git@)[^\\s]+\\.git$/i;\n return gitUrlPattern.test(url);\n}\n\n/**\n * 清理项目名称,移除不安全字符\n * @param projectName 项目名称\n * @returns 清理后的项目名称\n */\nexport function sanitizeProjectName(projectName: string): string {\n return projectName.replace(/[^a-zA-Z0-9\\-_]/g, '');\n}\n\n/**\n * 项目检查结果类型\n */\nexport type ProjectCheckResult = {\n exists: boolean;\n status: 'not_exists' | 'complete' | 'incomplete';\n needsCleanup: boolean;\n};\n\n/**\n * 检查项目状态(详细版本)\n * @param workspacePath 工作空间路径\n * @param projectName 项目名称\n * @returns Promise<ProjectCheckResult> 详细的项目状态\n */\nexport async function checkProjectStatus(workspacePath: string, projectName: string): Promise<ProjectCheckResult> {\n try {\n const projectPath = join(workspacePath, projectName);\n \n // 检查项目目录是否存在\n if (!existsSync(projectPath)) {\n return {\n exists: false,\n status: 'not_exists',\n needsCleanup: false\n };\n }\n \n // 检查是否为 Git 仓库(存在 .git 目录)\n const gitPath = join(projectPath, '.git');\n if (!existsSync(gitPath)) {\n return {\n exists: true,\n status: 'incomplete',\n needsCleanup: true\n };\n }\n \n // 更严格的完整性检查\n const isComplete = await isGitRepositoryComplete(projectPath);\n if (!isComplete) {\n console.log(`检测到不完整的Git仓库: ${projectPath}`);\n return {\n exists: true,\n status: 'incomplete',\n needsCleanup: true\n };\n }\n \n return {\n exists: true,\n status: 'complete',\n needsCleanup: false\n };\n } catch (error) {\n console.error(`检查项目 ${projectName} 状态时出错:`, error);\n return {\n exists: false,\n status: 'not_exists',\n needsCleanup: false\n };\n }\n}\n\n/**\n * 检查项目是否已存在于工作空间中(兼容版本)\n * @param workspacePath 工作空间路径\n * @param projectName 项目名称\n * @returns Promise<boolean> 项目是否存在且为有效的 Git 仓库\n */\nexport async function checkProjectExists(workspacePath: string, projectName: string): Promise<boolean> {\n const result = await checkProjectStatus(workspacePath, projectName);\n return result.status === 'complete';\n}\n\n/**\n * 检查Git仓库是否完整\n * @param projectPath 项目路径\n * @returns Promise<boolean> 仓库是否完整\n */\nasync function isGitRepositoryComplete(projectPath: string): Promise<boolean> {\n try {\n const gitPath = join(projectPath, '.git');\n \n // 检查关键的Git文件是否存在\n const requiredFiles = ['HEAD', 'config', 'refs'];\n for (const file of requiredFiles) {\n const filePath = join(gitPath, file);\n if (!existsSync(filePath)) {\n return false;\n }\n }\n \n // 检查是否有实际的项目文件(不只是.git目录)\n const entries = await fs.readdir(projectPath);\n const nonGitFiles = entries.filter((entry: string) => entry !== '.git');\n \n // 如果只有.git目录,说明克隆未完成\n if (nonGitFiles.length === 0) {\n return false;\n }\n \n // 检查HEAD文件是否有效\n const headPath = join(gitPath, 'HEAD');\n const headContent = await fs.readFile(headPath, 'utf-8');\n if (!headContent.trim() || headContent.includes('unborn')) {\n return false;\n }\n \n return true;\n } catch (error) {\n console.error('检查Git仓库完整性时出错:', error);\n return false;\n }\n}\n\n/**\n * 清理不完整的项目目录\n * @param projectPath 项目路径\n */\nexport async function cleanupIncompleteProject(projectPath: string): Promise<void> {\n try {\n console.log(`正在清理不完整的项目: ${projectPath}`);\n await fs.rm(projectPath, { recursive: true, force: true });\n console.log(`清理完成: ${projectPath}`);\n } catch (error) {\n console.error(`清理项目失败 ${projectPath}:`, error);\n // 清理失败不抛出错误,避免阻塞后续流程\n }\n}\n\n/**\n * 批量检查多个项目的存在状态\n * @param workspacePath 工作空间路径\n * @param projectNames 项目名称列表\n * @returns Promise<Record<string, boolean>> 项目名称到存在状态的映射\n */\nexport async function checkMultipleProjectsExist(\n workspacePath: string, \n projectNames: string[]\n): Promise<Record<string, boolean>> {\n const results: Record<string, boolean> = {};\n \n // 并行检查所有项目\n const checks = projectNames.map(async (projectName) => {\n const exists = await checkProjectExists(workspacePath, projectName);\n results[projectName] = exists;\n });\n \n await Promise.all(checks);\n return results;\n} ","import { NextRequest } from 'next/server';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { sanitizeProjectName } from '@/lib/git-operations';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\n\n/**\n * 获取项目路径 API 端点\n * 返回项目路径,由前端使用 cursor:// schema 协议打开\n */\nexport async function POST(request: NextRequest) {\n try {\n const body = await request.json();\n const { projectName } = body;\n\n // 验证项目名称\n if (!projectName || typeof projectName !== 'string') {\n return new Response(\n JSON.stringify({ \n success: false, \n error: '项目名称是必需的' \n }),\n { \n status: 400,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n }\n\n // 清理项目名称,防止路径遍历攻击\n const cleanProjectName = sanitizeProjectName(projectName);\n if (cleanProjectName !== projectName) {\n return new Response(\n JSON.stringify({ \n success: false, \n error: '项目名称包含无效字符' \n }),\n { \n status: 400,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n }\n\n // 构造项目路径\n const workspacePath = WORKSPACE_CONFIG.WORKSPACE_ROOT;\n const projectPath = join(workspacePath, projectName);\n\n // 验证项目目录是否存在\n if (!existsSync(projectPath)) {\n return new Response(\n JSON.stringify({ \n success: false, \n error: '项目目录不存在',\n projectName,\n projectPath\n }),\n { \n status: 404,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n }\n\n // 返回项目路径,由前端使用 cursor:// schema 协议打开\n return new Response(\n JSON.stringify({ \n success: true, \n projectPath,\n // 生成 cursor://file URL\n // 格式: cursor://file/absolute/path/to/folder\n cursorUrl: `cursor://file${projectPath}`,\n }),\n { \n status: 200,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(\"获取项目路径失败:\", error);\n \n return new Response(\n JSON.stringify({ \n success: false, \n error: `获取项目路径失败: ${errorMessage}` \n }),\n { \n status: 500,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n }\n}","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[3]}
|
|
@@ -2,7 +2,7 @@ module.exports={94491:a=>{"use strict";var{g:b,__dirname:c}=a;function d(a,b,{ch
|
|
|
2
2
|
|
|
3
3
|
If you want to hide the \`${b.titleName}\`, you can wrap it with our VisuallyHidden component.
|
|
4
4
|
|
|
5
|
-
For more information, see https://radix-ui.com/primitives/docs/components/${b.docsSlug}`;return(0,d.useEffect)(()=>{a&&(document.getElementById(a)||console.error(c))},[c,a]),null},Z=({contentRef:a,descriptionId:b})=>{let c=X("DialogDescriptionWarning"),e=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${c.contentName}}.`;return(0,d.useEffect)(()=>{let c=a.current?.getAttribute("aria-describedby");b&&c&&(document.getElementById(b)||console.warn(e))},[e,a,b]),null},$=y,_=A,aa=E,ab=G,ac=K,ad=P,ae=R,af=T},76315:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({__iconNode:()=>b,default:()=>c});var d=a.i(49756);let b=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],c=(0,d.default)("x",b)}},97231:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({XIcon:()=>d.default});var d=a.i(76315)},22529:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({Dialog:()=>h,DialogClose:()=>k,DialogContent:()=>m,DialogDescription:()=>q,DialogFooter:()=>o,DialogHeader:()=>n,DialogOverlay:()=>l,DialogPortal:()=>j,DialogTitle:()=>p,DialogTrigger:()=>i});var d=a.i(99559),e=a.i(66067),f=a.i(97231),g=a.i(61073);function h({...a}){return(0,d.jsx)(e.Root,{"data-slot":"dialog",...a})}function i({...a}){return(0,d.jsx)(e.Trigger,{"data-slot":"dialog-trigger",...a})}function j({...a}){return(0,d.jsx)(e.Portal,{"data-slot":"dialog-portal",...a})}function k({...a}){return(0,d.jsx)(e.Close,{"data-slot":"dialog-close",...a})}function l({className:a,...b}){return(0,d.jsx)(e.Overlay,{"data-slot":"dialog-overlay",className:(0,g.cn)("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",a),...b})}function m({className:a,children:b,showCloseButton:c=!0,...h}){return(0,d.jsxs)(j,{"data-slot":"dialog-portal",children:[(0,d.jsx)(l,{}),(0,d.jsxs)(e.Content,{"data-slot":"dialog-content",className:(0,g.cn)("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200",a),...h,children:[b,c&&(0,d.jsxs)(e.Close,{"data-slot":"dialog-close",className:"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",children:[(0,d.jsx)(f.XIcon,{}),(0,d.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})}function n({className:a,...b}){return(0,d.jsx)("div",{"data-slot":"dialog-header",className:(0,g.cn)("flex flex-col gap-2 text-center sm:text-left",a),...b})}function o({className:a,...b}){return(0,d.jsx)("div",{"data-slot":"dialog-footer",className:(0,g.cn)("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",a),...b})}function p({className:a,...b}){return(0,d.jsx)(e.Title,{"data-slot":"dialog-title",className:(0,g.cn)("text-lg leading-none font-semibold",a),...b})}function q({className:a,...b}){return(0,d.jsx)(e.Description,{"data-slot":"dialog-description",className:(0,g.cn)("text-muted-foreground text-sm",a),...b})}},63180:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({canUseDOM:()=>d,composeEventHandlers:()=>e,getActiveElement:()=>function a(b,c=!1){let{activeElement:d}=g(b);if(!d?.nodeName)return null;if(h(d)&&d.contentDocument)return a(d.contentDocument.body,c);if(c){let a=d.getAttribute("aria-activedescendant");if(a){let b=g(d).getElementById(a);if(b)return b}}return d},getOwnerDocument:()=>g,getOwnerWindow:()=>f,isFrame:()=>h});var d=!!("undefined"!=typeof window&&window.document&&window.document.createElement);function e(a,b,{checkForDefaultPrevented:c=!0}={}){return function(d){if(a?.(d),!1===c||!d.defaultPrevented)return b?.(d)}}function f(a){if(!d)throw Error("Cannot access window outside of the DOM");return a?.ownerDocument?.defaultView??window}function g(a){if(!d)throw Error("Cannot access document outside of the DOM");return a?.ownerDocument??document}function h(a){return"IFRAME"===a.tagName}},35168:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({Presence:()=>g,Root:()=>i});var d=a.i(57560),e=a.i(18982),f=a.i(73639),g=a=>{let{present:b,children:c}=a,g=function(a){var b,c;let[e,g]=(0,d.useState)(),i=(0,d.useRef)(null),j=(0,d.useRef)(a),k=(0,d.useRef)("none"),[l,m]=(b=a?"mounted":"unmounted",c={mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}},(0,d.useReducer)((a,b)=>c[a][b]??a,b));return(0,d.useEffect)(()=>{let a=h(i.current);k.current="mounted"===l?a:"none"},[l]),(0,f.useLayoutEffect)(()=>{let b=i.current,c=j.current;if(c!==a){let d=k.current,e=h(b);a?m("MOUNT"):"none"===e||b?.display==="none"?m("UNMOUNT"):c&&d!==e?m("ANIMATION_OUT"):m("UNMOUNT"),j.current=a}},[a,m]),(0,f.useLayoutEffect)(()=>{if(e){let a,b=e.ownerDocument.defaultView??window,c=c=>{let d=h(i.current).includes(CSS.escape(c.animationName));if(c.target===e&&d&&(m("ANIMATION_END"),!j.current)){let c=e.style.animationFillMode;e.style.animationFillMode="forwards",a=b.setTimeout(()=>{"forwards"===e.style.animationFillMode&&(e.style.animationFillMode=c)})}},d=a=>{a.target===e&&(k.current=h(i.current))};return e.addEventListener("animationstart",d),e.addEventListener("animationcancel",c),e.addEventListener("animationend",c),()=>{b.clearTimeout(a),e.removeEventListener("animationstart",d),e.removeEventListener("animationcancel",c),e.removeEventListener("animationend",c)}}m("ANIMATION_END")},[e,m]),{isPresent:["mounted","unmountSuspended"].includes(l),ref:(0,d.useCallback)(a=>{i.current=a?getComputedStyle(a):null,g(a)},[])}}(b),i="function"==typeof c?c({present:g.isPresent}):d.Children.only(c),j=(0,e.useComposedRefs)(g.ref,function(a){let b=Object.getOwnPropertyDescriptor(a.props,"ref")?.get,c=b&&"isReactWarning"in b&&b.isReactWarning;return c?a.ref:(c=(b=Object.getOwnPropertyDescriptor(a,"ref")?.get)&&"isReactWarning"in b&&b.isReactWarning)?a.props.ref:a.props.ref||a.ref}(i));return"function"==typeof c||g.isPresent?(0,d.cloneElement)(i,{ref:j}):null};function h(a){return a?.animationName||"none"}g.displayName="Presence";var i=g},27393:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({Checkbox:()=>v,CheckboxIndicator:()=>x,Indicator:()=>x,Root:()=>v,createCheckboxScope:()=>p,unstable_BubbleInput:()=>z,unstable_CheckboxBubbleInput:()=>z,unstable_CheckboxProvider:()=>s,unstable_CheckboxTrigger:()=>u,unstable_Provider:()=>s,unstable_Trigger:()=>u});var d=a.i(57560),e=a.i(18982),f=a.i(14625),g=a.i(63180),h=a.i(75654),i=a.i(40811),j=a.i(85091),k=a.i(35168),l=a.i(71444),m=a.i(99559),n="Checkbox",[o,p]=(0,f.createContextScope)(n),[q,r]=o(n);function s(a){let{__scopeCheckbox:b,checked:c,children:e,defaultChecked:f,disabled:g,form:i,name:j,onCheckedChange:k,required:l,value:o="on",internal_do_not_use_render:p}=a,[r,s]=(0,h.useControllableState)({prop:c,defaultProp:f??!1,onChange:k,caller:n}),[t,u]=(0,d.useState)(null),[v,w]=(0,d.useState)(null),x=(0,d.useRef)(!1),y=!t||!!i||!!t.closest("form"),z={checked:r,disabled:g,setChecked:s,control:t,setControl:u,name:j,form:i,value:o,hasConsumerStoppedPropagationRef:x,required:l,defaultChecked:!A(f)&&f,isFormControl:y,bubbleInput:v,setBubbleInput:w};return(0,m.jsx)(q,{scope:b,...z,children:"function"==typeof p?p(z):e})}var t="CheckboxTrigger",u=(0,d.forwardRef)(({__scopeCheckbox:a,onKeyDown:b,onClick:c,...f},h)=>{let{control:i,value:j,disabled:k,checked:n,required:o,setControl:p,setChecked:q,hasConsumerStoppedPropagationRef:s,isFormControl:u,bubbleInput:v}=r(t,a),w=(0,e.useComposedRefs)(h,p),x=(0,d.useRef)(n);return(0,d.useEffect)(()=>{let a=i?.form;if(a){let b=()=>q(x.current);return a.addEventListener("reset",b),()=>a.removeEventListener("reset",b)}},[i,q]),(0,m.jsx)(l.Primitive.button,{type:"button",role:"checkbox","aria-checked":A(n)?"mixed":n,"aria-required":o,"data-state":B(n),"data-disabled":k?"":void 0,disabled:k,value:j,...f,ref:w,onKeyDown:(0,g.composeEventHandlers)(b,a=>{"Enter"===a.key&&a.preventDefault()}),onClick:(0,g.composeEventHandlers)(c,a=>{q(a=>!!A(a)||!a),v&&u&&(s.current=a.isPropagationStopped(),s.current||a.stopPropagation())})})});u.displayName=t;var v=(0,d.forwardRef)((a,b)=>{let{__scopeCheckbox:c,name:d,checked:e,defaultChecked:f,required:g,disabled:h,value:i,onCheckedChange:j,form:k,...l}=a;return(0,m.jsx)(s,{__scopeCheckbox:c,checked:e,defaultChecked:f,disabled:h,required:g,onCheckedChange:j,name:d,form:k,value:i,internal_do_not_use_render:({isFormControl:a})=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(u,{...l,ref:b,__scopeCheckbox:c}),a&&(0,m.jsx)(z,{__scopeCheckbox:c})]})})});v.displayName=n;var w="CheckboxIndicator",x=(0,d.forwardRef)((a,b)=>{let{__scopeCheckbox:c,forceMount:d,...e}=a,f=r(w,c);return(0,m.jsx)(k.Presence,{present:d||A(f.checked)||!0===f.checked,children:(0,m.jsx)(l.Primitive.span,{"data-state":B(f.checked),"data-disabled":f.disabled?"":void 0,...e,ref:b,style:{pointerEvents:"none",...a.style}})})});x.displayName=w;var y="CheckboxBubbleInput",z=(0,d.forwardRef)(({__scopeCheckbox:a,...b},c)=>{let{control:f,hasConsumerStoppedPropagationRef:g,checked:h,defaultChecked:k,required:n,disabled:o,name:p,value:q,form:s,bubbleInput:t,setBubbleInput:u}=r(y,a),v=(0,e.useComposedRefs)(c,u),w=(0,i.usePrevious)(h),x=(0,j.useSize)(f);(0,d.useEffect)(()=>{if(!t)return;let a=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,"checked").set,b=!g.current;if(w!==h&&a){let c=new Event("click",{bubbles:b});t.indeterminate=A(h),a.call(t,!A(h)&&h),t.dispatchEvent(c)}},[t,w,h,g]);let z=(0,d.useRef)(!A(h)&&h);return(0,m.jsx)(l.Primitive.input,{type:"checkbox","aria-hidden":!0,defaultChecked:k??z.current,required:n,disabled:o,name:p,value:q,form:s,...b,tabIndex:-1,ref:v,style:{...b.style,...x,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})});function A(a){return"indeterminate"===a}function B(a){return A(a)?"indeterminate":a?"checked":"unchecked"}z.displayName=y},97937:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({Check:()=>d.default});var d=a.i(76174)},34983:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({Checkbox:()=>b});var d=a.i(99559),e=a.i(57560),f=a.i(27393),g=a.i(97937),h=a.i(61073);let b=(0,e.forwardRef)(({className:a,...b},c)=>(0,d.jsx)(f.Root,{ref:c,className:(0,h.cn)("peer h-4 w-4 shrink-0 rounded-sm border border-gray-300 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-gray-900 data-[state=checked]:text-white dark:border-gray-800 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300 dark:data-[state=checked]:bg-gray-50 dark:data-[state=checked]:text-gray-900",a),...b,children:(0,d.jsx)(f.Indicator,{className:(0,h.cn)("flex items-center justify-center text-current"),children:(0,d.jsx)(g.Check,{className:"h-4 w-4"})})}));b.displayName=f.Root.displayName}},84172:a=>{"use strict";var{g:b,__dirname:c}=a;function d(a,b,c){return b in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function e(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function f(a){for(var b=1;b<arguments.length;b++){var c=null!=arguments[b]?arguments[b]:{};b%2?e(Object(c),!0).forEach(function(b){d(a,b,c[b])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(c)):e(Object(c)).forEach(function(b){Object.defineProperty(a,b,Object.getOwnPropertyDescriptor(c,b))})}return a}function g(a,b){if(null==a)return{};var c,d,e={},f=Object.keys(a);for(d=0;d<f.length;d++)c=f[d],b.indexOf(c)>=0||(e[c]=a[c]);return e}function h(a,b){if(null==a)return{};var c,d,e=g(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],!(b.indexOf(c)>=0)&&Object.prototype.propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}function i(a,b){return j(a)||k(a,b)||l(a,b)||n()}function j(a){if(Array.isArray(a))return a}function k(a,b){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(a)){var c=[],d=!0,e=!1,f=void 0;try{for(var g,h=a[Symbol.iterator]();!(d=(g=h.next()).done)&&(c.push(g.value),!b||c.length!==b);d=!0);}catch(a){e=!0,f=a}finally{try{d||null==h.return||h.return()}finally{if(e)throw f}}return c}}function l(a,b){if(a){if("string"==typeof a)return m(a,b);var c=Object.prototype.toString.call(a).slice(8,-1);if("Object"===c&&a.constructor&&(c=a.constructor.name),"Map"===c||"Set"===c)return Array.from(a);if("Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c))return m(a,b)}}function m(a,b){(null==b||b>a.length)&&(b=a.length);for(var c=0,d=Array(b);c<b;c++)d[c]=a[c];return d}function n(){throw TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}a.s({arrayLikeToArray:()=>m,arrayWithHoles:()=>j,defineProperty:()=>d,iterableToArrayLimit:()=>k,nonIterableRest:()=>n,objectSpread2:()=>f,objectWithoutProperties:()=>h,objectWithoutPropertiesLoose:()=>g,slicedToArray:()=>i,unsupportedIterableToArray:()=>l})},21782:a=>{"use strict";var{g:b,__dirname:c}=a;{function d(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function e(a){for(var b=1;b<arguments.length;b++){var c=null!=arguments[b]?arguments[b]:{};b%2?d(Object(c),!0).forEach(function(b){var d;d=c[b],b in a?Object.defineProperty(a,b,{value:d,enumerable:!0,configurable:!0,writable:!0}):a[b]=d}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(c)):d(Object(c)).forEach(function(b){Object.defineProperty(a,b,Object.getOwnPropertyDescriptor(c,b))})}return a}function f(a){return function b(){for(var c=this,d=arguments.length,e=Array(d),f=0;f<d;f++)e[f]=arguments[f];return e.length>=a.length?a.apply(this,e):function(){for(var a=arguments.length,d=Array(a),f=0;f<a;f++)d[f]=arguments[f];return b.apply(c,[].concat(e,d))}}}function g(a){return({}).toString.call(a).includes("Object")}function h(a){return"function"==typeof a}a.s({default:()=>b});var i=f(function(a,b){throw Error(a[b]||a.default)})({initialIsRequired:"initial state is required",initialType:"initial state should be an object",initialContent:"initial state shouldn't be an empty object",handlerType:"handler should be an object or a function",handlersType:"all handlers should be a functions",selectorType:"selector should be a function",changeType:"provided value of changes should be an object",changeField:'it seams you want to change a field in the state which is not specified in the "initial" state',default:"an unknown error accured in `state-local` package"}),j={changes:function(a,b){return g(b)||i("changeType"),Object.keys(b).some(function(b){return!Object.prototype.hasOwnProperty.call(a,b)})&&i("changeField"),b},selector:function(a){h(a)||i("selectorType")},handler:function(a){h(a)||g(a)||i("handlerType"),g(a)&&Object.values(a).some(function(a){return!h(a)})&&i("handlersType")},initial:function(a){a||i("initialIsRequired"),g(a)||i("initialType"),Object.keys(a).length||i("initialContent")}};function k(a,b){return h(b)?b(a.current):b}function l(a,b){return a.current=e(e({},a.current),b),b}function m(a,b,c){return h(b)?b(a.current):Object.keys(c).forEach(function(c){var d;return null==(d=b[c])?void 0:d.call(b,a.current[c])}),c}let b={create:function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};j.initial(a),j.handler(b);var c={current:a},d=f(m)(c,b),e=f(l)(c),g=f(j.changes)(a),h=f(k)(c);return[function(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(a){return a};return j.selector(a),a(c.current)},function(a){(function(){for(var a=arguments.length,b=Array(a),c=0;c<a;c++)b[c]=arguments[c];return function(a){return b.reduceRight(function(a,b){return b(a)},a)}})(d,e,g,h)(a)}]}}}},14260:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b});let b={paths:{vs:"https://cdn.jsdelivr.net/npm/monaco-editor@0.52.2/min/vs"}}}},45287:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b});let b=function(a){return function b(){for(var c=this,d=arguments.length,e=Array(d),f=0;f<d;f++)e[f]=arguments[f];return e.length>=a.length?a.apply(this,e):function(){for(var a=arguments.length,d=Array(a),f=0;f<a;f++)d[f]=arguments[f];return b.apply(c,[].concat(e,d))}}}}},82863:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b});let b=function(a){return({}).toString.call(a).includes("Object")}}},72859:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b,errorHandler:()=>g,errorMessages:()=>f});var d=a.i(45287),e=a.i(82863),f={configIsRequired:"the configuration object is required",configType:"the configuration object should be an object",default:"an unknown error accured in `@monaco-editor/loader` package",deprecation:"Deprecation warning!\n You are using deprecated way of configuration.\n\n Instead of using\n monaco.config({ urls: { monacoBase: '...' } })\n use\n monaco.config({ paths: { vs: '...' } })\n\n For more please check the link https://github.com/suren-atoyan/monaco-loader#config\n "},g=(0,d.default)(function(a,b){throw Error(a[b]||a.default)})(f);let b={config:function(a){return(a||g("configIsRequired"),(0,e.default)(a)||g("configType"),a.urls)?(console.warn(f.deprecation),{paths:{vs:a.urls.monacoBase}}):a}}}},87871:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b});let b=function(){for(var a=arguments.length,b=Array(a),c=0;c<a;c++)b[c]=arguments[c];return function(a){return b.reduceRight(function(a,b){return b(a)},a)}}}},28251:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b});var d=a.i(84172);let b=function a(b,c){return Object.keys(c).forEach(function(d){c[d]instanceof Object&&b[d]&&Object.assign(c[d],a(b[d],c[d]))}),(0,d.objectSpread2)((0,d.objectSpread2)({},b),c)}}},83021:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({CANCELATION_MESSAGE:()=>d,default:()=>b});var d={type:"cancelation",msg:"operation is manually canceled"};let b=function(a){var b=!1,c=new Promise(function(c,e){a.then(function(a){return b?e(d):c(a)}),a.catch(e)});return c.cancel=function(){return b=!0},c}}},75092:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b});var d=a.i(84172),e=a.i(21782),f=a.i(14260),g=a.i(72859),h=a.i(87871),i=a.i(28251),j=a.i(83021),k=e.default.create({config:f.default,isInitialized:!1,resolve:null,reject:null,monaco:null}),l=(0,d.slicedToArray)(k,2),m=l[0],n=l[1];function o(a){return document.body.appendChild(a)}function p(a){var b,c,d=m(function(a){return{config:a.config,reject:a.reject}}),e=(b="".concat(d.config.paths.vs,"/loader.js"),c=document.createElement("script"),b&&(c.src=b),c);return e.onload=function(){return a()},e.onerror=d.reject,e}function q(){var a=m(function(a){return{config:a.config,resolve:a.resolve,reject:a.reject}}),b=window.require;b.config(a.config),b(["vs/editor/editor.main"],function(b){r(b),a.resolve(b)},function(b){a.reject(b)})}function r(a){m().monaco||n({monaco:a})}var s=new Promise(function(a,b){return n({resolve:a,reject:b})});let b={config:function(a){var b=g.default.config(a),c=b.monaco,e=(0,d.objectWithoutProperties)(b,["monaco"]);n(function(a){return{config:(0,i.default)(a.config,e),monaco:c}})},init:function(){var a=m(function(a){return{monaco:a.monaco,isInitialized:a.isInitialized,resolve:a.resolve}});if(!a.isInitialized){if(n({isInitialized:!0}),a.monaco)return a.resolve(a.monaco),(0,j.default)(s);if(window.monaco&&window.monaco.editor)return r(window.monaco),a.resolve(window.monaco),(0,j.default)(s);(0,h.default)(o,p)(q)}return(0,j.default)(s)},__getMonacoInstance:function(){return m(function(a){return a.monaco})}}}},74403:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({}),a.i(75092)},30132:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({}),a.i(75092),a.i(74403)},22027:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({DiffEditor:()=>o,Editor:()=>s,default:()=>t,useMonaco:()=>p}),a.i(30132);var d=a.i(57560),e=a.i(75092),f={wrapper:{display:"flex",position:"relative",textAlign:"initial"},fullWidth:{width:"100%"},hide:{display:"none"}},g={container:{display:"flex",height:"100%",width:"100%",justifyContent:"center",alignItems:"center"}},h=function({children:a}){return d.default.createElement("div",{style:g.container},a)},i=(0,d.memo)(function({width:a,height:b,isEditorReady:c,loading:e,_ref:g,className:i,wrapperProps:j}){return d.default.createElement("section",{style:{...f.wrapper,width:a,height:b},...j},!c&&d.default.createElement(h,null,e),d.default.createElement("div",{ref:g,style:{...f.fullWidth,...!c&&f.hide},className:i}))}),j=function(a){(0,d.useEffect)(a,[])},k=function(a,b,c=!0){let e=(0,d.useRef)(!0);(0,d.useEffect)(e.current||!c?()=>{e.current=!1}:a,b)};function l(){}function m(a,b,c,d){var e,f,g,h,i,j;return e=a,f=d,e.editor.getModel(n(e,f))||(g=a,h=b,i=c,j=d,g.editor.createModel(h,i,j?n(g,j):void 0))}function n(a,b){return a.Uri.parse(b)}var o=(0,d.memo)(function({original:a,modified:b,language:c,originalLanguage:f,modifiedLanguage:g,originalModelPath:h,modifiedModelPath:n,keepCurrentOriginalModel:o=!1,keepCurrentModifiedModel:p=!1,theme:q="light",loading:r="Loading...",options:s={},height:t="100%",width:u="100%",className:v,wrapperProps:w={},beforeMount:x=l,onMount:y=l}){let[z,A]=(0,d.useState)(!1),[B,C]=(0,d.useState)(!0),D=(0,d.useRef)(null),E=(0,d.useRef)(null),F=(0,d.useRef)(null),G=(0,d.useRef)(y),H=(0,d.useRef)(x),I=(0,d.useRef)(!1);j(()=>{let a=e.default.init();return a.then(a=>(E.current=a)&&C(!1)).catch(a=>a?.type!=="cancelation"&&console.error("Monaco initialization: error:",a)),()=>{let b;return D.current?(b=D.current?.getModel(),void(o||b?.original?.dispose(),p||b?.modified?.dispose(),D.current?.dispose())):a.cancel()}}),k(()=>{if(D.current&&E.current){let b=D.current.getOriginalEditor(),d=m(E.current,a||"",f||c||"text",h||"");d!==b.getModel()&&b.setModel(d)}},[h],z),k(()=>{if(D.current&&E.current){let a=D.current.getModifiedEditor(),d=m(E.current,b||"",g||c||"text",n||"");d!==a.getModel()&&a.setModel(d)}},[n],z),k(()=>{let a=D.current.getModifiedEditor();a.getOption(E.current.editor.EditorOption.readOnly)?a.setValue(b||""):b!==a.getValue()&&(a.executeEdits("",[{range:a.getModel().getFullModelRange(),text:b||"",forceMoveMarkers:!0}]),a.pushUndoStop())},[b],z),k(()=>{D.current?.getModel()?.original.setValue(a||"")},[a],z),k(()=>{let{original:a,modified:b}=D.current.getModel();E.current.editor.setModelLanguage(a,f||c||"text"),E.current.editor.setModelLanguage(b,g||c||"text")},[c,f,g],z),k(()=>{E.current?.editor.setTheme(q)},[q],z),k(()=>{D.current?.updateOptions(s)},[s],z);let J=(0,d.useCallback)(()=>{if(!E.current)return;H.current(E.current);let d=m(E.current,a||"",f||c||"text",h||""),e=m(E.current,b||"",g||c||"text",n||"");D.current?.setModel({original:d,modified:e})},[c,b,g,a,f,h,n]),K=(0,d.useCallback)(()=>{!I.current&&F.current&&(D.current=E.current.editor.createDiffEditor(F.current,{automaticLayout:!0,...s}),J(),E.current?.editor.setTheme(q),A(!0),I.current=!0)},[s,q,J]);return(0,d.useEffect)(()=>{z&&G.current(D.current,E.current)},[z]),(0,d.useEffect)(()=>{B||z||K()},[B,z,K]),d.default.createElement(i,{width:u,height:t,isEditorReady:z,loading:r,_ref:F,className:v,wrapperProps:w})}),p=function(){let[a,b]=(0,d.useState)(e.default.__getMonacoInstance());return j(()=>{let c;return a||(c=e.default.init()).then(a=>{b(a)}),()=>c?.cancel()}),a},q=function(a){let b=(0,d.useRef)();return(0,d.useEffect)(()=>{b.current=a},[a]),b.current},r=new Map,s=(0,d.memo)(function({defaultValue:a,defaultLanguage:b,defaultPath:c,value:f,language:g,path:h,theme:n="light",line:o,loading:p="Loading...",options:s={},overrideServices:t={},saveViewState:u=!0,keepCurrentModel:v=!1,width:w="100%",height:x="100%",className:y,wrapperProps:z={},beforeMount:A=l,onMount:B=l,onChange:C,onValidate:D=l}){let[E,F]=(0,d.useState)(!1),[G,H]=(0,d.useState)(!0),I=(0,d.useRef)(null),J=(0,d.useRef)(null),K=(0,d.useRef)(null),L=(0,d.useRef)(B),M=(0,d.useRef)(A),N=(0,d.useRef)(),O=(0,d.useRef)(f),P=q(h),Q=(0,d.useRef)(!1),R=(0,d.useRef)(!1);j(()=>{let a=e.default.init();return a.then(a=>(I.current=a)&&H(!1)).catch(a=>a?.type!=="cancelation"&&console.error("Monaco initialization: error:",a)),()=>J.current?void(N.current?.dispose(),v?u&&r.set(h,J.current.saveViewState()):J.current.getModel()?.dispose(),J.current.dispose()):a.cancel()}),k(()=>{let d=m(I.current,a||f||"",b||g||"",h||c||"");d!==J.current?.getModel()&&(u&&r.set(P,J.current?.saveViewState()),J.current?.setModel(d),u&&J.current?.restoreViewState(r.get(h)))},[h],E),k(()=>{J.current?.updateOptions(s)},[s],E),k(()=>{J.current&&void 0!==f&&(J.current.getOption(I.current.editor.EditorOption.readOnly)?J.current.setValue(f):f!==J.current.getValue()&&(R.current=!0,J.current.executeEdits("",[{range:J.current.getModel().getFullModelRange(),text:f,forceMoveMarkers:!0}]),J.current.pushUndoStop(),R.current=!1))},[f],E),k(()=>{let a=J.current?.getModel();a&&g&&I.current?.editor.setModelLanguage(a,g)},[g],E),k(()=>{void 0!==o&&J.current?.revealLine(o)},[o],E),k(()=>{I.current?.editor.setTheme(n)},[n],E);let S=(0,d.useCallback)(()=>{if(!(!K.current||!I.current)&&!Q.current){M.current(I.current);let d=h||c,e=m(I.current,f||a||"",b||g||"",d||"");J.current=I.current?.editor.create(K.current,{model:e,automaticLayout:!0,...s},t),u&&J.current.restoreViewState(r.get(d)),I.current.editor.setTheme(n),void 0!==o&&J.current.revealLine(o),F(!0),Q.current=!0}},[a,b,c,f,g,h,s,t,u,n,o]);return(0,d.useEffect)(()=>{E&&L.current(J.current,I.current)},[E]),(0,d.useEffect)(()=>{G||E||S()},[G,E,S]),O.current=f,(0,d.useEffect)(()=>{E&&C&&(N.current?.dispose(),N.current=J.current?.onDidChangeModelContent(a=>{R.current||C(J.current.getValue(),a)}))},[E,C]),(0,d.useEffect)(()=>{if(E){let a=I.current.editor.onDidChangeMarkers(a=>{let b=J.current.getModel()?.uri;if(b&&a.find(a=>a.path===b.path)){let a=I.current.editor.getModelMarkers({resource:b});D?.(a)}});return()=>{a?.dispose()}}return()=>{}},[E,D]),d.default.createElement(i,{width:w,height:x,isEditorReady:E,loading:p,_ref:K,className:y,wrapperProps:z})}),t=s},28783:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({}),a.i(30132),a.i(57560),a.i(22027)},82587:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({default:()=>i});var d=a.i(99559),e=a.i(57560),f=a.i(60284),g=a.i(94688),h=a.i(50923);function i({className:a,currentProjectName:b,currentEnvName:c}){let[i,j]=(0,e.useState)([]),[k,l]=(0,e.useState)(!0),[m,n]=(0,e.useState)(null),[o,p]=(0,e.useState)(new Set),[q,r]=(0,e.useState)(""),[s,t]=(0,e.useState)(!1),[u,v]=(0,e.useState)(""),[w,x]=(0,e.useState)(!1),[y,z]=(0,e.useState)(null),A=(0,e.useRef)(null);(0,e.useEffect)(()=>{if(i.length>0){let a=i.find(a=>a.projectName===b&&a.envName===c);if(a&&a.subApps.length>0){let b=new Set;a.subApps.forEach(a=>{i.forEach(c=>{c.envName===a&&b.add(F(c))})}),p(b)}}},[i,b,c]);let B=async()=>{l(!0),n(null);try{let a=await fetch("/api/all-projects-envs"),b=await a.json();b.success?j(b.data):n(b.error||"获取项目环境信息失败")}catch(a){console.error("获取项目环境信息失败:",a),n("获取项目环境信息失败: 网络错误")}finally{l(!1)}};(0,e.useEffect)(()=>(B(),C(),()=>{D()}),[c]);let C=()=>{A.current&&D();let a=`microapp-table-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,b=`/api/microapp-proxy-change-stream?env=${encodeURIComponent(c)}&clientId=${encodeURIComponent(a)}`;console.log(`[SSE] 建立连接到: ${b}`),z(null);try{let a=new EventSource(b);A.current=a,a.onopen=()=>{console.log(`[SSE] 连接已建立,环境: ${c}`),x(!0),z(null)},a.onmessage=a=>{try{let b=JSON.parse(a.data);E(b)}catch(a){console.error("[SSE] 解析消息失败:",a)}},a.onerror=()=>{console.error(`[SSE] 连接错误,环境: ${c}`),x(!1),z("实时推送连接断开"),setTimeout(()=>{A.current&&A.current.readyState!==EventSource.CLOSED||(console.log("[SSE] 尝试重新连接..."),C())},3e3)}}catch(a){console.error("[SSE] 建立连接失败:",a),z("无法建立实时推送连接")}},D=()=>{A.current&&(console.log("[SSE] 关闭连接"),A.current.close(),A.current=null,x(!1))},E=a=>{switch(console.log("[SSE] 收到消息:",a),a.type){case"connection-established":console.log(`[SSE] 连接确认: ${a.message}`),x(!0),z(null);break;case"microapp-proxy-config-change":if(console.log(`[SSE] 配置变化通知: 环境=${a.envName}`),console.log(`[SSE] 变化详情:`,a.changes),a.changes){let{added:b,removed:c}=a.changes,d="";b.length>0&&(d+=`新增: ${b.join(", ")}`),c.length>0&&(d&&(d+="; "),d+=`移除: ${c.join(", ")}`),v(`配置已更新 (${d})`)}else v("配置已更新");B(),setTimeout(()=>v(""),3e3);break;case"heartbeat":x(!0),z(null);break;default:console.log("[SSE] 未知消息类型:",a.type)}},F=a=>`${a.projectName}-${a.envName}`,G=q.trim()?i.filter(a=>a.projectName.toLowerCase().includes(q.toLowerCase())||a.envName.toLowerCase().includes(q.toLowerCase())||a.host.toLowerCase().includes(q.toLowerCase())):i,H=(a,b)=>{let c=new Set(o);b?c.add(a):c.delete(a),p(c)},I=a=>{a?p(new Set(G.map(a=>F(a)))):p(new Set)},J=async()=>{t(!0),v("");try{let a=Array.from(o).map(a=>{let b=i.find(b=>F(b)===a);return b?b.envName:""}).filter(a=>""!==a),d=[...new Set(a)],e=await fetch("/api/microapp-proxy-config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:b,envName:c,selectedItems:d})}),f=await e.json();f.success?(v(f.message||"保存成功"),await B()):v(`保存失败: ${f.error}`)}catch(a){console.error("保存MicroApp代理配置失败:",a),v("保存失败: 网络错误")}finally{t(!1),setTimeout(()=>{v("")},5e3)}},K=o.size,L=G.length>0&&G.every(a=>o.has(F(a))),M=G.some(a=>o.has(F(a)));return k?(0,d.jsxs)("div",{className:`p-6 bg-gray-50 rounded-lg ${a}`,children:[(0,d.jsx)("h4",{className:"text-md font-medium mb-4",children:"MicroApp代理配置"}),(0,d.jsx)("div",{className:"text-center py-8",children:(0,d.jsx)("p",{className:"text-gray-500",children:"加载中..."})})]}):m?(0,d.jsxs)("div",{className:`p-6 bg-gray-50 rounded-lg ${a}`,children:[(0,d.jsx)("h4",{className:"text-md font-medium mb-4",children:"MicroApp代理配置"}),(0,d.jsxs)("div",{className:"text-center py-8",children:[(0,d.jsx)("p",{className:"text-red-500",children:m}),(0,d.jsx)(h.Button,{variant:"outline",size:"sm",onClick:B,className:"mt-2",children:"重试"})]})]}):(0,d.jsxs)("div",{className:`p-6 bg-gray-50 rounded-lg ${a}`,children:[(0,d.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h4",{className:"text-md font-medium",children:"MicroApp代理配置"}),(0,d.jsxs)("p",{className:"text-xs text-gray-500 mt-1",children:["为 ",b," - ",c," 环境配置微应用代理"]})]}),(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsxs)("div",{className:"flex items-center gap-1",children:[(0,d.jsx)("div",{className:`w-2 h-2 rounded-full ${w?"bg-green-500":"bg-red-500"}`,title:w?"实时推送已连接":"实时推送断开"}),(0,d.jsx)("span",{className:"text-xs text-gray-500",children:w?"实时":"离线"})]}),(u||y)&&(0,d.jsx)("span",{className:`text-sm max-w-xs ${u&&u.includes("失败")||y?"text-red-600":u&&u.includes("但有")?"text-yellow-600":"text-green-600"}`,title:u||y||"",children:u||y}),(0,d.jsx)(h.Button,{variant:"outline",size:"sm",onClick:B,disabled:s,children:"刷新"}),(0,d.jsx)(h.Button,{variant:"default",size:"sm",onClick:J,disabled:s,children:s?"保存中...":"保存配置"})]})]}),(0,d.jsxs)("div",{className:"space-y-3 mb-4",children:[(0,d.jsx)("div",{className:"flex items-center gap-2",children:(0,d.jsxs)("div",{className:"relative flex-1 max-w-md",children:[(0,d.jsx)(g.Input,{placeholder:"搜索项目名称、环境名称或Host...",value:q,onChange:a=>r(a.target.value),className:"pr-8"}),q&&(0,d.jsx)(h.Button,{variant:"ghost",size:"sm",onClick:()=>{r("")},className:"absolute right-1 top-1/2 transform -translate-y-1/2 h-6 w-6 p-0 hover:bg-gray-100",children:"×"})]})}),(0,d.jsxs)("div",{className:"flex items-center justify-between text-sm text-gray-600",children:[(0,d.jsxs)("div",{className:"flex items-center gap-4",children:[(0,d.jsxs)("span",{children:["显示 ",G.length," 个环境配置",q&&` (搜索: "${q}")`]}),K>0&&(0,d.jsxs)("span",{className:"text-blue-600 font-medium",children:["已选择 ",K," 项"]})]}),K>0&&(0,d.jsx)(h.Button,{variant:"outline",size:"sm",onClick:()=>{p(new Set)},children:"清空选择"})]})]}),G.length>0?(0,d.jsx)("div",{className:"border rounded-md",children:(0,d.jsxs)(f.Table,{children:[(0,d.jsx)(f.TableHeader,{children:(0,d.jsxs)(f.TableRow,{children:[(0,d.jsx)(f.TableHead,{className:"w-12",children:(0,d.jsx)("input",{type:"checkbox",checked:L,onChange:a=>I(a.target.checked),ref:a=>{a&&(a.indeterminate=M&&!L)},className:"rounded border-gray-300"})}),(0,d.jsx)(f.TableHead,{children:"环境名称"}),(0,d.jsx)(f.TableHead,{children:"项目名称"}),(0,d.jsx)(f.TableHead,{children:"Host地址"}),(0,d.jsx)(f.TableHead,{children:"当前代理"})]})}),(0,d.jsx)(f.TableBody,{children:G.map(a=>{let b=F(a),c=o.has(b);return(0,d.jsxs)(f.TableRow,{children:[(0,d.jsx)(f.TableCell,{children:(0,d.jsx)("input",{type:"checkbox",checked:c,onChange:a=>H(b,a.target.checked),className:"rounded border-gray-300"})}),(0,d.jsx)(f.TableCell,{children:(0,d.jsx)("span",{className:"px-2 py-1 rounded text-xs font-medium bg-blue-100 text-blue-800",children:a.envName})}),(0,d.jsx)(f.TableCell,{className:"font-medium",children:a.projectName}),(0,d.jsx)(f.TableCell,{className:"font-mono text-sm",children:a.host}),(0,d.jsxs)(f.TableCell,{className:"text-sm text-gray-600",children:[a.currentProxy,a.proxyEnv[a.currentProxy]&&(0,d.jsx)("div",{className:"text-xs text-gray-500",children:a.proxyEnv[a.currentProxy]})]})]},b)})})]})}):(0,d.jsx)("div",{className:"text-center py-8",children:(0,d.jsx)("p",{className:"text-gray-500",children:q?"没有找到匹配的环境配置":"暂无环境配置"})}),K>0&&(0,d.jsx)("div",{className:"mt-4 p-3 bg-blue-50 rounded-md",children:(0,d.jsxs)("div",{className:"flex items-center justify-between",children:[(0,d.jsxs)("span",{className:"text-sm text-blue-700",children:["已选择 ",K," 个环境配置将作为微应用代理"]}),(0,d.jsx)("span",{className:"text-xs text-blue-600",children:"点击上方“保存配置”按钮保存设置"})]})})]})}},23936:function(a){var{g:b,__dirname:c,m:d,e:e}=a},22842:function(a){var{g:b,__dirname:c,m:d,e:e}=a;a.r(23936);var f=a.r(57560),g=f&&"object"==typeof f&&"default"in f?f:{default:f},h="undefined"!=typeof process&&process.env&&!0,i=function(a){return"[object String]"===Object.prototype.toString.call(a)},j=function(){function a(a){var b=void 0===a?{}:a,c=b.name,d=void 0===c?"stylesheet":c,e=b.optimizeForSpeed,f=void 0===e?h:e;k(i(d),"`name` must be a string"),this._name=d,this._deletedRulePlaceholder="#"+d+"-deleted-rule____{}",k("boolean"==typeof f,"`optimizeForSpeed` must be a boolean"),this._optimizeForSpeed=f,this._serverSheet=void 0,this._tags=[],this._injected=!1,this._rulesCount=0;var g="undefined"!=typeof window&&document.querySelector('meta[property="csp-nonce"]');this._nonce=g?g.getAttribute("content"):null}var b,c=a.prototype;return c.setOptimizeForSpeed=function(a){k("boolean"==typeof a,"`setOptimizeForSpeed` accepts a boolean"),k(0===this._rulesCount,"optimizeForSpeed cannot be when rules have already been inserted"),this.flush(),this._optimizeForSpeed=a,this.inject()},c.isOptimizeForSpeed=function(){return this._optimizeForSpeed},c.inject=function(){var a=this;if(k(!this._injected,"sheet already injected"),this._injected=!0,"undefined"!=typeof window&&this._optimizeForSpeed){this._tags[0]=this.makeStyleTag(this._name),this._optimizeForSpeed="insertRule"in this.getSheet(),this._optimizeForSpeed||(h||console.warn("StyleSheet: optimizeForSpeed mode not supported falling back to standard mode."),this.flush(),this._injected=!0);return}this._serverSheet={cssRules:[],insertRule:function(b,c){return"number"==typeof c?a._serverSheet.cssRules[c]={cssText:b}:a._serverSheet.cssRules.push({cssText:b}),c},deleteRule:function(b){a._serverSheet.cssRules[b]=null}}},c.getSheetForTag=function(a){if(a.sheet)return a.sheet;for(var b=0;b<document.styleSheets.length;b++)if(document.styleSheets[b].ownerNode===a)return document.styleSheets[b]},c.getSheet=function(){return this.getSheetForTag(this._tags[this._tags.length-1])},c.insertRule=function(a,b){if(k(i(a),"`insertRule` accepts only strings"),"undefined"==typeof window)return"number"!=typeof b&&(b=this._serverSheet.cssRules.length),this._serverSheet.insertRule(a,b),this._rulesCount++;if(this._optimizeForSpeed){var c=this.getSheet();"number"!=typeof b&&(b=c.cssRules.length);try{c.insertRule(a,b)}catch(b){return h||console.warn("StyleSheet: illegal rule: \n\n"+a+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),-1}}else{var d=this._tags[b];this._tags.push(this.makeStyleTag(this._name,a,d))}return this._rulesCount++},c.replaceRule=function(a,b){if(this._optimizeForSpeed||"undefined"==typeof window){var c="undefined"!=typeof window?this.getSheet():this._serverSheet;if(b.trim()||(b=this._deletedRulePlaceholder),!c.cssRules[a])return a;c.deleteRule(a);try{c.insertRule(b,a)}catch(d){h||console.warn("StyleSheet: illegal rule: \n\n"+b+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),c.insertRule(this._deletedRulePlaceholder,a)}}else{var d=this._tags[a];k(d,"old rule at index `"+a+"` not found"),d.textContent=b}return a},c.deleteRule=function(a){if("undefined"==typeof window)return void this._serverSheet.deleteRule(a);if(this._optimizeForSpeed)this.replaceRule(a,"");else{var b=this._tags[a];k(b,"rule at index `"+a+"` not found"),b.parentNode.removeChild(b),this._tags[a]=null}},c.flush=function(){this._injected=!1,this._rulesCount=0,"undefined"!=typeof window?(this._tags.forEach(function(a){return a&&a.parentNode.removeChild(a)}),this._tags=[]):this._serverSheet.cssRules=[]},c.cssRules=function(){var a=this;return"undefined"==typeof window?this._serverSheet.cssRules:this._tags.reduce(function(b,c){return c?b=b.concat(Array.prototype.map.call(a.getSheetForTag(c).cssRules,function(b){return b.cssText===a._deletedRulePlaceholder?null:b})):b.push(null),b},[])},c.makeStyleTag=function(a,b,c){b&&k(i(b),"makeStyleTag accepts only strings as second parameter");var d=document.createElement("style");this._nonce&&d.setAttribute("nonce",this._nonce),d.type="text/css",d.setAttribute("data-"+a,""),b&&d.appendChild(document.createTextNode(b));var e=document.head||document.getElementsByTagName("head")[0];return c?e.insertBefore(d,c):e.appendChild(d),d},b=[{key:"length",get:function(){return this._rulesCount}}],function(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}(a.prototype,b),a}();function k(a,b){if(!a)throw Error("StyleSheet: "+b+".")}var l=function(a){for(var b=5381,c=a.length;c;)b=33*b^a.charCodeAt(--c);return b>>>0},m={};function n(a,b){if(!b)return"jsx-"+a;var c=String(b),d=a+c;return m[d]||(m[d]="jsx-"+l(a+"-"+c)),m[d]}function o(a,b){"undefined"==typeof window&&(b=b.replace(/\/style/gi,"\\/style"));var c=a+b;return m[c]||(m[c]=b.replace(/__jsx-style-dynamic-selector/g,a)),m[c]}var p=function(){function a(a){var b=void 0===a?{}:a,c=b.styleSheet,d=void 0===c?null:c,e=b.optimizeForSpeed,f=void 0!==e&&e;this._sheet=d||new j({name:"styled-jsx",optimizeForSpeed:f}),this._sheet.inject(),d&&"boolean"==typeof f&&(this._sheet.setOptimizeForSpeed(f),this._optimizeForSpeed=this._sheet.isOptimizeForSpeed()),this._fromServer=void 0,this._indices={},this._instancesCounts={}}var b=a.prototype;return b.add=function(a){var b=this;void 0===this._optimizeForSpeed&&(this._optimizeForSpeed=Array.isArray(a.children),this._sheet.setOptimizeForSpeed(this._optimizeForSpeed),this._optimizeForSpeed=this._sheet.isOptimizeForSpeed()),"undefined"==typeof window||this._fromServer||(this._fromServer=this.selectFromServer(),this._instancesCounts=Object.keys(this._fromServer).reduce(function(a,b){return a[b]=0,a},{}));var c=this.getIdAndRules(a),d=c.styleId,e=c.rules;if(d in this._instancesCounts){this._instancesCounts[d]+=1;return}var f=e.map(function(a){return b._sheet.insertRule(a)}).filter(function(a){return -1!==a});this._indices[d]=f,this._instancesCounts[d]=1},b.remove=function(a){var b=this,c=this.getIdAndRules(a).styleId;if(function(a,b){if(!a)throw Error("StyleSheetRegistry: "+b+".")}(c in this._instancesCounts,"styleId: `"+c+"` not found"),this._instancesCounts[c]-=1,this._instancesCounts[c]<1){var d=this._fromServer&&this._fromServer[c];d?(d.parentNode.removeChild(d),delete this._fromServer[c]):(this._indices[c].forEach(function(a){return b._sheet.deleteRule(a)}),delete this._indices[c]),delete this._instancesCounts[c]}},b.update=function(a,b){this.add(b),this.remove(a)},b.flush=function(){this._sheet.flush(),this._sheet.inject(),this._fromServer=void 0,this._indices={},this._instancesCounts={}},b.cssRules=function(){var a=this,b=this._fromServer?Object.keys(this._fromServer).map(function(b){return[b,a._fromServer[b]]}):[],c=this._sheet.cssRules();return b.concat(Object.keys(this._indices).map(function(b){return[b,a._indices[b].map(function(a){return c[a].cssText}).join(a._optimizeForSpeed?"":"\n")]}).filter(function(a){return!!a[1]}))},b.styles=function(a){var b,c;return b=this.cssRules(),void 0===(c=a)&&(c={}),b.map(function(a){var b=a[0],d=a[1];return g.default.createElement("style",{id:"__"+b,key:"__"+b,nonce:c.nonce?c.nonce:void 0,dangerouslySetInnerHTML:{__html:d}})})},b.getIdAndRules=function(a){var b=a.children,c=a.dynamic,d=a.id;if(c){var e=n(d,c);return{styleId:e,rules:Array.isArray(b)?b.map(function(a){return o(e,a)}):[o(e,b)]}}return{styleId:n(d),rules:Array.isArray(b)?b:[b]}},b.selectFromServer=function(){return Array.prototype.slice.call(document.querySelectorAll('[id^="__jsx-"]')).reduce(function(a,b){return a[b.id.slice(2)]=b,a},{})},a}(),q=f.createContext(null);function r(){return new p}function s(){return f.useContext(q)}q.displayName="StyleSheetContext";var t=g.default.useInsertionEffect||g.default.useLayoutEffect,u="undefined"!=typeof window?r():void 0;function v(a){var b=u||s();return b&&("undefined"==typeof window?b.add(a):t(function(){return b.add(a),function(){b.remove(a)}},[a.id,String(a.dynamic)])),null}v.dynamic=function(a){return a.map(function(a){return n(a[0],a[1])}).join(" ")},e.StyleRegistry=function(a){var b=a.registry,c=a.children,d=f.useContext(q),e=f.useState(function(){return d||b||r()})[0];return g.default.createElement(q.Provider,{value:e},c)},e.createStyleRegistry=r,e.style=v,e.useStyleRegistry=s},62012:function(a){var{g:b,__dirname:c,m:d,e:e}=a;d.exports=a.r(22842).style},55441:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({default:()=>g});var d=a.i(99559),e=a.i(62012),f=a.i(57560);function g({logs:a}){let b=(0,f.useRef)(null),c=(0,f.useRef)(!0),g=a=>a.replace(/\x1b\[[0-9;]*m/g,"").replace(/\x1b\[[0-9]*[A-Z]/g,"").replace(/\x1b\[K/g,"").replace(/\x1b\[2K/g,"").replace(/\x1b\[G/g,"").replace(/\x1b\[\d+A/g,"").replace(/\x1b\[\d+B/g,"").replace(/\x1b\[\d+C/g,"").replace(/\x1b\[\d+D/g,"").replace(/\[2K\[1A\[2K\[G/g,"").replace(/\[\d+[A-Z]/g,"").replace(/\[STDOUT\]/g,"[OUT]").replace(/\[STDERR\]/g,"[ERR]"),h=()=>{if(!b.current)return!0;let{scrollTop:a,scrollHeight:c,clientHeight:d}=b.current;return c-a-d<100},i=()=>{b.current&&c.current&&(b.current.scrollTop=b.current.scrollHeight)};return(0,f.useEffect)(()=>{setTimeout(i,10)},[a]),(0,d.jsxs)("div",{ref:b,onScroll:()=>{c.current=h()},style:{scrollBehavior:"smooth",maxHeight:"100%"},className:"jsx-b464fb0f479e34f5 h-full w-full overflow-y-auto overflow-x-hidden p-4 custom-scrollbar",children:[(0,d.jsx)(e.default,{id:"b464fb0f479e34f5",children:".custom-scrollbar.jsx-b464fb0f479e34f5{scrollbar-width:thin;scrollbar-color:#fff3 #0000001a}.custom-scrollbar.jsx-b464fb0f479e34f5::-webkit-scrollbar{width:10px;height:10px}.custom-scrollbar.jsx-b464fb0f479e34f5::-webkit-scrollbar-track{background:#0000001a;border-radius:5px}.custom-scrollbar.jsx-b464fb0f479e34f5::-webkit-scrollbar-thumb{background:#ffffff4d;border-radius:5px}.custom-scrollbar.jsx-b464fb0f479e34f5.jsx-b464fb0f479e34f5::-webkit-scrollbar-thumb:hover{background:#fff6}"}),(0,d.jsx)("div",{className:"jsx-b464fb0f479e34f5 space-y-0.5",children:a.length>0?a.map((a,b)=>{let c=g(a);if(!c.trim())return null;let e=a.includes("[STDERR]"),f=a.includes("[SYSTEM]"),h=c.match(/^\[([\d-T:.Z]+)\]/)?.[1],i=c.replace(/^\[[\d-T:.Z]+\]\s*/,"");return(0,d.jsxs)("div",{className:`jsx-b464fb0f479e34f5 font-mono text-xs leading-5 ${e?"text-red-400":f?"text-yellow-400":"text-gray-100"}`,children:[h&&(0,d.jsxs)("span",{className:"jsx-b464fb0f479e34f5 text-gray-500 mr-2",children:["[",new Date(h).toLocaleTimeString("zh-CN"),"]"]}),(0,d.jsx)("span",{className:"jsx-b464fb0f479e34f5 whitespace-pre-wrap break-all",children:i})]},b)}):(0,d.jsx)("div",{className:"jsx-b464fb0f479e34f5 text-center text-gray-500 mt-8",children:"等待日志输出..."})})]})}},64708:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({default:()=>g});var d=a.i(99559),e=a.i(57560),f=a.i(50923);function g({projectName:a,className:b="",compact:c=!1}){let[g,h]=(0,e.useState)(null),[i,j]=(0,e.useState)(!1),[k,l]=(0,e.useState)(null),[m,n]=(0,e.useState)(""),o=(0,e.useCallback)(async()=>{if(a){j(!0),l(null);try{let b=await fetch(`/api/current-branch?project=${encodeURIComponent(a)}`),c=await b.json();c.success?(h(c.data),n(new Date().toLocaleTimeString("zh-CN",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"}))):l(c.error||"获取分支信息失败")}catch(a){l("网络请求失败"),console.error("获取分支信息失败:",a)}finally{j(!1)}}},[a]);(0,e.useEffect)(()=>{o()},[o]),(0,e.useEffect)(()=>{if(!a)return;let b=setInterval(()=>{o()},c?15e3:3e4);return()=>clearInterval(b)},[a,o,c]);let p=a=>0===a?"text-gray-500":"text-orange-600",q=()=>{if(!g)return null;let{ahead:a,behind:b}=g.status;return a>0&&b>0?(0,d.jsx)("span",{className:"text-yellow-500 text-xs",children:"↕"}):a>0?(0,d.jsx)("span",{className:"text-green-500 text-xs",children:"↑"}):b>0?(0,d.jsx)("span",{className:"text-red-500 text-xs",children:"↓"}):(0,d.jsx)("span",{className:"text-gray-400 text-xs",children:"✓"})};return i&&!g?c?(0,d.jsxs)("div",{className:`flex items-center gap-2 px-3 py-1 bg-gray-50 rounded-md ${b}`,children:[(0,d.jsx)("div",{className:"animate-spin w-3 h-3 border-2 border-blue-500 border-t-transparent rounded-full"}),(0,d.jsx)("span",{className:"text-xs text-gray-500",children:"加载中..."})]}):(0,d.jsxs)("div",{className:`bg-white rounded-lg shadow-sm border p-4 ${b}`,children:[(0,d.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold text-gray-700",children:"Git 分支信息"}),(0,d.jsx)("div",{className:"animate-spin w-4 h-4 border-2 border-blue-500 border-t-transparent rounded-full"})]}),(0,d.jsx)("div",{className:"text-sm text-gray-500",children:"正在加载分支信息..."})]}):k?c?(0,d.jsxs)("div",{className:`flex items-center gap-2 px-3 py-1 bg-red-50 rounded-md ${b}`,children:[(0,d.jsx)("span",{className:"text-xs text-red-500",children:"分支信息错误"}),(0,d.jsx)(f.Button,{variant:"ghost",size:"sm",onClick:o,disabled:i,className:"h-5 w-5 p-0 text-red-500 hover:bg-red-100",children:"↻"})]}):(0,d.jsxs)("div",{className:`bg-white rounded-lg shadow-sm border p-4 ${b}`,children:[(0,d.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold text-gray-700",children:"Git 分支信息"}),(0,d.jsx)(f.Button,{variant:"outline",size:"sm",onClick:o,disabled:i,className:"h-6 px-2 text-xs",children:i?"刷新中...":"重试"})]}),(0,d.jsx)("div",{className:"text-sm text-red-500 bg-red-50 p-2 rounded",children:k})]}):g?c?(0,d.jsxs)("div",{className:`flex items-center gap-2 px-3 py-1 bg-blue-50 border border-blue-200 rounded-md ${b}`,children:[(0,d.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"text-blue-600",children:[(0,d.jsx)("polyline",{points:"6,3 6,15"}),(0,d.jsx)("circle",{cx:"18",cy:"6",r:"3"}),(0,d.jsx)("circle",{cx:"6",cy:"18",r:"3"}),(0,d.jsx)("path",{d:"m18,9a9,9 0 0,1-9,9"})]}),(0,d.jsx)("span",{className:"text-sm font-medium text-blue-800",children:g.currentBranch}),q(),(0,d.jsx)(f.Button,{variant:"ghost",size:"sm",onClick:o,disabled:i,className:"h-5 w-5 p-0 text-blue-600 hover:bg-blue-100",title:"刷新分支信息",children:i?(0,d.jsx)("div",{className:"animate-spin w-3 h-3 border-2 border-blue-600 border-t-transparent rounded-full"}):"↻"})]}):(0,d.jsxs)("div",{className:`bg-white rounded-lg shadow-sm border p-4 ${b}`,children:[(0,d.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold text-gray-700",children:"Git 分支信息"}),(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[m&&(0,d.jsx)("span",{className:"text-xs text-gray-400",children:m}),(0,d.jsx)(f.Button,{variant:"outline",size:"sm",onClick:o,disabled:i,className:"h-6 px-2 text-xs",children:i?"刷新中...":"刷新"})]})]}),(0,d.jsxs)("div",{className:"space-y-3",children:[(0,d.jsx)("div",{className:"flex items-center gap-2",children:(0,d.jsxs)("div",{className:"flex items-center gap-1",children:[(0,d.jsx)("span",{className:"text-xs text-gray-500",children:"分支:"}),(0,d.jsx)("span",{className:"text-sm font-medium text-blue-600 bg-blue-50 px-2 py-1 rounded",children:g.currentBranch}),q()]})}),(0,d.jsxs)("div",{className:"bg-gray-50 p-3 rounded text-xs space-y-1",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)("span",{className:"text-gray-500",children:"提交:"}),(0,d.jsx)("code",{className:"bg-gray-200 px-1 rounded font-mono text-xs",children:g.lastCommit.hash})]}),(0,d.jsx)("div",{className:"text-gray-700 font-medium line-clamp-2",children:g.lastCommit.message}),(0,d.jsxs)("div",{className:"flex items-center justify-between text-gray-500",children:[(0,d.jsx)("span",{children:g.lastCommit.author}),(0,d.jsx)("span",{children:g.lastCommit.date})]})]}),(0,d.jsxs)("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[(0,d.jsxs)("div",{className:"flex items-center justify-between",children:[(0,d.jsx)("span",{className:"text-gray-500",children:"领先:"}),(0,d.jsx)("span",{className:p(g.status.ahead),children:g.status.ahead})]}),(0,d.jsxs)("div",{className:"flex items-center justify-between",children:[(0,d.jsx)("span",{className:"text-gray-500",children:"落后:"}),(0,d.jsx)("span",{className:p(g.status.behind),children:g.status.behind})]}),(0,d.jsxs)("div",{className:"flex items-center justify-between",children:[(0,d.jsx)("span",{className:"text-gray-500",children:"已修改:"}),(0,d.jsx)("span",{className:p(g.status.modified),children:g.status.modified})]}),(0,d.jsxs)("div",{className:"flex items-center justify-between",children:[(0,d.jsx)("span",{className:"text-gray-500",children:"已暂存:"}),(0,d.jsx)("span",{className:p(g.status.staged),children:g.status.staged})]}),(0,d.jsxs)("div",{className:"flex items-center justify-between col-span-2",children:[(0,d.jsx)("span",{className:"text-gray-500",children:"未跟踪:"}),(0,d.jsx)("span",{className:p(g.status.untracked),children:g.status.untracked})]})]}),(g.status.ahead>0||g.status.behind>0)&&(0,d.jsxs)("div",{className:"text-xs p-2 rounded bg-yellow-50 border border-yellow-200",children:[g.status.ahead>0&&g.status.behind>0&&(0,d.jsxs)("span",{className:"text-yellow-700",children:["分支与远程不同步,有 ",g.status.ahead," 个本地提交,",g.status.behind," 个远程提交"]}),g.status.ahead>0&&0===g.status.behind&&(0,d.jsxs)("span",{className:"text-green-700",children:["本地领先远程 ",g.status.ahead," 个提交"]}),0===g.status.ahead&&g.status.behind>0&&(0,d.jsxs)("span",{className:"text-red-700",children:["本地落后远程 ",g.status.behind," 个提交"]})]})]})]}):c?(0,d.jsx)("div",{className:`flex items-center gap-2 px-3 py-1 bg-gray-50 rounded-md ${b}`,children:(0,d.jsx)("span",{className:"text-xs text-gray-500",children:"暂无分支信息"})}):(0,d.jsxs)("div",{className:`bg-white rounded-lg shadow-sm border p-4 ${b}`,children:[(0,d.jsx)("div",{className:"flex items-center justify-between mb-3",children:(0,d.jsx)("h3",{className:"text-sm font-semibold text-gray-700",children:"Git 分支信息"})}),(0,d.jsx)("div",{className:"text-sm text-gray-500",children:"暂无分支信息"})]})}},73426:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({default:()=>v});var d=a.i(99559),e=a.i(57560),f=a.i(40490),g=a.i(50923),h=a.i(74939),i=a.i(49566),j=a.i(94688),k=a.i(58413),l=a.i(67252),m=a.i(60284),n=a.i(22529),o=a.i(34983);a.i(28783);var p=a.i(22027),q=a.i(82587),r=a.i(55441),s=a.i(64708),t=function(a){return a.PENDING="pending",a.EXISTING="existing",a.CLONING="cloning",a.SUCCESS="success",a.FAILED="failed",a.RETRYING="retrying",a}(t||{});function u(){let a=(0,f.useSearchParams)(),b=(0,f.useRouter)(),c=a.get("project"),[t,u]=(0,e.useState)(null),[v,w]=(0,e.useState)(!0),[x,y]=(0,e.useState)(null),[z,A]=(0,e.useState)({}),[B,C]=(0,e.useState)({mockingIntercept:!1,mockOpen:!1}),[D,E]=(0,e.useState)(!1),[F,G]=(0,e.useState)(null),[H,I]=(0,e.useState)(!1),[J,K]=(0,e.useState)(1),[L]=(0,e.useState)(10),[M,N]=(0,e.useState)(""),[O,P]=(0,e.useState)(null),[Q,R]=(0,e.useState)(!1),[S,T]=(0,e.useState)(!1),[U,V]=(0,e.useState)(!1),[W,X]=(0,e.useState)(!0),[Y,Z]=(0,e.useState)(null),[$,_]=(0,e.useState)([]),[aa,ab]=(0,e.useState)(!1),[ac,ad]=(0,e.useState)(!1),[ae,af]=(0,e.useState)(!1),[ag,ah]=(0,e.useState)({apiPath:"",method:"GET",siteName:"默认场景",mockOpen:!0}),[ai,aj]=(0,e.useState)(null),[ak,al]=(0,e.useState)(!1),[am,an]=(0,e.useState)({open:!1,apiName:"",method:"",siteName:""}),[ao,ap]=(0,e.useState)({open:!1,apiName:"",apiPath:""}),[aq,ar]=(0,e.useState)({open:!1,type:"success",message:""}),[as,at]=(0,e.useState)(!1),[au,av]=(0,e.useState)([]),[aw,ax]=(0,e.useState)(!1),[ay,az]=(0,e.useState)(""),[aA,aB]=(0,e.useState)({}),[aC,aD]=(0,e.useState)(!1),[aE,aF]=(0,e.useState)(""),[aG,aH]=(0,e.useState)([]),aI=(0,e.useCallback)(async()=>{Y&&await aK(Y)},[Y]),aJ=(0,e.useCallback)(async a=>{Q&&(a.metaKey||a.ctrlKey)&&"s"===a.key&&(a.preventDefault(),await aI())},[Q,aI]);(0,e.useEffect)(()=>{if(Q)return document.addEventListener("keydown",aJ),()=>{document.removeEventListener("keydown",aJ)}},[Q,Y,aJ]);let aK=async a=>{try{await new Promise(a=>setTimeout(a,200));let b=a.getModel();if(b){await a.getAction("editor.action.formatDocument")?.run();let c=b.getValue();if(c&&!c.includes("\n")&&c.length>50){let d=c.replace(/\{\s*/g,"{\n ").replace(/\}\s*/g,"\n}").replace(/;\s*/g,";\n ").replace(/,\s*/g,",\n ").replace(/\n\s*\n/g,"\n").trim();d!==c&&(b.setValue(d),setTimeout(()=>{a.getAction("editor.action.formatDocument")?.run()},100))}}}catch(a){console.log("自动格式化失败:",a)}},aL=()=>{b.push("/initialization")},aM=async()=>{ab(!0);try{let a=await fetch("/api/check-workspace"),b=await a.json();if(b.success&&b.projects){let a=b.projects.map(a=>({name:a.name,status:a.status,message:a.message}));_(a)}else console.error("获取项目列表失败:",b.error),_([])}catch(a){console.error("获取项目列表失败:",a),_([])}finally{ab(!1)}},aN=async()=>{if(c){E(!0);try{let a=await fetch("/api/open-project",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:c})}),b=await a.json();b.success||(console.error("打开项目失败:",b.error),bh("error",`打开项目失败: ${b.error}`))}catch(a){console.error("打开项目失败:",a),bh("error","打开项目失败: 网络错误")}finally{E(!1)}}},aO=async()=>{if(0===au.length)return void bh("error","请至少选择一个项目");ax(!0);try{let a=await fetch("/api/workspace/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projects:au})}),b=await a.json();b.success?(bh("success",b.message||"工作区已在 Cursor 中打开"),at(!1),av([])):bh("error",`创建工作区失败: ${b.error}`)}catch(a){console.error("创建工作区失败:",a),bh("error","创建工作区失败: 网络错误")}finally{ax(!1)}},aP=a=>{av(b=>b.includes(a)?b.filter(b=>b!==a):[...b,a])};(0,e.useEffect)(()=>{if(!c){y("项目名称缺失"),w(!1);return}(async()=>{try{let a=await fetch(`/api/project-config?project=${encodeURIComponent(c)}`),b=await a.json();if(b.success){u(b.data);let a={};Object.keys(b.data.envs).forEach(c=>{let d=b.data.envs[c],e="";e=d.proxyEnv[d.currentProxy]?d.proxyEnv[d.currentProxy]:d.currentProxy;let f="";f=d.proxyEnv[d.currentProxy]?d.currentProxy:"custom",a[c]={selectedProxy:e||"",selectedOption:f}}),A(a),C({mockingIntercept:b.data.mockingIntercept||!1,mockOpen:b.data.mockOpen||!1})}else y(b.error)}catch(a){y("获取项目配置失败"),console.error("获取项目配置失败:",a)}finally{w(!1)}})()},[c]);let aQ=(0,e.useCallback)(async()=>{if(c){I(!0);try{let a=await fetch(`/api/mock-file?project=${encodeURIComponent(c)}`),b=await a.json();b.success?G(b.data):console.error("获取Mock数据失败:",b.error)}catch(a){console.error("获取Mock数据失败:",a)}finally{I(!1)}}},[c]);(0,e.useEffect)(()=>{if(t&&c){let a=Object.keys(t.envs),b=new URLSearchParams(window.location.search).get("tab"),c="";(c=M&&("mock"===M||a.includes(M))?M:b&&("mock"===b||a.includes(b))?b:a.length>0?a[0]:"mock")!==M&&(N(c),"mock"===c&&aQ())}},[t,c,M,aQ]),(0,e.useEffect)(()=>{aM()},[]);let aR=(0,e.useCallback)(async()=>{if(!c||!t)return;let a={};for(let b of Object.keys(t.envs))a[`${b}`]={loading:!0,running:!1};aB(a);let b=Object.keys(t.envs).map(async a=>{try{let b=await fetch(`/api/process/status?projectName=${encodeURIComponent(c)}&envName=${encodeURIComponent(a)}`),d=await b.json();if(d.success&&d.data)return{envName:a,status:d.data}}catch(b){console.error(`获取环境 ${a} 状态失败:`,b)}return{envName:a,status:{running:!1}}}),d=await Promise.all(b),e={};d.forEach(({envName:a,status:b})=>{e[a]={running:b.running||!1,pid:b.pid,startTime:b.startTime,port:b.port,loading:!1}}),aB(e)},[c,t]),aS=async a=>{if(!c||!t)return;let b=t.envs[a];if(!b.startCommand)return void bh("error","该环境未配置启动命令");aB(b=>({...b,[a]:{...b[a],loading:!0}}));try{let d=await fetch("/api/process/start",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:c,envName:a,startCommand:b.startCommand})}),e=await d.json();if(e.success)aB(b=>({...b,[a]:{running:!0,pid:e.data.pid,startTime:e.data.startTime,port:e.data.port,loading:!1}}));else throw Error(e.error||"启动失败")}catch(b){console.error("启动进程失败:",b),bh("error",`启动失败: ${b instanceof Error?b.message:"未知错误"}`),aB(b=>({...b,[a]:{...b[a],loading:!1}}))}},aT=async a=>{if(c){aB(b=>({...b,[a]:{...b[a],loading:!0}}));try{let b=await fetch(`/api/process/start?projectName=${encodeURIComponent(c)}&envName=${encodeURIComponent(a)}`,{method:"DELETE"}),d=await b.json();if(d.success)aB(b=>({...b,[a]:{running:!1,loading:!1}}));else throw Error(d.error||"停止失败")}catch(b){console.error("停止进程失败:",b),bh("error",`停止失败: ${b instanceof Error?b.message:"未知错误"}`),aB(b=>({...b,[a]:{...b[a],loading:!1}}))}}},[aU,aV]=(0,e.useState)(null),aW=a=>{if(!c)return;aU&&aU.close(),aH([]);let b=new EventSource(`/api/process/logs/stream?projectName=${encodeURIComponent(c)}&envName=${encodeURIComponent(a)}`);b.onmessage=a=>{try{let b=JSON.parse(a.data);"log"===b.type?aH(a=>{let c=[...a,b.content];return c.length>1e3?c.slice(-1e3):c}):"init"===b.type?aH([b.message]):"end"===b.type&&aH(a=>[...a,`[系统] ${b.message}`])}catch(a){console.error("解析日志数据失败:",a)}},b.onerror=a=>{console.error("日志流错误:",a),b.close(),aV(null)},aV(b)},aX=()=>{aU&&(aU.close(),aV(null))},aY=a=>{aF(a),aD(!0),aW(a)},aZ=()=>{aD(!1),aH([]),aF(""),aX()};(0,e.useEffect)(()=>{if(t&&c){aR();let a=setInterval(()=>{aR()},5e3);return()=>clearInterval(a)}},[t,c,aR]);let a$=(a,b)=>{if(!t)return;let c=t.envs[a],d="";d="custom"===b?z[a]?.selectedOption==="custom"?z[a]?.selectedProxy||"":c.proxyEnv.custom||"":c.proxyEnv[b]||"",A(c=>({...c,[a]:{...c[a],selectedProxy:d,selectedOption:b,saveMessage:""}}))},a_=(a,b)=>{A(c=>({...c,[a]:{...c[a],selectedProxy:b,saveMessage:""}}))},a0=async a=>{C(b=>({...b,mockingIntercept:a,saving:!0,saveMessage:""}));try{let b=await fetch("/api/project-config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:c,projectConfig:{mockingIntercept:a,mockOpen:B.mockOpen}})}),d=await b.json();if(d.success)u(b=>b?{...b,mockingIntercept:a}:b),C(a=>({...a,saving:!1,saveMessage:"Mock拦截配置已保存"})),setTimeout(()=>{C(a=>({...a,saveMessage:""}))},2e3);else throw Error(d.error||"保存失败")}catch(b){console.error("保存Mock拦截配置失败:",b),C(c=>({...c,mockingIntercept:!a,saving:!1,saveMessage:`保存失败: ${b instanceof Error?b.message:"未知错误"}`})),setTimeout(()=>{C(a=>({...a,saveMessage:""}))},3e3)}},a1=async a=>{C(b=>({...b,mockOpen:a,saving:!0,saveMessage:""}));try{let b=await fetch("/api/project-config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:c,projectConfig:{mockingIntercept:B.mockingIntercept,mockOpen:a}})}),d=await b.json();if(d.success)u(b=>b?{...b,mockOpen:a}:b),C(a=>({...a,saving:!1,saveMessage:"Mock开启配置已保存"})),setTimeout(()=>{C(a=>({...a,saveMessage:""}))},2e3);else throw Error(d.error||"保存失败")}catch(b){console.error("保存Mock开启配置失败:",b),C(c=>({...c,mockOpen:!a,saving:!1,saveMessage:`保存失败: ${b instanceof Error?b.message:"未知错误"}`})),setTimeout(()=>{C(a=>({...a,saveMessage:""}))},3e3)}},a2=async a=>{if(!t||!c)return;let b=z[a]?.selectedProxy?.trim();if(!b)return void A(b=>({...b,[a]:{...b[a],saveMessage:"请先选择或填写代理地址"}}));let d=z[a]?.selectedOption,e="custom"===d;A(b=>({...b,[a]:{...b[a],saving:!0,saveMessage:""}}));try{let f={projectName:c,envName:a,newProxy:e?"custom":d||""};e&&(f.customProxyUrl=b);let g=await fetch("/api/project-config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(f)}),h=await g.json();h.success?(u(c=>{if(!c)return c;let d={...c.envs};return d[a]={...d[a],currentProxy:h.data.currentProxy},"custom"===h.data.currentProxy&&(d[a].proxyEnv={...d[a].proxyEnv,custom:b}),{...c,envs:d}}),A(b=>({...b,[a]:{...b[a],saving:!1,saveMessage:"保存成功"}}))):A(b=>({...b,[a]:{...b[a],saving:!1,saveMessage:`保存失败: ${h.error}`}}))}catch(b){console.error("保存配置失败:",b),A(b=>({...b,[a]:{...b[a],saving:!1,saveMessage:"保存失败: 网络错误"}}))}},a3=async()=>{if(window.confirm("确定要一键关闭所有Mock吗?"))try{let a=await fetch("/api/cleanup-mock",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:c})});(await a.json()).success&&await aQ()}catch(a){console.error("清空Mock配置失败:",a)}},a4=async()=>{if(window.confirm("确定要一键开启所有Mock吗?"))try{let a=await fetch("/api/open-all-mock",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:c})});(await a.json()).success&&await aQ()}catch(a){console.error("清空Mock配置失败:",a)}},a5=async(a,b,d)=>{if(c)try{let e=await fetch("/api/mock-setting",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:c,apiName:a,method:b,currentSite:d})}),f=await e.json();f.success?G(c=>c?{...c,mockFiles:c.mockFiles.map(c=>c.apiName===a?{...c,methods:c.methods.map(a=>a.method===b?{...a,setting:{...a.setting,currentSite:d}}:a)}:c)}:c):(console.error("更新场景失败:",f.error),bh("error",`更新场景失败: ${f.error}`))}catch(a){console.error("更新场景失败:",a),bh("error","更新场景失败: 网络错误")}},a6=async(a,b,d)=>{if(c){T(!0),X(!0);try{let e=await fetch(`/api/mock-file-content?project=${encodeURIComponent(c)}&apiName=${encodeURIComponent(a)}&method=${encodeURIComponent(b)}&siteName=${encodeURIComponent(d)}`),f=await e.json();f.success?(P({projectName:c,apiName:a,method:b,siteName:d,content:f.data.content}),R(!0)):(console.error("获取文件内容失败:",f.error),bh("error",`获取文件内容失败: ${f.error}`))}catch(a){console.error("获取文件内容失败:",a),bh("error","获取文件内容失败: 网络错误")}finally{T(!1)}}},a7=async()=>{if(O){V(!0);try{let a=await fetch("/api/mock-file-content",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(O)}),b=await a.json();b.success?(R(!1),P(null)):(console.error("保存文件失败:",b.error),bh("error",`保存文件失败: ${b.error}`))}catch(a){console.error("保存文件失败:",a),bh("error","保存文件失败: 网络错误")}finally{V(!1)}}},a8=()=>{R(!1),P(null),X(!0)},a9=(a,b)=>{"siteName"===a&&ac||ah(c=>({...c,[a]:b}))},ba=(a,b)=>{let c=a.toUpperCase(),d=b.replace(/\//g,"_").replace(/^_/,"");switch(c){case"GET":return`const Mock = require('mockjs');
|
|
5
|
+
For more information, see https://radix-ui.com/primitives/docs/components/${b.docsSlug}`;return(0,d.useEffect)(()=>{a&&(document.getElementById(a)||console.error(c))},[c,a]),null},Z=({contentRef:a,descriptionId:b})=>{let c=X("DialogDescriptionWarning"),e=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${c.contentName}}.`;return(0,d.useEffect)(()=>{let c=a.current?.getAttribute("aria-describedby");b&&c&&(document.getElementById(b)||console.warn(e))},[e,a,b]),null},$=y,_=A,aa=E,ab=G,ac=K,ad=P,ae=R,af=T},76315:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({__iconNode:()=>b,default:()=>c});var d=a.i(49756);let b=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],c=(0,d.default)("x",b)}},97231:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({XIcon:()=>d.default});var d=a.i(76315)},22529:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({Dialog:()=>h,DialogClose:()=>k,DialogContent:()=>m,DialogDescription:()=>q,DialogFooter:()=>o,DialogHeader:()=>n,DialogOverlay:()=>l,DialogPortal:()=>j,DialogTitle:()=>p,DialogTrigger:()=>i});var d=a.i(99559),e=a.i(66067),f=a.i(97231),g=a.i(61073);function h({...a}){return(0,d.jsx)(e.Root,{"data-slot":"dialog",...a})}function i({...a}){return(0,d.jsx)(e.Trigger,{"data-slot":"dialog-trigger",...a})}function j({...a}){return(0,d.jsx)(e.Portal,{"data-slot":"dialog-portal",...a})}function k({...a}){return(0,d.jsx)(e.Close,{"data-slot":"dialog-close",...a})}function l({className:a,...b}){return(0,d.jsx)(e.Overlay,{"data-slot":"dialog-overlay",className:(0,g.cn)("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",a),...b})}function m({className:a,children:b,showCloseButton:c=!0,...h}){return(0,d.jsxs)(j,{"data-slot":"dialog-portal",children:[(0,d.jsx)(l,{}),(0,d.jsxs)(e.Content,{"data-slot":"dialog-content",className:(0,g.cn)("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200",a),...h,children:[b,c&&(0,d.jsxs)(e.Close,{"data-slot":"dialog-close",className:"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",children:[(0,d.jsx)(f.XIcon,{}),(0,d.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})}function n({className:a,...b}){return(0,d.jsx)("div",{"data-slot":"dialog-header",className:(0,g.cn)("flex flex-col gap-2 text-center sm:text-left",a),...b})}function o({className:a,...b}){return(0,d.jsx)("div",{"data-slot":"dialog-footer",className:(0,g.cn)("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",a),...b})}function p({className:a,...b}){return(0,d.jsx)(e.Title,{"data-slot":"dialog-title",className:(0,g.cn)("text-lg leading-none font-semibold",a),...b})}function q({className:a,...b}){return(0,d.jsx)(e.Description,{"data-slot":"dialog-description",className:(0,g.cn)("text-muted-foreground text-sm",a),...b})}},63180:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({canUseDOM:()=>d,composeEventHandlers:()=>e,getActiveElement:()=>function a(b,c=!1){let{activeElement:d}=g(b);if(!d?.nodeName)return null;if(h(d)&&d.contentDocument)return a(d.contentDocument.body,c);if(c){let a=d.getAttribute("aria-activedescendant");if(a){let b=g(d).getElementById(a);if(b)return b}}return d},getOwnerDocument:()=>g,getOwnerWindow:()=>f,isFrame:()=>h});var d=!!("undefined"!=typeof window&&window.document&&window.document.createElement);function e(a,b,{checkForDefaultPrevented:c=!0}={}){return function(d){if(a?.(d),!1===c||!d.defaultPrevented)return b?.(d)}}function f(a){if(!d)throw Error("Cannot access window outside of the DOM");return a?.ownerDocument?.defaultView??window}function g(a){if(!d)throw Error("Cannot access document outside of the DOM");return a?.ownerDocument??document}function h(a){return"IFRAME"===a.tagName}},35168:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({Presence:()=>g,Root:()=>i});var d=a.i(57560),e=a.i(18982),f=a.i(73639),g=a=>{let{present:b,children:c}=a,g=function(a){var b,c;let[e,g]=(0,d.useState)(),i=(0,d.useRef)(null),j=(0,d.useRef)(a),k=(0,d.useRef)("none"),[l,m]=(b=a?"mounted":"unmounted",c={mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}},(0,d.useReducer)((a,b)=>c[a][b]??a,b));return(0,d.useEffect)(()=>{let a=h(i.current);k.current="mounted"===l?a:"none"},[l]),(0,f.useLayoutEffect)(()=>{let b=i.current,c=j.current;if(c!==a){let d=k.current,e=h(b);a?m("MOUNT"):"none"===e||b?.display==="none"?m("UNMOUNT"):c&&d!==e?m("ANIMATION_OUT"):m("UNMOUNT"),j.current=a}},[a,m]),(0,f.useLayoutEffect)(()=>{if(e){let a,b=e.ownerDocument.defaultView??window,c=c=>{let d=h(i.current).includes(CSS.escape(c.animationName));if(c.target===e&&d&&(m("ANIMATION_END"),!j.current)){let c=e.style.animationFillMode;e.style.animationFillMode="forwards",a=b.setTimeout(()=>{"forwards"===e.style.animationFillMode&&(e.style.animationFillMode=c)})}},d=a=>{a.target===e&&(k.current=h(i.current))};return e.addEventListener("animationstart",d),e.addEventListener("animationcancel",c),e.addEventListener("animationend",c),()=>{b.clearTimeout(a),e.removeEventListener("animationstart",d),e.removeEventListener("animationcancel",c),e.removeEventListener("animationend",c)}}m("ANIMATION_END")},[e,m]),{isPresent:["mounted","unmountSuspended"].includes(l),ref:(0,d.useCallback)(a=>{i.current=a?getComputedStyle(a):null,g(a)},[])}}(b),i="function"==typeof c?c({present:g.isPresent}):d.Children.only(c),j=(0,e.useComposedRefs)(g.ref,function(a){let b=Object.getOwnPropertyDescriptor(a.props,"ref")?.get,c=b&&"isReactWarning"in b&&b.isReactWarning;return c?a.ref:(c=(b=Object.getOwnPropertyDescriptor(a,"ref")?.get)&&"isReactWarning"in b&&b.isReactWarning)?a.props.ref:a.props.ref||a.ref}(i));return"function"==typeof c||g.isPresent?(0,d.cloneElement)(i,{ref:j}):null};function h(a){return a?.animationName||"none"}g.displayName="Presence";var i=g},27393:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({Checkbox:()=>v,CheckboxIndicator:()=>x,Indicator:()=>x,Root:()=>v,createCheckboxScope:()=>p,unstable_BubbleInput:()=>z,unstable_CheckboxBubbleInput:()=>z,unstable_CheckboxProvider:()=>s,unstable_CheckboxTrigger:()=>u,unstable_Provider:()=>s,unstable_Trigger:()=>u});var d=a.i(57560),e=a.i(18982),f=a.i(14625),g=a.i(63180),h=a.i(75654),i=a.i(40811),j=a.i(85091),k=a.i(35168),l=a.i(71444),m=a.i(99559),n="Checkbox",[o,p]=(0,f.createContextScope)(n),[q,r]=o(n);function s(a){let{__scopeCheckbox:b,checked:c,children:e,defaultChecked:f,disabled:g,form:i,name:j,onCheckedChange:k,required:l,value:o="on",internal_do_not_use_render:p}=a,[r,s]=(0,h.useControllableState)({prop:c,defaultProp:f??!1,onChange:k,caller:n}),[t,u]=(0,d.useState)(null),[v,w]=(0,d.useState)(null),x=(0,d.useRef)(!1),y=!t||!!i||!!t.closest("form"),z={checked:r,disabled:g,setChecked:s,control:t,setControl:u,name:j,form:i,value:o,hasConsumerStoppedPropagationRef:x,required:l,defaultChecked:!A(f)&&f,isFormControl:y,bubbleInput:v,setBubbleInput:w};return(0,m.jsx)(q,{scope:b,...z,children:"function"==typeof p?p(z):e})}var t="CheckboxTrigger",u=(0,d.forwardRef)(({__scopeCheckbox:a,onKeyDown:b,onClick:c,...f},h)=>{let{control:i,value:j,disabled:k,checked:n,required:o,setControl:p,setChecked:q,hasConsumerStoppedPropagationRef:s,isFormControl:u,bubbleInput:v}=r(t,a),w=(0,e.useComposedRefs)(h,p),x=(0,d.useRef)(n);return(0,d.useEffect)(()=>{let a=i?.form;if(a){let b=()=>q(x.current);return a.addEventListener("reset",b),()=>a.removeEventListener("reset",b)}},[i,q]),(0,m.jsx)(l.Primitive.button,{type:"button",role:"checkbox","aria-checked":A(n)?"mixed":n,"aria-required":o,"data-state":B(n),"data-disabled":k?"":void 0,disabled:k,value:j,...f,ref:w,onKeyDown:(0,g.composeEventHandlers)(b,a=>{"Enter"===a.key&&a.preventDefault()}),onClick:(0,g.composeEventHandlers)(c,a=>{q(a=>!!A(a)||!a),v&&u&&(s.current=a.isPropagationStopped(),s.current||a.stopPropagation())})})});u.displayName=t;var v=(0,d.forwardRef)((a,b)=>{let{__scopeCheckbox:c,name:d,checked:e,defaultChecked:f,required:g,disabled:h,value:i,onCheckedChange:j,form:k,...l}=a;return(0,m.jsx)(s,{__scopeCheckbox:c,checked:e,defaultChecked:f,disabled:h,required:g,onCheckedChange:j,name:d,form:k,value:i,internal_do_not_use_render:({isFormControl:a})=>(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(u,{...l,ref:b,__scopeCheckbox:c}),a&&(0,m.jsx)(z,{__scopeCheckbox:c})]})})});v.displayName=n;var w="CheckboxIndicator",x=(0,d.forwardRef)((a,b)=>{let{__scopeCheckbox:c,forceMount:d,...e}=a,f=r(w,c);return(0,m.jsx)(k.Presence,{present:d||A(f.checked)||!0===f.checked,children:(0,m.jsx)(l.Primitive.span,{"data-state":B(f.checked),"data-disabled":f.disabled?"":void 0,...e,ref:b,style:{pointerEvents:"none",...a.style}})})});x.displayName=w;var y="CheckboxBubbleInput",z=(0,d.forwardRef)(({__scopeCheckbox:a,...b},c)=>{let{control:f,hasConsumerStoppedPropagationRef:g,checked:h,defaultChecked:k,required:n,disabled:o,name:p,value:q,form:s,bubbleInput:t,setBubbleInput:u}=r(y,a),v=(0,e.useComposedRefs)(c,u),w=(0,i.usePrevious)(h),x=(0,j.useSize)(f);(0,d.useEffect)(()=>{if(!t)return;let a=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,"checked").set,b=!g.current;if(w!==h&&a){let c=new Event("click",{bubbles:b});t.indeterminate=A(h),a.call(t,!A(h)&&h),t.dispatchEvent(c)}},[t,w,h,g]);let z=(0,d.useRef)(!A(h)&&h);return(0,m.jsx)(l.Primitive.input,{type:"checkbox","aria-hidden":!0,defaultChecked:k??z.current,required:n,disabled:o,name:p,value:q,form:s,...b,tabIndex:-1,ref:v,style:{...b.style,...x,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})});function A(a){return"indeterminate"===a}function B(a){return A(a)?"indeterminate":a?"checked":"unchecked"}z.displayName=y},97937:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({Check:()=>d.default});var d=a.i(76174)},34983:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({Checkbox:()=>b});var d=a.i(99559),e=a.i(57560),f=a.i(27393),g=a.i(97937),h=a.i(61073);let b=(0,e.forwardRef)(({className:a,...b},c)=>(0,d.jsx)(f.Root,{ref:c,className:(0,h.cn)("peer h-4 w-4 shrink-0 rounded-sm border border-gray-300 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-gray-900 data-[state=checked]:text-white dark:border-gray-800 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300 dark:data-[state=checked]:bg-gray-50 dark:data-[state=checked]:text-gray-900",a),...b,children:(0,d.jsx)(f.Indicator,{className:(0,h.cn)("flex items-center justify-center text-current"),children:(0,d.jsx)(g.Check,{className:"h-4 w-4"})})}));b.displayName=f.Root.displayName}},84172:a=>{"use strict";var{g:b,__dirname:c}=a;function d(a,b,c){return b in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function e(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function f(a){for(var b=1;b<arguments.length;b++){var c=null!=arguments[b]?arguments[b]:{};b%2?e(Object(c),!0).forEach(function(b){d(a,b,c[b])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(c)):e(Object(c)).forEach(function(b){Object.defineProperty(a,b,Object.getOwnPropertyDescriptor(c,b))})}return a}function g(a,b){if(null==a)return{};var c,d,e={},f=Object.keys(a);for(d=0;d<f.length;d++)c=f[d],b.indexOf(c)>=0||(e[c]=a[c]);return e}function h(a,b){if(null==a)return{};var c,d,e=g(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],!(b.indexOf(c)>=0)&&Object.prototype.propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}function i(a,b){return j(a)||k(a,b)||l(a,b)||n()}function j(a){if(Array.isArray(a))return a}function k(a,b){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(a)){var c=[],d=!0,e=!1,f=void 0;try{for(var g,h=a[Symbol.iterator]();!(d=(g=h.next()).done)&&(c.push(g.value),!b||c.length!==b);d=!0);}catch(a){e=!0,f=a}finally{try{d||null==h.return||h.return()}finally{if(e)throw f}}return c}}function l(a,b){if(a){if("string"==typeof a)return m(a,b);var c=Object.prototype.toString.call(a).slice(8,-1);if("Object"===c&&a.constructor&&(c=a.constructor.name),"Map"===c||"Set"===c)return Array.from(a);if("Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c))return m(a,b)}}function m(a,b){(null==b||b>a.length)&&(b=a.length);for(var c=0,d=Array(b);c<b;c++)d[c]=a[c];return d}function n(){throw TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}a.s({arrayLikeToArray:()=>m,arrayWithHoles:()=>j,defineProperty:()=>d,iterableToArrayLimit:()=>k,nonIterableRest:()=>n,objectSpread2:()=>f,objectWithoutProperties:()=>h,objectWithoutPropertiesLoose:()=>g,slicedToArray:()=>i,unsupportedIterableToArray:()=>l})},21782:a=>{"use strict";var{g:b,__dirname:c}=a;{function d(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function e(a){for(var b=1;b<arguments.length;b++){var c=null!=arguments[b]?arguments[b]:{};b%2?d(Object(c),!0).forEach(function(b){var d;d=c[b],b in a?Object.defineProperty(a,b,{value:d,enumerable:!0,configurable:!0,writable:!0}):a[b]=d}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(c)):d(Object(c)).forEach(function(b){Object.defineProperty(a,b,Object.getOwnPropertyDescriptor(c,b))})}return a}function f(a){return function b(){for(var c=this,d=arguments.length,e=Array(d),f=0;f<d;f++)e[f]=arguments[f];return e.length>=a.length?a.apply(this,e):function(){for(var a=arguments.length,d=Array(a),f=0;f<a;f++)d[f]=arguments[f];return b.apply(c,[].concat(e,d))}}}function g(a){return({}).toString.call(a).includes("Object")}function h(a){return"function"==typeof a}a.s({default:()=>b});var i=f(function(a,b){throw Error(a[b]||a.default)})({initialIsRequired:"initial state is required",initialType:"initial state should be an object",initialContent:"initial state shouldn't be an empty object",handlerType:"handler should be an object or a function",handlersType:"all handlers should be a functions",selectorType:"selector should be a function",changeType:"provided value of changes should be an object",changeField:'it seams you want to change a field in the state which is not specified in the "initial" state',default:"an unknown error accured in `state-local` package"}),j={changes:function(a,b){return g(b)||i("changeType"),Object.keys(b).some(function(b){return!Object.prototype.hasOwnProperty.call(a,b)})&&i("changeField"),b},selector:function(a){h(a)||i("selectorType")},handler:function(a){h(a)||g(a)||i("handlerType"),g(a)&&Object.values(a).some(function(a){return!h(a)})&&i("handlersType")},initial:function(a){a||i("initialIsRequired"),g(a)||i("initialType"),Object.keys(a).length||i("initialContent")}};function k(a,b){return h(b)?b(a.current):b}function l(a,b){return a.current=e(e({},a.current),b),b}function m(a,b,c){return h(b)?b(a.current):Object.keys(c).forEach(function(c){var d;return null==(d=b[c])?void 0:d.call(b,a.current[c])}),c}let b={create:function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};j.initial(a),j.handler(b);var c={current:a},d=f(m)(c,b),e=f(l)(c),g=f(j.changes)(a),h=f(k)(c);return[function(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(a){return a};return j.selector(a),a(c.current)},function(a){(function(){for(var a=arguments.length,b=Array(a),c=0;c<a;c++)b[c]=arguments[c];return function(a){return b.reduceRight(function(a,b){return b(a)},a)}})(d,e,g,h)(a)}]}}}},14260:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b});let b={paths:{vs:"https://cdn.jsdelivr.net/npm/monaco-editor@0.52.2/min/vs"}}}},45287:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b});let b=function(a){return function b(){for(var c=this,d=arguments.length,e=Array(d),f=0;f<d;f++)e[f]=arguments[f];return e.length>=a.length?a.apply(this,e):function(){for(var a=arguments.length,d=Array(a),f=0;f<a;f++)d[f]=arguments[f];return b.apply(c,[].concat(e,d))}}}}},82863:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b});let b=function(a){return({}).toString.call(a).includes("Object")}}},72859:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b,errorHandler:()=>g,errorMessages:()=>f});var d=a.i(45287),e=a.i(82863),f={configIsRequired:"the configuration object is required",configType:"the configuration object should be an object",default:"an unknown error accured in `@monaco-editor/loader` package",deprecation:"Deprecation warning!\n You are using deprecated way of configuration.\n\n Instead of using\n monaco.config({ urls: { monacoBase: '...' } })\n use\n monaco.config({ paths: { vs: '...' } })\n\n For more please check the link https://github.com/suren-atoyan/monaco-loader#config\n "},g=(0,d.default)(function(a,b){throw Error(a[b]||a.default)})(f);let b={config:function(a){return(a||g("configIsRequired"),(0,e.default)(a)||g("configType"),a.urls)?(console.warn(f.deprecation),{paths:{vs:a.urls.monacoBase}}):a}}}},87871:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b});let b=function(){for(var a=arguments.length,b=Array(a),c=0;c<a;c++)b[c]=arguments[c];return function(a){return b.reduceRight(function(a,b){return b(a)},a)}}}},28251:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b});var d=a.i(84172);let b=function a(b,c){return Object.keys(c).forEach(function(d){c[d]instanceof Object&&b[d]&&Object.assign(c[d],a(b[d],c[d]))}),(0,d.objectSpread2)((0,d.objectSpread2)({},b),c)}}},83021:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({CANCELATION_MESSAGE:()=>d,default:()=>b});var d={type:"cancelation",msg:"operation is manually canceled"};let b=function(a){var b=!1,c=new Promise(function(c,e){a.then(function(a){return b?e(d):c(a)}),a.catch(e)});return c.cancel=function(){return b=!0},c}}},75092:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>b});var d=a.i(84172),e=a.i(21782),f=a.i(14260),g=a.i(72859),h=a.i(87871),i=a.i(28251),j=a.i(83021),k=e.default.create({config:f.default,isInitialized:!1,resolve:null,reject:null,monaco:null}),l=(0,d.slicedToArray)(k,2),m=l[0],n=l[1];function o(a){return document.body.appendChild(a)}function p(a){var b,c,d=m(function(a){return{config:a.config,reject:a.reject}}),e=(b="".concat(d.config.paths.vs,"/loader.js"),c=document.createElement("script"),b&&(c.src=b),c);return e.onload=function(){return a()},e.onerror=d.reject,e}function q(){var a=m(function(a){return{config:a.config,resolve:a.resolve,reject:a.reject}}),b=window.require;b.config(a.config),b(["vs/editor/editor.main"],function(b){r(b),a.resolve(b)},function(b){a.reject(b)})}function r(a){m().monaco||n({monaco:a})}var s=new Promise(function(a,b){return n({resolve:a,reject:b})});let b={config:function(a){var b=g.default.config(a),c=b.monaco,e=(0,d.objectWithoutProperties)(b,["monaco"]);n(function(a){return{config:(0,i.default)(a.config,e),monaco:c}})},init:function(){var a=m(function(a){return{monaco:a.monaco,isInitialized:a.isInitialized,resolve:a.resolve}});if(!a.isInitialized){if(n({isInitialized:!0}),a.monaco)return a.resolve(a.monaco),(0,j.default)(s);if(window.monaco&&window.monaco.editor)return r(window.monaco),a.resolve(window.monaco),(0,j.default)(s);(0,h.default)(o,p)(q)}return(0,j.default)(s)},__getMonacoInstance:function(){return m(function(a){return a.monaco})}}}},74403:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({}),a.i(75092)},30132:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({}),a.i(75092),a.i(74403)},22027:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({DiffEditor:()=>o,Editor:()=>s,default:()=>t,useMonaco:()=>p}),a.i(30132);var d=a.i(57560),e=a.i(75092),f={wrapper:{display:"flex",position:"relative",textAlign:"initial"},fullWidth:{width:"100%"},hide:{display:"none"}},g={container:{display:"flex",height:"100%",width:"100%",justifyContent:"center",alignItems:"center"}},h=function({children:a}){return d.default.createElement("div",{style:g.container},a)},i=(0,d.memo)(function({width:a,height:b,isEditorReady:c,loading:e,_ref:g,className:i,wrapperProps:j}){return d.default.createElement("section",{style:{...f.wrapper,width:a,height:b},...j},!c&&d.default.createElement(h,null,e),d.default.createElement("div",{ref:g,style:{...f.fullWidth,...!c&&f.hide},className:i}))}),j=function(a){(0,d.useEffect)(a,[])},k=function(a,b,c=!0){let e=(0,d.useRef)(!0);(0,d.useEffect)(e.current||!c?()=>{e.current=!1}:a,b)};function l(){}function m(a,b,c,d){var e,f,g,h,i,j;return e=a,f=d,e.editor.getModel(n(e,f))||(g=a,h=b,i=c,j=d,g.editor.createModel(h,i,j?n(g,j):void 0))}function n(a,b){return a.Uri.parse(b)}var o=(0,d.memo)(function({original:a,modified:b,language:c,originalLanguage:f,modifiedLanguage:g,originalModelPath:h,modifiedModelPath:n,keepCurrentOriginalModel:o=!1,keepCurrentModifiedModel:p=!1,theme:q="light",loading:r="Loading...",options:s={},height:t="100%",width:u="100%",className:v,wrapperProps:w={},beforeMount:x=l,onMount:y=l}){let[z,A]=(0,d.useState)(!1),[B,C]=(0,d.useState)(!0),D=(0,d.useRef)(null),E=(0,d.useRef)(null),F=(0,d.useRef)(null),G=(0,d.useRef)(y),H=(0,d.useRef)(x),I=(0,d.useRef)(!1);j(()=>{let a=e.default.init();return a.then(a=>(E.current=a)&&C(!1)).catch(a=>a?.type!=="cancelation"&&console.error("Monaco initialization: error:",a)),()=>{let b;return D.current?(b=D.current?.getModel(),void(o||b?.original?.dispose(),p||b?.modified?.dispose(),D.current?.dispose())):a.cancel()}}),k(()=>{if(D.current&&E.current){let b=D.current.getOriginalEditor(),d=m(E.current,a||"",f||c||"text",h||"");d!==b.getModel()&&b.setModel(d)}},[h],z),k(()=>{if(D.current&&E.current){let a=D.current.getModifiedEditor(),d=m(E.current,b||"",g||c||"text",n||"");d!==a.getModel()&&a.setModel(d)}},[n],z),k(()=>{let a=D.current.getModifiedEditor();a.getOption(E.current.editor.EditorOption.readOnly)?a.setValue(b||""):b!==a.getValue()&&(a.executeEdits("",[{range:a.getModel().getFullModelRange(),text:b||"",forceMoveMarkers:!0}]),a.pushUndoStop())},[b],z),k(()=>{D.current?.getModel()?.original.setValue(a||"")},[a],z),k(()=>{let{original:a,modified:b}=D.current.getModel();E.current.editor.setModelLanguage(a,f||c||"text"),E.current.editor.setModelLanguage(b,g||c||"text")},[c,f,g],z),k(()=>{E.current?.editor.setTheme(q)},[q],z),k(()=>{D.current?.updateOptions(s)},[s],z);let J=(0,d.useCallback)(()=>{if(!E.current)return;H.current(E.current);let d=m(E.current,a||"",f||c||"text",h||""),e=m(E.current,b||"",g||c||"text",n||"");D.current?.setModel({original:d,modified:e})},[c,b,g,a,f,h,n]),K=(0,d.useCallback)(()=>{!I.current&&F.current&&(D.current=E.current.editor.createDiffEditor(F.current,{automaticLayout:!0,...s}),J(),E.current?.editor.setTheme(q),A(!0),I.current=!0)},[s,q,J]);return(0,d.useEffect)(()=>{z&&G.current(D.current,E.current)},[z]),(0,d.useEffect)(()=>{B||z||K()},[B,z,K]),d.default.createElement(i,{width:u,height:t,isEditorReady:z,loading:r,_ref:F,className:v,wrapperProps:w})}),p=function(){let[a,b]=(0,d.useState)(e.default.__getMonacoInstance());return j(()=>{let c;return a||(c=e.default.init()).then(a=>{b(a)}),()=>c?.cancel()}),a},q=function(a){let b=(0,d.useRef)();return(0,d.useEffect)(()=>{b.current=a},[a]),b.current},r=new Map,s=(0,d.memo)(function({defaultValue:a,defaultLanguage:b,defaultPath:c,value:f,language:g,path:h,theme:n="light",line:o,loading:p="Loading...",options:s={},overrideServices:t={},saveViewState:u=!0,keepCurrentModel:v=!1,width:w="100%",height:x="100%",className:y,wrapperProps:z={},beforeMount:A=l,onMount:B=l,onChange:C,onValidate:D=l}){let[E,F]=(0,d.useState)(!1),[G,H]=(0,d.useState)(!0),I=(0,d.useRef)(null),J=(0,d.useRef)(null),K=(0,d.useRef)(null),L=(0,d.useRef)(B),M=(0,d.useRef)(A),N=(0,d.useRef)(),O=(0,d.useRef)(f),P=q(h),Q=(0,d.useRef)(!1),R=(0,d.useRef)(!1);j(()=>{let a=e.default.init();return a.then(a=>(I.current=a)&&H(!1)).catch(a=>a?.type!=="cancelation"&&console.error("Monaco initialization: error:",a)),()=>J.current?void(N.current?.dispose(),v?u&&r.set(h,J.current.saveViewState()):J.current.getModel()?.dispose(),J.current.dispose()):a.cancel()}),k(()=>{let d=m(I.current,a||f||"",b||g||"",h||c||"");d!==J.current?.getModel()&&(u&&r.set(P,J.current?.saveViewState()),J.current?.setModel(d),u&&J.current?.restoreViewState(r.get(h)))},[h],E),k(()=>{J.current?.updateOptions(s)},[s],E),k(()=>{J.current&&void 0!==f&&(J.current.getOption(I.current.editor.EditorOption.readOnly)?J.current.setValue(f):f!==J.current.getValue()&&(R.current=!0,J.current.executeEdits("",[{range:J.current.getModel().getFullModelRange(),text:f,forceMoveMarkers:!0}]),J.current.pushUndoStop(),R.current=!1))},[f],E),k(()=>{let a=J.current?.getModel();a&&g&&I.current?.editor.setModelLanguage(a,g)},[g],E),k(()=>{void 0!==o&&J.current?.revealLine(o)},[o],E),k(()=>{I.current?.editor.setTheme(n)},[n],E);let S=(0,d.useCallback)(()=>{if(!(!K.current||!I.current)&&!Q.current){M.current(I.current);let d=h||c,e=m(I.current,f||a||"",b||g||"",d||"");J.current=I.current?.editor.create(K.current,{model:e,automaticLayout:!0,...s},t),u&&J.current.restoreViewState(r.get(d)),I.current.editor.setTheme(n),void 0!==o&&J.current.revealLine(o),F(!0),Q.current=!0}},[a,b,c,f,g,h,s,t,u,n,o]);return(0,d.useEffect)(()=>{E&&L.current(J.current,I.current)},[E]),(0,d.useEffect)(()=>{G||E||S()},[G,E,S]),O.current=f,(0,d.useEffect)(()=>{E&&C&&(N.current?.dispose(),N.current=J.current?.onDidChangeModelContent(a=>{R.current||C(J.current.getValue(),a)}))},[E,C]),(0,d.useEffect)(()=>{if(E){let a=I.current.editor.onDidChangeMarkers(a=>{let b=J.current.getModel()?.uri;if(b&&a.find(a=>a.path===b.path)){let a=I.current.editor.getModelMarkers({resource:b});D?.(a)}});return()=>{a?.dispose()}}return()=>{}},[E,D]),d.default.createElement(i,{width:w,height:x,isEditorReady:E,loading:p,_ref:K,className:y,wrapperProps:z})}),t=s},28783:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({}),a.i(30132),a.i(57560),a.i(22027)},82587:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({default:()=>i});var d=a.i(99559),e=a.i(57560),f=a.i(60284),g=a.i(94688),h=a.i(50923);function i({className:a,currentProjectName:b,currentEnvName:c}){let[i,j]=(0,e.useState)([]),[k,l]=(0,e.useState)(!0),[m,n]=(0,e.useState)(null),[o,p]=(0,e.useState)(new Set),[q,r]=(0,e.useState)(""),[s,t]=(0,e.useState)(!1),[u,v]=(0,e.useState)(""),[w,x]=(0,e.useState)(!1),[y,z]=(0,e.useState)(null),A=(0,e.useRef)(null);(0,e.useEffect)(()=>{if(i.length>0){let a=i.find(a=>a.projectName===b&&a.envName===c);if(a&&a.subApps.length>0){let b=new Set;a.subApps.forEach(a=>{i.forEach(c=>{c.envName===a&&b.add(F(c))})}),p(b)}}},[i,b,c]);let B=async()=>{l(!0),n(null);try{let a=await fetch("/api/all-projects-envs"),b=await a.json();b.success?j(b.data):n(b.error||"获取项目环境信息失败")}catch(a){console.error("获取项目环境信息失败:",a),n("获取项目环境信息失败: 网络错误")}finally{l(!1)}};(0,e.useEffect)(()=>(B(),C(),()=>{D()}),[c]);let C=()=>{A.current&&D();let a=`microapp-table-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,b=`/api/microapp-proxy-change-stream?env=${encodeURIComponent(c)}&clientId=${encodeURIComponent(a)}`;console.log(`[SSE] 建立连接到: ${b}`),z(null);try{let a=new EventSource(b);A.current=a,a.onopen=()=>{console.log(`[SSE] 连接已建立,环境: ${c}`),x(!0),z(null)},a.onmessage=a=>{try{let b=JSON.parse(a.data);E(b)}catch(a){console.error("[SSE] 解析消息失败:",a)}},a.onerror=()=>{console.error(`[SSE] 连接错误,环境: ${c}`),x(!1),z("实时推送连接断开"),setTimeout(()=>{A.current&&A.current.readyState!==EventSource.CLOSED||(console.log("[SSE] 尝试重新连接..."),C())},3e3)}}catch(a){console.error("[SSE] 建立连接失败:",a),z("无法建立实时推送连接")}},D=()=>{A.current&&(console.log("[SSE] 关闭连接"),A.current.close(),A.current=null,x(!1))},E=a=>{switch(console.log("[SSE] 收到消息:",a),a.type){case"connection-established":console.log(`[SSE] 连接确认: ${a.message}`),x(!0),z(null);break;case"microapp-proxy-config-change":if(console.log(`[SSE] 配置变化通知: 环境=${a.envName}`),console.log(`[SSE] 变化详情:`,a.changes),a.changes){let{added:b,removed:c}=a.changes,d="";b.length>0&&(d+=`新增: ${b.join(", ")}`),c.length>0&&(d&&(d+="; "),d+=`移除: ${c.join(", ")}`),v(`配置已更新 (${d})`)}else v("配置已更新");B(),setTimeout(()=>v(""),3e3);break;case"heartbeat":x(!0),z(null);break;default:console.log("[SSE] 未知消息类型:",a.type)}},F=a=>`${a.projectName}-${a.envName}`,G=q.trim()?i.filter(a=>a.projectName.toLowerCase().includes(q.toLowerCase())||a.envName.toLowerCase().includes(q.toLowerCase())||a.host.toLowerCase().includes(q.toLowerCase())):i,H=(a,b)=>{let c=new Set(o);b?c.add(a):c.delete(a),p(c)},I=a=>{a?p(new Set(G.map(a=>F(a)))):p(new Set)},J=async()=>{t(!0),v("");try{let a=Array.from(o).map(a=>{let b=i.find(b=>F(b)===a);return b?b.envName:""}).filter(a=>""!==a),d=[...new Set(a)],e=await fetch("/api/microapp-proxy-config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:b,envName:c,selectedItems:d})}),f=await e.json();f.success?(v(f.message||"保存成功"),await B()):v(`保存失败: ${f.error}`)}catch(a){console.error("保存MicroApp代理配置失败:",a),v("保存失败: 网络错误")}finally{t(!1),setTimeout(()=>{v("")},5e3)}},K=o.size,L=G.length>0&&G.every(a=>o.has(F(a))),M=G.some(a=>o.has(F(a)));return k?(0,d.jsxs)("div",{className:`p-6 bg-gray-50 rounded-lg ${a}`,children:[(0,d.jsx)("h4",{className:"text-md font-medium mb-4",children:"MicroApp代理配置"}),(0,d.jsx)("div",{className:"text-center py-8",children:(0,d.jsx)("p",{className:"text-gray-500",children:"加载中..."})})]}):m?(0,d.jsxs)("div",{className:`p-6 bg-gray-50 rounded-lg ${a}`,children:[(0,d.jsx)("h4",{className:"text-md font-medium mb-4",children:"MicroApp代理配置"}),(0,d.jsxs)("div",{className:"text-center py-8",children:[(0,d.jsx)("p",{className:"text-red-500",children:m}),(0,d.jsx)(h.Button,{variant:"outline",size:"sm",onClick:B,className:"mt-2",children:"重试"})]})]}):(0,d.jsxs)("div",{className:`p-6 bg-gray-50 rounded-lg ${a}`,children:[(0,d.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h4",{className:"text-md font-medium",children:"MicroApp代理配置"}),(0,d.jsxs)("p",{className:"text-xs text-gray-500 mt-1",children:["为 ",b," - ",c," 环境配置微应用代理"]})]}),(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsxs)("div",{className:"flex items-center gap-1",children:[(0,d.jsx)("div",{className:`w-2 h-2 rounded-full ${w?"bg-green-500":"bg-red-500"}`,title:w?"实时推送已连接":"实时推送断开"}),(0,d.jsx)("span",{className:"text-xs text-gray-500",children:w?"实时":"离线"})]}),(u||y)&&(0,d.jsx)("span",{className:`text-sm max-w-xs ${u&&u.includes("失败")||y?"text-red-600":u&&u.includes("但有")?"text-yellow-600":"text-green-600"}`,title:u||y||"",children:u||y}),(0,d.jsx)(h.Button,{variant:"outline",size:"sm",onClick:B,disabled:s,children:"刷新"}),(0,d.jsx)(h.Button,{variant:"default",size:"sm",onClick:J,disabled:s,children:s?"保存中...":"保存配置"})]})]}),(0,d.jsxs)("div",{className:"space-y-3 mb-4",children:[(0,d.jsx)("div",{className:"flex items-center gap-2",children:(0,d.jsxs)("div",{className:"relative flex-1 max-w-md",children:[(0,d.jsx)(g.Input,{placeholder:"搜索项目名称、环境名称或Host...",value:q,onChange:a=>r(a.target.value),className:"pr-8"}),q&&(0,d.jsx)(h.Button,{variant:"ghost",size:"sm",onClick:()=>{r("")},className:"absolute right-1 top-1/2 transform -translate-y-1/2 h-6 w-6 p-0 hover:bg-gray-100",children:"×"})]})}),(0,d.jsxs)("div",{className:"flex items-center justify-between text-sm text-gray-600",children:[(0,d.jsxs)("div",{className:"flex items-center gap-4",children:[(0,d.jsxs)("span",{children:["显示 ",G.length," 个环境配置",q&&` (搜索: "${q}")`]}),K>0&&(0,d.jsxs)("span",{className:"text-blue-600 font-medium",children:["已选择 ",K," 项"]})]}),K>0&&(0,d.jsx)(h.Button,{variant:"outline",size:"sm",onClick:()=>{p(new Set)},children:"清空选择"})]})]}),G.length>0?(0,d.jsx)("div",{className:"border rounded-md",children:(0,d.jsxs)(f.Table,{children:[(0,d.jsx)(f.TableHeader,{children:(0,d.jsxs)(f.TableRow,{children:[(0,d.jsx)(f.TableHead,{className:"w-12",children:(0,d.jsx)("input",{type:"checkbox",checked:L,onChange:a=>I(a.target.checked),ref:a=>{a&&(a.indeterminate=M&&!L)},className:"rounded border-gray-300"})}),(0,d.jsx)(f.TableHead,{children:"环境名称"}),(0,d.jsx)(f.TableHead,{children:"项目名称"}),(0,d.jsx)(f.TableHead,{children:"Host地址"}),(0,d.jsx)(f.TableHead,{children:"当前代理"})]})}),(0,d.jsx)(f.TableBody,{children:G.map(a=>{let b=F(a),c=o.has(b);return(0,d.jsxs)(f.TableRow,{children:[(0,d.jsx)(f.TableCell,{children:(0,d.jsx)("input",{type:"checkbox",checked:c,onChange:a=>H(b,a.target.checked),className:"rounded border-gray-300"})}),(0,d.jsx)(f.TableCell,{children:(0,d.jsx)("span",{className:"px-2 py-1 rounded text-xs font-medium bg-blue-100 text-blue-800",children:a.envName})}),(0,d.jsx)(f.TableCell,{className:"font-medium",children:a.projectName}),(0,d.jsx)(f.TableCell,{className:"font-mono text-sm",children:a.host}),(0,d.jsxs)(f.TableCell,{className:"text-sm text-gray-600",children:[a.currentProxy,a.proxyEnv[a.currentProxy]&&(0,d.jsx)("div",{className:"text-xs text-gray-500",children:a.proxyEnv[a.currentProxy]})]})]},b)})})]})}):(0,d.jsx)("div",{className:"text-center py-8",children:(0,d.jsx)("p",{className:"text-gray-500",children:q?"没有找到匹配的环境配置":"暂无环境配置"})}),K>0&&(0,d.jsx)("div",{className:"mt-4 p-3 bg-blue-50 rounded-md",children:(0,d.jsxs)("div",{className:"flex items-center justify-between",children:[(0,d.jsxs)("span",{className:"text-sm text-blue-700",children:["已选择 ",K," 个环境配置将作为微应用代理"]}),(0,d.jsx)("span",{className:"text-xs text-blue-600",children:"点击上方“保存配置”按钮保存设置"})]})})]})}},23936:function(a){var{g:b,__dirname:c,m:d,e:e}=a},22842:function(a){var{g:b,__dirname:c,m:d,e:e}=a;a.r(23936);var f=a.r(57560),g=f&&"object"==typeof f&&"default"in f?f:{default:f},h="undefined"!=typeof process&&process.env&&!0,i=function(a){return"[object String]"===Object.prototype.toString.call(a)},j=function(){function a(a){var b=void 0===a?{}:a,c=b.name,d=void 0===c?"stylesheet":c,e=b.optimizeForSpeed,f=void 0===e?h:e;k(i(d),"`name` must be a string"),this._name=d,this._deletedRulePlaceholder="#"+d+"-deleted-rule____{}",k("boolean"==typeof f,"`optimizeForSpeed` must be a boolean"),this._optimizeForSpeed=f,this._serverSheet=void 0,this._tags=[],this._injected=!1,this._rulesCount=0;var g="undefined"!=typeof window&&document.querySelector('meta[property="csp-nonce"]');this._nonce=g?g.getAttribute("content"):null}var b,c=a.prototype;return c.setOptimizeForSpeed=function(a){k("boolean"==typeof a,"`setOptimizeForSpeed` accepts a boolean"),k(0===this._rulesCount,"optimizeForSpeed cannot be when rules have already been inserted"),this.flush(),this._optimizeForSpeed=a,this.inject()},c.isOptimizeForSpeed=function(){return this._optimizeForSpeed},c.inject=function(){var a=this;if(k(!this._injected,"sheet already injected"),this._injected=!0,"undefined"!=typeof window&&this._optimizeForSpeed){this._tags[0]=this.makeStyleTag(this._name),this._optimizeForSpeed="insertRule"in this.getSheet(),this._optimizeForSpeed||(h||console.warn("StyleSheet: optimizeForSpeed mode not supported falling back to standard mode."),this.flush(),this._injected=!0);return}this._serverSheet={cssRules:[],insertRule:function(b,c){return"number"==typeof c?a._serverSheet.cssRules[c]={cssText:b}:a._serverSheet.cssRules.push({cssText:b}),c},deleteRule:function(b){a._serverSheet.cssRules[b]=null}}},c.getSheetForTag=function(a){if(a.sheet)return a.sheet;for(var b=0;b<document.styleSheets.length;b++)if(document.styleSheets[b].ownerNode===a)return document.styleSheets[b]},c.getSheet=function(){return this.getSheetForTag(this._tags[this._tags.length-1])},c.insertRule=function(a,b){if(k(i(a),"`insertRule` accepts only strings"),"undefined"==typeof window)return"number"!=typeof b&&(b=this._serverSheet.cssRules.length),this._serverSheet.insertRule(a,b),this._rulesCount++;if(this._optimizeForSpeed){var c=this.getSheet();"number"!=typeof b&&(b=c.cssRules.length);try{c.insertRule(a,b)}catch(b){return h||console.warn("StyleSheet: illegal rule: \n\n"+a+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),-1}}else{var d=this._tags[b];this._tags.push(this.makeStyleTag(this._name,a,d))}return this._rulesCount++},c.replaceRule=function(a,b){if(this._optimizeForSpeed||"undefined"==typeof window){var c="undefined"!=typeof window?this.getSheet():this._serverSheet;if(b.trim()||(b=this._deletedRulePlaceholder),!c.cssRules[a])return a;c.deleteRule(a);try{c.insertRule(b,a)}catch(d){h||console.warn("StyleSheet: illegal rule: \n\n"+b+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),c.insertRule(this._deletedRulePlaceholder,a)}}else{var d=this._tags[a];k(d,"old rule at index `"+a+"` not found"),d.textContent=b}return a},c.deleteRule=function(a){if("undefined"==typeof window)return void this._serverSheet.deleteRule(a);if(this._optimizeForSpeed)this.replaceRule(a,"");else{var b=this._tags[a];k(b,"rule at index `"+a+"` not found"),b.parentNode.removeChild(b),this._tags[a]=null}},c.flush=function(){this._injected=!1,this._rulesCount=0,"undefined"!=typeof window?(this._tags.forEach(function(a){return a&&a.parentNode.removeChild(a)}),this._tags=[]):this._serverSheet.cssRules=[]},c.cssRules=function(){var a=this;return"undefined"==typeof window?this._serverSheet.cssRules:this._tags.reduce(function(b,c){return c?b=b.concat(Array.prototype.map.call(a.getSheetForTag(c).cssRules,function(b){return b.cssText===a._deletedRulePlaceholder?null:b})):b.push(null),b},[])},c.makeStyleTag=function(a,b,c){b&&k(i(b),"makeStyleTag accepts only strings as second parameter");var d=document.createElement("style");this._nonce&&d.setAttribute("nonce",this._nonce),d.type="text/css",d.setAttribute("data-"+a,""),b&&d.appendChild(document.createTextNode(b));var e=document.head||document.getElementsByTagName("head")[0];return c?e.insertBefore(d,c):e.appendChild(d),d},b=[{key:"length",get:function(){return this._rulesCount}}],function(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}(a.prototype,b),a}();function k(a,b){if(!a)throw Error("StyleSheet: "+b+".")}var l=function(a){for(var b=5381,c=a.length;c;)b=33*b^a.charCodeAt(--c);return b>>>0},m={};function n(a,b){if(!b)return"jsx-"+a;var c=String(b),d=a+c;return m[d]||(m[d]="jsx-"+l(a+"-"+c)),m[d]}function o(a,b){"undefined"==typeof window&&(b=b.replace(/\/style/gi,"\\/style"));var c=a+b;return m[c]||(m[c]=b.replace(/__jsx-style-dynamic-selector/g,a)),m[c]}var p=function(){function a(a){var b=void 0===a?{}:a,c=b.styleSheet,d=void 0===c?null:c,e=b.optimizeForSpeed,f=void 0!==e&&e;this._sheet=d||new j({name:"styled-jsx",optimizeForSpeed:f}),this._sheet.inject(),d&&"boolean"==typeof f&&(this._sheet.setOptimizeForSpeed(f),this._optimizeForSpeed=this._sheet.isOptimizeForSpeed()),this._fromServer=void 0,this._indices={},this._instancesCounts={}}var b=a.prototype;return b.add=function(a){var b=this;void 0===this._optimizeForSpeed&&(this._optimizeForSpeed=Array.isArray(a.children),this._sheet.setOptimizeForSpeed(this._optimizeForSpeed),this._optimizeForSpeed=this._sheet.isOptimizeForSpeed()),"undefined"==typeof window||this._fromServer||(this._fromServer=this.selectFromServer(),this._instancesCounts=Object.keys(this._fromServer).reduce(function(a,b){return a[b]=0,a},{}));var c=this.getIdAndRules(a),d=c.styleId,e=c.rules;if(d in this._instancesCounts){this._instancesCounts[d]+=1;return}var f=e.map(function(a){return b._sheet.insertRule(a)}).filter(function(a){return -1!==a});this._indices[d]=f,this._instancesCounts[d]=1},b.remove=function(a){var b=this,c=this.getIdAndRules(a).styleId;if(function(a,b){if(!a)throw Error("StyleSheetRegistry: "+b+".")}(c in this._instancesCounts,"styleId: `"+c+"` not found"),this._instancesCounts[c]-=1,this._instancesCounts[c]<1){var d=this._fromServer&&this._fromServer[c];d?(d.parentNode.removeChild(d),delete this._fromServer[c]):(this._indices[c].forEach(function(a){return b._sheet.deleteRule(a)}),delete this._indices[c]),delete this._instancesCounts[c]}},b.update=function(a,b){this.add(b),this.remove(a)},b.flush=function(){this._sheet.flush(),this._sheet.inject(),this._fromServer=void 0,this._indices={},this._instancesCounts={}},b.cssRules=function(){var a=this,b=this._fromServer?Object.keys(this._fromServer).map(function(b){return[b,a._fromServer[b]]}):[],c=this._sheet.cssRules();return b.concat(Object.keys(this._indices).map(function(b){return[b,a._indices[b].map(function(a){return c[a].cssText}).join(a._optimizeForSpeed?"":"\n")]}).filter(function(a){return!!a[1]}))},b.styles=function(a){var b,c;return b=this.cssRules(),void 0===(c=a)&&(c={}),b.map(function(a){var b=a[0],d=a[1];return g.default.createElement("style",{id:"__"+b,key:"__"+b,nonce:c.nonce?c.nonce:void 0,dangerouslySetInnerHTML:{__html:d}})})},b.getIdAndRules=function(a){var b=a.children,c=a.dynamic,d=a.id;if(c){var e=n(d,c);return{styleId:e,rules:Array.isArray(b)?b.map(function(a){return o(e,a)}):[o(e,b)]}}return{styleId:n(d),rules:Array.isArray(b)?b:[b]}},b.selectFromServer=function(){return Array.prototype.slice.call(document.querySelectorAll('[id^="__jsx-"]')).reduce(function(a,b){return a[b.id.slice(2)]=b,a},{})},a}(),q=f.createContext(null);function r(){return new p}function s(){return f.useContext(q)}q.displayName="StyleSheetContext";var t=g.default.useInsertionEffect||g.default.useLayoutEffect,u="undefined"!=typeof window?r():void 0;function v(a){var b=u||s();return b&&("undefined"==typeof window?b.add(a):t(function(){return b.add(a),function(){b.remove(a)}},[a.id,String(a.dynamic)])),null}v.dynamic=function(a){return a.map(function(a){return n(a[0],a[1])}).join(" ")},e.StyleRegistry=function(a){var b=a.registry,c=a.children,d=f.useContext(q),e=f.useState(function(){return d||b||r()})[0];return g.default.createElement(q.Provider,{value:e},c)},e.createStyleRegistry=r,e.style=v,e.useStyleRegistry=s},62012:function(a){var{g:b,__dirname:c,m:d,e:e}=a;d.exports=a.r(22842).style},55441:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({default:()=>g});var d=a.i(99559),e=a.i(62012),f=a.i(57560);function g({logs:a}){let b=(0,f.useRef)(null),c=(0,f.useRef)(!0),g=a=>a.replace(/\x1b\[[0-9;]*m/g,"").replace(/\x1b\[[0-9]*[A-Z]/g,"").replace(/\x1b\[K/g,"").replace(/\x1b\[2K/g,"").replace(/\x1b\[G/g,"").replace(/\x1b\[\d+A/g,"").replace(/\x1b\[\d+B/g,"").replace(/\x1b\[\d+C/g,"").replace(/\x1b\[\d+D/g,"").replace(/\[2K\[1A\[2K\[G/g,"").replace(/\[\d+[A-Z]/g,"").replace(/\[STDOUT\]/g,"[OUT]").replace(/\[STDERR\]/g,"[ERR]"),h=()=>{if(!b.current)return!0;let{scrollTop:a,scrollHeight:c,clientHeight:d}=b.current;return c-a-d<100},i=()=>{b.current&&c.current&&(b.current.scrollTop=b.current.scrollHeight)};return(0,f.useEffect)(()=>{setTimeout(i,10)},[a]),(0,d.jsxs)("div",{ref:b,onScroll:()=>{c.current=h()},style:{scrollBehavior:"smooth",maxHeight:"100%"},className:"jsx-b464fb0f479e34f5 h-full w-full overflow-y-auto overflow-x-hidden p-4 custom-scrollbar",children:[(0,d.jsx)(e.default,{id:"b464fb0f479e34f5",children:".custom-scrollbar.jsx-b464fb0f479e34f5{scrollbar-width:thin;scrollbar-color:#fff3 #0000001a}.custom-scrollbar.jsx-b464fb0f479e34f5::-webkit-scrollbar{width:10px;height:10px}.custom-scrollbar.jsx-b464fb0f479e34f5::-webkit-scrollbar-track{background:#0000001a;border-radius:5px}.custom-scrollbar.jsx-b464fb0f479e34f5::-webkit-scrollbar-thumb{background:#ffffff4d;border-radius:5px}.custom-scrollbar.jsx-b464fb0f479e34f5.jsx-b464fb0f479e34f5::-webkit-scrollbar-thumb:hover{background:#fff6}"}),(0,d.jsx)("div",{className:"jsx-b464fb0f479e34f5 space-y-0.5",children:a.length>0?a.map((a,b)=>{let c=g(a);if(!c.trim())return null;let e=a.includes("[STDERR]"),f=a.includes("[SYSTEM]"),h=c.match(/^\[([\d-T:.Z]+)\]/)?.[1],i=c.replace(/^\[[\d-T:.Z]+\]\s*/,"");return(0,d.jsxs)("div",{className:`jsx-b464fb0f479e34f5 font-mono text-xs leading-5 ${e?"text-red-400":f?"text-yellow-400":"text-gray-100"}`,children:[h&&(0,d.jsxs)("span",{className:"jsx-b464fb0f479e34f5 text-gray-500 mr-2",children:["[",new Date(h).toLocaleTimeString("zh-CN"),"]"]}),(0,d.jsx)("span",{className:"jsx-b464fb0f479e34f5 whitespace-pre-wrap break-all",children:i})]},b)}):(0,d.jsx)("div",{className:"jsx-b464fb0f479e34f5 text-center text-gray-500 mt-8",children:"等待日志输出..."})})]})}},64708:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({default:()=>g});var d=a.i(99559),e=a.i(57560),f=a.i(50923);function g({projectName:a,className:b="",compact:c=!1}){let[g,h]=(0,e.useState)(null),[i,j]=(0,e.useState)(!1),[k,l]=(0,e.useState)(null),[m,n]=(0,e.useState)(""),o=(0,e.useCallback)(async()=>{if(a){j(!0),l(null);try{let b=await fetch(`/api/current-branch?project=${encodeURIComponent(a)}`),c=await b.json();c.success?(h(c.data),n(new Date().toLocaleTimeString("zh-CN",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"}))):l(c.error||"获取分支信息失败")}catch(a){l("网络请求失败"),console.error("获取分支信息失败:",a)}finally{j(!1)}}},[a]);(0,e.useEffect)(()=>{o()},[o]),(0,e.useEffect)(()=>{if(!a)return;let b=setInterval(()=>{o()},c?15e3:3e4);return()=>clearInterval(b)},[a,o,c]);let p=a=>0===a?"text-gray-500":"text-orange-600",q=()=>{if(!g)return null;let{ahead:a,behind:b}=g.status;return a>0&&b>0?(0,d.jsx)("span",{className:"text-yellow-500 text-xs",children:"↕"}):a>0?(0,d.jsx)("span",{className:"text-green-500 text-xs",children:"↑"}):b>0?(0,d.jsx)("span",{className:"text-red-500 text-xs",children:"↓"}):(0,d.jsx)("span",{className:"text-gray-400 text-xs",children:"✓"})};return i&&!g?c?(0,d.jsxs)("div",{className:`flex items-center gap-2 px-3 py-1 bg-gray-50 rounded-md ${b}`,children:[(0,d.jsx)("div",{className:"animate-spin w-3 h-3 border-2 border-blue-500 border-t-transparent rounded-full"}),(0,d.jsx)("span",{className:"text-xs text-gray-500",children:"加载中..."})]}):(0,d.jsxs)("div",{className:`bg-white rounded-lg shadow-sm border p-4 ${b}`,children:[(0,d.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold text-gray-700",children:"Git 分支信息"}),(0,d.jsx)("div",{className:"animate-spin w-4 h-4 border-2 border-blue-500 border-t-transparent rounded-full"})]}),(0,d.jsx)("div",{className:"text-sm text-gray-500",children:"正在加载分支信息..."})]}):k?c?(0,d.jsxs)("div",{className:`flex items-center gap-2 px-3 py-1 bg-red-50 rounded-md ${b}`,children:[(0,d.jsx)("span",{className:"text-xs text-red-500",children:"分支信息错误"}),(0,d.jsx)(f.Button,{variant:"ghost",size:"sm",onClick:o,disabled:i,className:"h-5 w-5 p-0 text-red-500 hover:bg-red-100",children:"↻"})]}):(0,d.jsxs)("div",{className:`bg-white rounded-lg shadow-sm border p-4 ${b}`,children:[(0,d.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold text-gray-700",children:"Git 分支信息"}),(0,d.jsx)(f.Button,{variant:"outline",size:"sm",onClick:o,disabled:i,className:"h-6 px-2 text-xs",children:i?"刷新中...":"重试"})]}),(0,d.jsx)("div",{className:"text-sm text-red-500 bg-red-50 p-2 rounded",children:k})]}):g?c?(0,d.jsxs)("div",{className:`flex items-center gap-2 px-3 py-1 bg-blue-50 border border-blue-200 rounded-md ${b}`,children:[(0,d.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"text-blue-600",children:[(0,d.jsx)("polyline",{points:"6,3 6,15"}),(0,d.jsx)("circle",{cx:"18",cy:"6",r:"3"}),(0,d.jsx)("circle",{cx:"6",cy:"18",r:"3"}),(0,d.jsx)("path",{d:"m18,9a9,9 0 0,1-9,9"})]}),(0,d.jsx)("span",{className:"text-sm font-medium text-blue-800",children:g.currentBranch}),q(),(0,d.jsx)(f.Button,{variant:"ghost",size:"sm",onClick:o,disabled:i,className:"h-5 w-5 p-0 text-blue-600 hover:bg-blue-100",title:"刷新分支信息",children:i?(0,d.jsx)("div",{className:"animate-spin w-3 h-3 border-2 border-blue-600 border-t-transparent rounded-full"}):"↻"})]}):(0,d.jsxs)("div",{className:`bg-white rounded-lg shadow-sm border p-4 ${b}`,children:[(0,d.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold text-gray-700",children:"Git 分支信息"}),(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[m&&(0,d.jsx)("span",{className:"text-xs text-gray-400",children:m}),(0,d.jsx)(f.Button,{variant:"outline",size:"sm",onClick:o,disabled:i,className:"h-6 px-2 text-xs",children:i?"刷新中...":"刷新"})]})]}),(0,d.jsxs)("div",{className:"space-y-3",children:[(0,d.jsx)("div",{className:"flex items-center gap-2",children:(0,d.jsxs)("div",{className:"flex items-center gap-1",children:[(0,d.jsx)("span",{className:"text-xs text-gray-500",children:"分支:"}),(0,d.jsx)("span",{className:"text-sm font-medium text-blue-600 bg-blue-50 px-2 py-1 rounded",children:g.currentBranch}),q()]})}),(0,d.jsxs)("div",{className:"bg-gray-50 p-3 rounded text-xs space-y-1",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)("span",{className:"text-gray-500",children:"提交:"}),(0,d.jsx)("code",{className:"bg-gray-200 px-1 rounded font-mono text-xs",children:g.lastCommit.hash})]}),(0,d.jsx)("div",{className:"text-gray-700 font-medium line-clamp-2",children:g.lastCommit.message}),(0,d.jsxs)("div",{className:"flex items-center justify-between text-gray-500",children:[(0,d.jsx)("span",{children:g.lastCommit.author}),(0,d.jsx)("span",{children:g.lastCommit.date})]})]}),(0,d.jsxs)("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[(0,d.jsxs)("div",{className:"flex items-center justify-between",children:[(0,d.jsx)("span",{className:"text-gray-500",children:"领先:"}),(0,d.jsx)("span",{className:p(g.status.ahead),children:g.status.ahead})]}),(0,d.jsxs)("div",{className:"flex items-center justify-between",children:[(0,d.jsx)("span",{className:"text-gray-500",children:"落后:"}),(0,d.jsx)("span",{className:p(g.status.behind),children:g.status.behind})]}),(0,d.jsxs)("div",{className:"flex items-center justify-between",children:[(0,d.jsx)("span",{className:"text-gray-500",children:"已修改:"}),(0,d.jsx)("span",{className:p(g.status.modified),children:g.status.modified})]}),(0,d.jsxs)("div",{className:"flex items-center justify-between",children:[(0,d.jsx)("span",{className:"text-gray-500",children:"已暂存:"}),(0,d.jsx)("span",{className:p(g.status.staged),children:g.status.staged})]}),(0,d.jsxs)("div",{className:"flex items-center justify-between col-span-2",children:[(0,d.jsx)("span",{className:"text-gray-500",children:"未跟踪:"}),(0,d.jsx)("span",{className:p(g.status.untracked),children:g.status.untracked})]})]}),(g.status.ahead>0||g.status.behind>0)&&(0,d.jsxs)("div",{className:"text-xs p-2 rounded bg-yellow-50 border border-yellow-200",children:[g.status.ahead>0&&g.status.behind>0&&(0,d.jsxs)("span",{className:"text-yellow-700",children:["分支与远程不同步,有 ",g.status.ahead," 个本地提交,",g.status.behind," 个远程提交"]}),g.status.ahead>0&&0===g.status.behind&&(0,d.jsxs)("span",{className:"text-green-700",children:["本地领先远程 ",g.status.ahead," 个提交"]}),0===g.status.ahead&&g.status.behind>0&&(0,d.jsxs)("span",{className:"text-red-700",children:["本地落后远程 ",g.status.behind," 个提交"]})]})]})]}):c?(0,d.jsx)("div",{className:`flex items-center gap-2 px-3 py-1 bg-gray-50 rounded-md ${b}`,children:(0,d.jsx)("span",{className:"text-xs text-gray-500",children:"暂无分支信息"})}):(0,d.jsxs)("div",{className:`bg-white rounded-lg shadow-sm border p-4 ${b}`,children:[(0,d.jsx)("div",{className:"flex items-center justify-between mb-3",children:(0,d.jsx)("h3",{className:"text-sm font-semibold text-gray-700",children:"Git 分支信息"})}),(0,d.jsx)("div",{className:"text-sm text-gray-500",children:"暂无分支信息"})]})}},73426:a=>{"use strict";var{g:b,__dirname:c}=a;a.s({default:()=>v});var d=a.i(99559),e=a.i(57560),f=a.i(40490),g=a.i(50923),h=a.i(74939),i=a.i(49566),j=a.i(94688),k=a.i(58413),l=a.i(67252),m=a.i(60284),n=a.i(22529),o=a.i(34983);a.i(28783);var p=a.i(22027),q=a.i(82587),r=a.i(55441),s=a.i(64708),t=function(a){return a.PENDING="pending",a.EXISTING="existing",a.CLONING="cloning",a.SUCCESS="success",a.FAILED="failed",a.RETRYING="retrying",a}(t||{});function u(){let a=(0,f.useSearchParams)(),b=(0,f.useRouter)(),c=a.get("project"),[t,u]=(0,e.useState)(null),[v,w]=(0,e.useState)(!0),[x,y]=(0,e.useState)(null),[z,A]=(0,e.useState)({}),[B,C]=(0,e.useState)({mockingIntercept:!1,mockOpen:!1}),[D,E]=(0,e.useState)(!1),[F,G]=(0,e.useState)(null),[H,I]=(0,e.useState)(!1),[J,K]=(0,e.useState)(1),[L]=(0,e.useState)(10),[M,N]=(0,e.useState)(""),[O,P]=(0,e.useState)(null),[Q,R]=(0,e.useState)(!1),[S,T]=(0,e.useState)(!1),[U,V]=(0,e.useState)(!1),[W,X]=(0,e.useState)(!0),[Y,Z]=(0,e.useState)(null),[$,_]=(0,e.useState)([]),[aa,ab]=(0,e.useState)(!1),[ac,ad]=(0,e.useState)(!1),[ae,af]=(0,e.useState)(!1),[ag,ah]=(0,e.useState)({apiPath:"",method:"GET",siteName:"默认场景",mockOpen:!0}),[ai,aj]=(0,e.useState)(null),[ak,al]=(0,e.useState)(!1),[am,an]=(0,e.useState)({open:!1,apiName:"",method:"",siteName:""}),[ao,ap]=(0,e.useState)({open:!1,apiName:"",apiPath:""}),[aq,ar]=(0,e.useState)({open:!1,type:"success",message:""}),[as,at]=(0,e.useState)(!1),[au,av]=(0,e.useState)([]),[aw,ax]=(0,e.useState)(!1),[ay,az]=(0,e.useState)(""),[aA,aB]=(0,e.useState)({}),[aC,aD]=(0,e.useState)(!1),[aE,aF]=(0,e.useState)(""),[aG,aH]=(0,e.useState)([]),aI=(0,e.useCallback)(async()=>{Y&&await aK(Y)},[Y]),aJ=(0,e.useCallback)(async a=>{Q&&(a.metaKey||a.ctrlKey)&&"s"===a.key&&(a.preventDefault(),await aI())},[Q,aI]);(0,e.useEffect)(()=>{if(Q)return document.addEventListener("keydown",aJ),()=>{document.removeEventListener("keydown",aJ)}},[Q,Y,aJ]);let aK=async a=>{try{await new Promise(a=>setTimeout(a,200));let b=a.getModel();if(b){await a.getAction("editor.action.formatDocument")?.run();let c=b.getValue();if(c&&!c.includes("\n")&&c.length>50){let d=c.replace(/\{\s*/g,"{\n ").replace(/\}\s*/g,"\n}").replace(/;\s*/g,";\n ").replace(/,\s*/g,",\n ").replace(/\n\s*\n/g,"\n").trim();d!==c&&(b.setValue(d),setTimeout(()=>{a.getAction("editor.action.formatDocument")?.run()},100))}}}catch(a){console.log("自动格式化失败:",a)}},aL=()=>{b.push("/initialization")},aM=async()=>{ab(!0);try{let a=await fetch("/api/check-workspace"),b=await a.json();if(b.success&&b.projects){let a=b.projects.map(a=>({name:a.name,status:a.status,message:a.message}));_(a)}else console.error("获取项目列表失败:",b.error),_([])}catch(a){console.error("获取项目列表失败:",a),_([])}finally{ab(!1)}},aN=async()=>{if(c){E(!0);try{let a=await fetch("/api/open-project",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:c})}),b=await a.json();if(b.success&&b.cursorUrl){let a=document.createElement("a");a.href=b.cursorUrl,a.style.display="none",document.body.appendChild(a),a.click(),document.body.removeChild(a)}else console.error("打开项目失败:",b.error),bh("error",`打开项目失败: ${b.error}`)}catch(a){console.error("打开项目失败:",a),bh("error","打开项目失败: 网络错误")}finally{E(!1)}}},aO=async()=>{if(0===au.length)return void bh("error","请至少选择一个项目");ax(!0);try{let a=await fetch("/api/workspace/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projects:au})}),b=await a.json();b.success?(bh("success",b.message||"工作区已在 Cursor 中打开"),at(!1),av([])):bh("error",`创建工作区失败: ${b.error}`)}catch(a){console.error("创建工作区失败:",a),bh("error","创建工作区失败: 网络错误")}finally{ax(!1)}},aP=a=>{av(b=>b.includes(a)?b.filter(b=>b!==a):[...b,a])};(0,e.useEffect)(()=>{if(!c){y("项目名称缺失"),w(!1);return}(async()=>{try{let a=await fetch(`/api/project-config?project=${encodeURIComponent(c)}`),b=await a.json();if(b.success){u(b.data);let a={};Object.keys(b.data.envs).forEach(c=>{let d=b.data.envs[c],e="";e=d.proxyEnv[d.currentProxy]?d.proxyEnv[d.currentProxy]:d.currentProxy;let f="";f=d.proxyEnv[d.currentProxy]?d.currentProxy:"custom",a[c]={selectedProxy:e||"",selectedOption:f}}),A(a),C({mockingIntercept:b.data.mockingIntercept||!1,mockOpen:b.data.mockOpen||!1})}else y(b.error)}catch(a){y("获取项目配置失败"),console.error("获取项目配置失败:",a)}finally{w(!1)}})()},[c]);let aQ=(0,e.useCallback)(async()=>{if(c){I(!0);try{let a=await fetch(`/api/mock-file?project=${encodeURIComponent(c)}`),b=await a.json();b.success?G(b.data):console.error("获取Mock数据失败:",b.error)}catch(a){console.error("获取Mock数据失败:",a)}finally{I(!1)}}},[c]);(0,e.useEffect)(()=>{if(t&&c){let a=Object.keys(t.envs),b=new URLSearchParams(window.location.search).get("tab"),c="";(c=M&&("mock"===M||a.includes(M))?M:b&&("mock"===b||a.includes(b))?b:a.length>0?a[0]:"mock")!==M&&(N(c),"mock"===c&&aQ())}},[t,c,M,aQ]),(0,e.useEffect)(()=>{aM()},[]);let aR=(0,e.useCallback)(async()=>{if(!c||!t)return;let a={};for(let b of Object.keys(t.envs))a[`${b}`]={loading:!0,running:!1};aB(a);let b=Object.keys(t.envs).map(async a=>{try{let b=await fetch(`/api/process/status?projectName=${encodeURIComponent(c)}&envName=${encodeURIComponent(a)}`),d=await b.json();if(d.success&&d.data)return{envName:a,status:d.data}}catch(b){console.error(`获取环境 ${a} 状态失败:`,b)}return{envName:a,status:{running:!1}}}),d=await Promise.all(b),e={};d.forEach(({envName:a,status:b})=>{e[a]={running:b.running||!1,pid:b.pid,startTime:b.startTime,port:b.port,loading:!1}}),aB(e)},[c,t]),aS=async a=>{if(!c||!t)return;let b=t.envs[a];if(!b.startCommand)return void bh("error","该环境未配置启动命令");aB(b=>({...b,[a]:{...b[a],loading:!0}}));try{let d=await fetch("/api/process/start",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:c,envName:a,startCommand:b.startCommand})}),e=await d.json();if(e.success)aB(b=>({...b,[a]:{running:!0,pid:e.data.pid,startTime:e.data.startTime,port:e.data.port,loading:!1}}));else throw Error(e.error||"启动失败")}catch(b){console.error("启动进程失败:",b),bh("error",`启动失败: ${b instanceof Error?b.message:"未知错误"}`),aB(b=>({...b,[a]:{...b[a],loading:!1}}))}},aT=async a=>{if(c){aB(b=>({...b,[a]:{...b[a],loading:!0}}));try{let b=await fetch(`/api/process/start?projectName=${encodeURIComponent(c)}&envName=${encodeURIComponent(a)}`,{method:"DELETE"}),d=await b.json();if(d.success)aB(b=>({...b,[a]:{running:!1,loading:!1}}));else throw Error(d.error||"停止失败")}catch(b){console.error("停止进程失败:",b),bh("error",`停止失败: ${b instanceof Error?b.message:"未知错误"}`),aB(b=>({...b,[a]:{...b[a],loading:!1}}))}}},[aU,aV]=(0,e.useState)(null),aW=a=>{if(!c)return;aU&&aU.close(),aH([]);let b=new EventSource(`/api/process/logs/stream?projectName=${encodeURIComponent(c)}&envName=${encodeURIComponent(a)}`);b.onmessage=a=>{try{let b=JSON.parse(a.data);"log"===b.type?aH(a=>{let c=[...a,b.content];return c.length>1e3?c.slice(-1e3):c}):"init"===b.type?aH([b.message]):"end"===b.type&&aH(a=>[...a,`[系统] ${b.message}`])}catch(a){console.error("解析日志数据失败:",a)}},b.onerror=a=>{console.error("日志流错误:",a),b.close(),aV(null)},aV(b)},aX=()=>{aU&&(aU.close(),aV(null))},aY=a=>{aF(a),aD(!0),aW(a)},aZ=()=>{aD(!1),aH([]),aF(""),aX()};(0,e.useEffect)(()=>{if(t&&c){aR();let a=setInterval(()=>{aR()},5e3);return()=>clearInterval(a)}},[t,c,aR]);let a$=(a,b)=>{if(!t)return;let c=t.envs[a],d="";d="custom"===b?z[a]?.selectedOption==="custom"?z[a]?.selectedProxy||"":c.proxyEnv.custom||"":c.proxyEnv[b]||"",A(c=>({...c,[a]:{...c[a],selectedProxy:d,selectedOption:b,saveMessage:""}}))},a_=(a,b)=>{A(c=>({...c,[a]:{...c[a],selectedProxy:b,saveMessage:""}}))},a0=async a=>{C(b=>({...b,mockingIntercept:a,saving:!0,saveMessage:""}));try{let b=await fetch("/api/project-config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:c,projectConfig:{mockingIntercept:a,mockOpen:B.mockOpen}})}),d=await b.json();if(d.success)u(b=>b?{...b,mockingIntercept:a}:b),C(a=>({...a,saving:!1,saveMessage:"Mock拦截配置已保存"})),setTimeout(()=>{C(a=>({...a,saveMessage:""}))},2e3);else throw Error(d.error||"保存失败")}catch(b){console.error("保存Mock拦截配置失败:",b),C(c=>({...c,mockingIntercept:!a,saving:!1,saveMessage:`保存失败: ${b instanceof Error?b.message:"未知错误"}`})),setTimeout(()=>{C(a=>({...a,saveMessage:""}))},3e3)}},a1=async a=>{C(b=>({...b,mockOpen:a,saving:!0,saveMessage:""}));try{let b=await fetch("/api/project-config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:c,projectConfig:{mockingIntercept:B.mockingIntercept,mockOpen:a}})}),d=await b.json();if(d.success)u(b=>b?{...b,mockOpen:a}:b),C(a=>({...a,saving:!1,saveMessage:"Mock开启配置已保存"})),setTimeout(()=>{C(a=>({...a,saveMessage:""}))},2e3);else throw Error(d.error||"保存失败")}catch(b){console.error("保存Mock开启配置失败:",b),C(c=>({...c,mockOpen:!a,saving:!1,saveMessage:`保存失败: ${b instanceof Error?b.message:"未知错误"}`})),setTimeout(()=>{C(a=>({...a,saveMessage:""}))},3e3)}},a2=async a=>{if(!t||!c)return;let b=z[a]?.selectedProxy?.trim();if(!b)return void A(b=>({...b,[a]:{...b[a],saveMessage:"请先选择或填写代理地址"}}));let d=z[a]?.selectedOption,e="custom"===d;A(b=>({...b,[a]:{...b[a],saving:!0,saveMessage:""}}));try{let f={projectName:c,envName:a,newProxy:e?"custom":d||""};e&&(f.customProxyUrl=b);let g=await fetch("/api/project-config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(f)}),h=await g.json();h.success?(u(c=>{if(!c)return c;let d={...c.envs};return d[a]={...d[a],currentProxy:h.data.currentProxy},"custom"===h.data.currentProxy&&(d[a].proxyEnv={...d[a].proxyEnv,custom:b}),{...c,envs:d}}),A(b=>({...b,[a]:{...b[a],saving:!1,saveMessage:"保存成功"}}))):A(b=>({...b,[a]:{...b[a],saving:!1,saveMessage:`保存失败: ${h.error}`}}))}catch(b){console.error("保存配置失败:",b),A(b=>({...b,[a]:{...b[a],saving:!1,saveMessage:"保存失败: 网络错误"}}))}},a3=async()=>{if(window.confirm("确定要一键关闭所有Mock吗?"))try{let a=await fetch("/api/cleanup-mock",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:c})});(await a.json()).success&&await aQ()}catch(a){console.error("清空Mock配置失败:",a)}},a4=async()=>{if(window.confirm("确定要一键开启所有Mock吗?"))try{let a=await fetch("/api/open-all-mock",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:c})});(await a.json()).success&&await aQ()}catch(a){console.error("清空Mock配置失败:",a)}},a5=async(a,b,d)=>{if(c)try{let e=await fetch("/api/mock-setting",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:c,apiName:a,method:b,currentSite:d})}),f=await e.json();f.success?G(c=>c?{...c,mockFiles:c.mockFiles.map(c=>c.apiName===a?{...c,methods:c.methods.map(a=>a.method===b?{...a,setting:{...a.setting,currentSite:d}}:a)}:c)}:c):(console.error("更新场景失败:",f.error),bh("error",`更新场景失败: ${f.error}`))}catch(a){console.error("更新场景失败:",a),bh("error","更新场景失败: 网络错误")}},a6=async(a,b,d)=>{if(c){T(!0),X(!0);try{let e=await fetch(`/api/mock-file-content?project=${encodeURIComponent(c)}&apiName=${encodeURIComponent(a)}&method=${encodeURIComponent(b)}&siteName=${encodeURIComponent(d)}`),f=await e.json();f.success?(P({projectName:c,apiName:a,method:b,siteName:d,content:f.data.content}),R(!0)):(console.error("获取文件内容失败:",f.error),bh("error",`获取文件内容失败: ${f.error}`))}catch(a){console.error("获取文件内容失败:",a),bh("error","获取文件内容失败: 网络错误")}finally{T(!1)}}},a7=async()=>{if(O){V(!0);try{let a=await fetch("/api/mock-file-content",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(O)}),b=await a.json();b.success?(R(!1),P(null)):(console.error("保存文件失败:",b.error),bh("error",`保存文件失败: ${b.error}`))}catch(a){console.error("保存文件失败:",a),bh("error","保存文件失败: 网络错误")}finally{V(!1)}}},a8=()=>{R(!1),P(null),X(!0)},a9=(a,b)=>{"siteName"===a&&ac||ah(c=>({...c,[a]:b}))},ba=(a,b)=>{let c=a.toUpperCase(),d=b.replace(/\//g,"_").replace(/^_/,"");switch(c){case"GET":return`const Mock = require('mockjs');
|
|
6
6
|
|
|
7
7
|
module.exports = Mock.mock({
|
|
8
8
|
"code": 200,
|