From 93eb80294fa284fd789da393bb2fa00c5ecd372b Mon Sep 17 00:00:00 2001 From: yyyhcyang Date: Wed, 18 Mar 2026 15:13:26 +0800 Subject: [PATCH] feat: Add GraalVM JavaScript engine to backend and update frontend dependencies. --- .gitignore | 41 +- README.md | 162 +- pom.xml => backend/pom.xml | 0 .../gateway/GatewayApplication.java | 0 .../gateway/config/MybatisPlusConfig.java | 0 .../gateway/config/RedisConfig.java | 0 .../ControlPlaneAdminController.java | 142 ++ .../controller/GatewayEntryController.java | 0 .../gateway/engine/GraalVmJsEngine.java | 0 .../gateway/engine/LocalCacheManager.java | 0 .../gateway/engine/OkHttpProxyClient.java | 0 .../filter/core/ExecutionStrategy.java | 0 .../gateway/filter/core/GatewayContext.java | 0 .../gateway/filter/core/GatewayFilter.java | 0 .../filter/core/GatewayFilterChain.java | 0 .../filter/core/GatewayFilterExecutor.java | 0 .../gateway/filter/impl/AsyncAuditFilter.java | 0 .../filter/impl/AuthRateLimitingFilter.java | 0 .../filter/impl/ConfigWatcherFilter.java | 0 .../filter/impl/GraalVmWashingFilter.java | 0 .../filter/impl/HitlSuspenderFilter.java | 0 .../impl/HttpExecutionStrategyImpl.java | 0 .../filter/impl/IdentityOboFilter.java | 0 .../filter/impl/ProxyExecutionFilter.java | 0 .../gateway/mapper/AiAuditLogMapper.java | 0 .../gateway/mapper/AiTenantMapper.java | 0 .../gateway/mapper/AiTenantToolRelMapper.java | 0 .../gateway/mapper/AiToolRegistryMapper.java | 0 .../gateway/mapper/AiWashScriptMapper.java | 0 .../enterprise/gateway/model/AiAuditLog.java | 0 .../enterprise/gateway/model/AiTenant.java | 0 .../gateway/model/AiTenantToolRel.java | 0 .../gateway/model/AiToolRegistry.java | 0 .../gateway/model/AiWashScript.java | 0 .../gateway/service/AiAuditLogService.java | 0 .../gateway/service/AiTenantService.java | 0 .../service/AiTenantToolRelService.java | 0 .../service/AiToolRegistryService.java | 0 .../gateway/service/AiWashScriptService.java | 0 .../service/impl/AiAuditLogServiceImpl.java | 0 .../service/impl/AiTenantServiceImpl.java | 0 .../impl/AiTenantToolRelServiceImpl.java | 0 .../impl/AiToolRegistryServiceImpl.java | 0 .../service/impl/AiWashScriptServiceImpl.java | 0 .../src}/main/resources/application.yml | 6 +- .../src}/main/resources/schema.sql | 0 disign.md | 14 +- frontend/.gitignore | 24 + frontend/.vscode/extensions.json | 3 + frontend/README.md | 5 + frontend/index.html | 13 + frontend/package-lock.json | 1694 +++++++++++++++++ frontend/package.json | 22 + frontend/public/vite.svg | 1 + frontend/src/App.vue | 52 + frontend/src/api/index.js | 37 + frontend/src/assets/vue.svg | 1 + frontend/src/components/HelloWorld.vue | 43 + frontend/src/main.js | 17 + frontend/src/router/index.js | 39 + frontend/src/style.css | 117 ++ frontend/src/views/AuditLog.vue | 111 ++ frontend/src/views/TenantManage.vue | 116 ++ frontend/src/views/ToolRegistry.vue | 137 ++ frontend/src/views/WashScript.vue | 108 ++ frontend/vite.config.js | 15 + .../ControlPlaneAdminController.java | 58 - 67 files changed, 2902 insertions(+), 76 deletions(-) rename pom.xml => backend/pom.xml (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/GatewayApplication.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/config/MybatisPlusConfig.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/config/RedisConfig.java (100%) create mode 100644 backend/src/main/java/com/cicc/enterprise/gateway/controller/ControlPlaneAdminController.java rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/controller/GatewayEntryController.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/engine/GraalVmJsEngine.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/engine/LocalCacheManager.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/engine/OkHttpProxyClient.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/filter/core/ExecutionStrategy.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/filter/core/GatewayContext.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilter.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilterChain.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilterExecutor.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/filter/impl/AsyncAuditFilter.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/filter/impl/AuthRateLimitingFilter.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/filter/impl/ConfigWatcherFilter.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/filter/impl/GraalVmWashingFilter.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/filter/impl/HitlSuspenderFilter.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/filter/impl/HttpExecutionStrategyImpl.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/filter/impl/IdentityOboFilter.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/filter/impl/ProxyExecutionFilter.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/mapper/AiAuditLogMapper.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/mapper/AiTenantMapper.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/mapper/AiTenantToolRelMapper.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/mapper/AiToolRegistryMapper.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/mapper/AiWashScriptMapper.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/model/AiAuditLog.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/model/AiTenant.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/model/AiTenantToolRel.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/model/AiToolRegistry.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/model/AiWashScript.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/service/AiAuditLogService.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/service/AiTenantService.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/service/AiTenantToolRelService.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/service/AiToolRegistryService.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/service/AiWashScriptService.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/service/impl/AiAuditLogServiceImpl.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/service/impl/AiTenantServiceImpl.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/service/impl/AiTenantToolRelServiceImpl.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/service/impl/AiToolRegistryServiceImpl.java (100%) rename {src => backend/src}/main/java/com/cicc/enterprise/gateway/service/impl/AiWashScriptServiceImpl.java (100%) rename {src => backend/src}/main/resources/application.yml (84%) rename {src => backend/src}/main/resources/schema.sql (100%) create mode 100644 frontend/.gitignore create mode 100644 frontend/.vscode/extensions.json create mode 100644 frontend/README.md create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/public/vite.svg create mode 100644 frontend/src/App.vue create mode 100644 frontend/src/api/index.js create mode 100644 frontend/src/assets/vue.svg create mode 100644 frontend/src/components/HelloWorld.vue create mode 100644 frontend/src/main.js create mode 100644 frontend/src/router/index.js create mode 100644 frontend/src/style.css create mode 100644 frontend/src/views/AuditLog.vue create mode 100644 frontend/src/views/TenantManage.vue create mode 100644 frontend/src/views/ToolRegistry.vue create mode 100644 frontend/src/views/WashScript.vue create mode 100644 frontend/vite.config.js delete mode 100644 src/main/java/com/cicc/enterprise/gateway/controller/ControlPlaneAdminController.java diff --git a/.gitignore b/.gitignore index b83d222..1e75623 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,40 @@ -/target/ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +# Build folders +target/ +backend/target/ + +# Frontend +frontend/node_modules/ +frontend/dist/ + +# IDE +.idea/ +*.iml + +# Local Dev Configs (Do not commit passwords!) +application-dev.yml +*-dev.yml diff --git a/README.md b/README.md index 922f476..fed404a 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,160 @@ -# enterprise-ai-agent-gateway -企业级 AI 智能体网关 +# Enterprise AI Agent Gateway (企业级 AI 智能体网关) + +🌍 *[English Version Below](#english-version)* + +**Enterprise AI Agent Gateway** 是一个定位于大模型(LLM/AI Agent)与企业老旧业务系统(Legacy Systems)之间的安全中间件与协议转换枢纽。 + +在企业内部署 AI Agent 时,直接让 LLM 调用复杂的企业内网 API 存在极大的**数据泄露风险**、**越权风险**以及由于老旧系统返回冗余数据而导致的 **LLM Token 灾难消耗**问题。本项目通过提供轻量级的前端控制面与高性能的后端数据面,完美解决了这些痛点。 + +--- + +## 🌟 核心特性 (Key Features) + +* 🛡️ **纯粹的数据洗涤沙箱 (GraalVM Data Washing)**:内置安全隔离的 GraalVM Polyglot 引擎,允许管理员为主机 API 配置动态 JavaScript 洗涤脚本,在网关层将数百 KB 的冗余老旧 JSON 裁剪为只剩核心业务字段的极致精简 Payload,大幅节省 LLM Token。 +* ⛓️ **高扩展责任链架构 (Filter Chain)**:采用标准的 GatewayContext 穿透全链路,内置鉴权防刷 (Redis)、权限穿透 (Identity OBO)、危险动作人工挂起 (HITL Suspender) 以及全异步数据审计 (Async Audit)。 +* 🔌 **多协议执行策略 (Protocol Strategy)**:不仅支持基础的 HTTP 代理透传,底层执行器已完全抽象为 `ExecutionStrategy` 策略模式,未来从 HTTP 无缝切换/并存至 Dubbo、Spring Cloud Feign 毫无架构包袱。 +* ⚡ **极速内存直读 (Caffeine Local Cache)**:数据面网关对 API 配置信息的读取不会疯狂查询 DB,而是通过 Caffeine 提供带 TTL 的本地高速缓存。 +* 🎨 **开箱即用的控制台 (Control Plane)**:内置 Vue3 + Vite + Element Plus 编写的现代化管理后台,可以实现租户鉴权发放、工具注册配置、清洗脚本在线测试及全生命周期审计日志的可视化检索。 + +--- + +## 🛠️ 技术栈 (Tech Stack) + +* **后端 (Data Plane & Control Plane API)** + * Java 17 / 21 + * Spring Boot 3.2.x + * GraalVM Polyglot (JavaScript Sandbox) + * MyBatis-Plus (MySQL 8.0) + * Caffeine & Redis + * OkHttp3 (HTTP Execution Proxy) +* **前端 (Control Plane UI)** + * Vue 3 (Composition API) + * Vite 5 + * Element Plus + * Axios & Vue Router + +--- + +## 📁 项目结构 (Monorepo Structure) + +```text +enterprise-ai-agent-gateway/ +├── backend/ # Java Spring Boot 后端工程 +│ ├── pom.xml +│ └── src/main/ +│ ├── java/.../gateway/ +│ │ ├── controller/ # 管理台 CRUD API & 代理网关入口 API +│ │ ├── engine/ # GraalVM / Cache 引擎组件 +│ │ ├── filter/ # 核心责任链路拦截器 +│ │ ├── model/ # 数据库实体 +│ │ └── service/ # 业务逻辑与执行策略抽象 +│ └── resources/ +│ ├── application.yml # 配置文件 +│ └── schema.sql # 数据库初始化建表脚本 +│ +└── frontend/ # Vue 3 管理台前端工程 + ├── package.json + ├── vite.config.js + └── src/ + ├── api/ # 后端接口 Axios 封装 + ├── views/ # 管理台视图 (Tenant, Tool, Script, Audit) + └── App.vue # 侧边栏整体布局 +``` + +--- + +## 🚀 快速开始 (Quick Start) + +### 1. 数据库准备 +* 运行 MySQL 8.x 服务。 +* 创建数据库 `db_agent_gateway`。 +* 执行 `backend/src/main/resources/schema.sql` 完成表结构与测试数据的初始化。 + +### 2. 启动后端 (Backend) +* 修改 `backend/src/main/resources/application.yml` 中的数据库账号密码及 Redis 配置(支持无 Redis 本地优雅降级)。 +* 通过 IDE 或 Maven 启动应用: +```bash +cd backend +mvn spring-boot:run +``` +* 后端服务默认运行于 `http://localhost:8080`。 + +### 3. 启动管理后台 (Frontend) +需要 Node.js 环境 (推荐 v18+)。 +```bash +cd frontend +npm install +npm run dev +``` +* 浏览器访问 `http://localhost:5173` 进入 AI Gateway 管理控制台。 + +### 4. 链路测试 (API Invocation Test) +通过终端向网关数据面发起 API 请求验证洗涤链路(确保请求头携带控制台分配的对应 `X-App-Key`): +```bash +curl -X GET 'http://localhost:8080/api/v1/gw/invoke/get_time' \ + -H "X-App-Key: test_key" --noproxy '*' +``` +随后你可以在控制台的「审计日志」页面看到刚刚这笔调用的清洗前后比对! + +--- +--- + + + +# Enterprise AI Agent Gateway + +**Enterprise AI Agent Gateway** is a secure middleware and protocol conversion hub positioned between Large Language Models (LLM / AI Agents) and legacy enterprise systems. + +When deploying AI Agents within an enterprise, allowing LLMs to directly invoke complex intranet APIs poses significant **data leakage risks**, **unauthorized access risks**, and **catastrophic LLM Token consumption** caused by redundant data returned by outdated systems. This project perfectly solves these pain points by providing a lightweight frontend Control Plane and a high-performance backend Data Plane. + +--- + +## 🌟 Key Features + +* 🛡️ **GraalVM Data Washing Sandbox**: Built-in securely isolated GraalVM Polyglot engine, allowing administrators to configure dynamic JavaScript washing scripts for host APIs. At the gateway layer, hundreds of KBs of redundant legacy JSON can be trimmed down to a minimal payload containing only core business fields, drastically saving LLM Tokens. +* ⛓️ **Highly Extensible Context Filter Chain**: Utilizes a standard `GatewayContext` penetrating the entire traffic chain, with built-in configurations for auth & rate limiting (Redis), Identity OBO (On-Behalf-Of), Human-In-The-Loop Suspender (for WRITE risky actions), and fully asynchronous data auditing. +* 🔌 **Multi-Protocol Execution Strategy**: Not only supports basic HTTP proxy passthrough; the underlying executor is fully abstracted into an `ExecutionStrategy` pattern. Seamless switching or coexisting with Dubbo or Spring Cloud Feign in the future requires zero architectural burden. +* ⚡ **Lightning-Fast Memory Read**: Configuration fetching on the high-concurrency Data Plane does not bombard the DB. Instead, it relies on Caffeine to provide TTL-based local high-speed caching. +* 🎨 **Out-of-the-Box Control Panel**: A modern admin backend written in Vue3 + Vite + Element Plus is included, offering visual management for tenant auth, tool registry, online wash script testing, and full-lifecycle audit log retrieval. + +--- + +## 🛠️ Tech Stack + +* **Backend (Data Plane & Control Plane API)**: Java 21, Spring Boot 3.2.x, GraalVM Polyglot (JS Sandbox), MyBatis-Plus (MySQL 8), Caffeine cache, OkHttp3. +* **Frontend (Control Plane UI)**: Vue 3 (Composition API), Vite 5, Element Plus, Axios, Vue Router. + +--- + +## 🚀 Quick Start + +### 1. Database Setup +* Run MySQL 8.x. +* Create a database named `db_agent_gateway`. +* Execute `backend/src/main/resources/schema.sql` to initialize tables and test data. + +### 2. Start Backend +* Update DB and Redis credentials in `backend/src/main/resources/application.yml` (supports graceful degradation if local Redis is down). +* Run the application: +```bash +cd backend +mvn spring-boot:run +``` +* The backend runs on `http://localhost:8080` by default. + +### 3. Start Frontend Console +Requires Node.js (v18+ recommended). +```bash +cd frontend +npm install +npm run dev +``` +* Access `http://localhost:5173` in your browser to view the admin console. + +### 4. End-to-End Test +Send a request to the Data Plane to verify the washing chain (ensure to include the valid `X-App-Key` allocated in the console): +```bash +curl -X GET 'http://localhost:8080/api/v1/gw/invoke/get_time' \ + -H "X-App-Key: test_key" --noproxy '*' +``` +You can instantly view the before-and-after payload contrast of this transaction in the "Audit Log" page of the Admin Console! diff --git a/pom.xml b/backend/pom.xml similarity index 100% rename from pom.xml rename to backend/pom.xml diff --git a/src/main/java/com/cicc/enterprise/gateway/GatewayApplication.java b/backend/src/main/java/com/cicc/enterprise/gateway/GatewayApplication.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/GatewayApplication.java rename to backend/src/main/java/com/cicc/enterprise/gateway/GatewayApplication.java diff --git a/src/main/java/com/cicc/enterprise/gateway/config/MybatisPlusConfig.java b/backend/src/main/java/com/cicc/enterprise/gateway/config/MybatisPlusConfig.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/config/MybatisPlusConfig.java rename to backend/src/main/java/com/cicc/enterprise/gateway/config/MybatisPlusConfig.java diff --git a/src/main/java/com/cicc/enterprise/gateway/config/RedisConfig.java b/backend/src/main/java/com/cicc/enterprise/gateway/config/RedisConfig.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/config/RedisConfig.java rename to backend/src/main/java/com/cicc/enterprise/gateway/config/RedisConfig.java diff --git a/backend/src/main/java/com/cicc/enterprise/gateway/controller/ControlPlaneAdminController.java b/backend/src/main/java/com/cicc/enterprise/gateway/controller/ControlPlaneAdminController.java new file mode 100644 index 0000000..07d8283 --- /dev/null +++ b/backend/src/main/java/com/cicc/enterprise/gateway/controller/ControlPlaneAdminController.java @@ -0,0 +1,142 @@ +package com.cicc.enterprise.gateway.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.cicc.enterprise.gateway.model.*; +import com.cicc.enterprise.gateway.service.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/v1/admin") +@RequiredArgsConstructor +@CrossOrigin(origins = "*") +public class ControlPlaneAdminController { + + private final AiTenantService tenantService; + private final AiToolRegistryService toolRegistryService; + private final AiWashScriptService washScriptService; + private final AiAuditLogService auditLogService; + + // ================== Tenant CRUD ================== + + @GetMapping("/tenant") + public List listTenants() { + return tenantService.list(); + } + + @PostMapping("/tenant") + public AiTenant createTenant(@RequestBody AiTenant tenant) { + tenantService.save(tenant); + return tenant; + } + + @PutMapping("/tenant/{id}") + public AiTenant updateTenant(@PathVariable Long id, @RequestBody AiTenant tenant) { + tenant.setId(id); + tenantService.updateById(tenant); + return tenant; + } + + @DeleteMapping("/tenant/{id}") + public void deleteTenant(@PathVariable Long id) { + tenantService.removeById(id); + } + + // ================== Tool Registry CRUD ================== + + @GetMapping("/tool") + public List listTools() { + return toolRegistryService.list(); + } + + @PostMapping("/tool") + public AiToolRegistry createTool(@RequestBody AiToolRegistry tool) { + toolRegistryService.save(tool); + return tool; + } + + @PutMapping("/tool/{id}") + public AiToolRegistry updateTool(@PathVariable Long id, @RequestBody AiToolRegistry tool) { + tool.setId(id); + toolRegistryService.updateById(tool); + return tool; + } + + @DeleteMapping("/tool/{id}") + public void deleteTool(@PathVariable Long id) { + toolRegistryService.removeById(id); + } + + // ================== Wash Script ================== + + @GetMapping("/wash-script/{toolId}") + public AiWashScript getWashScript(@PathVariable Long toolId) { + return washScriptService.getOne( + new LambdaQueryWrapper().eq(AiWashScript::getToolId, toolId) + ); + } + + @PostMapping("/wash-script") + public AiWashScript saveWashScript(@RequestBody AiWashScript script) { + AiWashScript existing = washScriptService.getOne( + new LambdaQueryWrapper().eq(AiWashScript::getToolId, script.getToolId()) + ); + if (existing != null) { + existing.setJsScript(script.getJsScript()); + existing.setVersion(existing.getVersion() + 1); + washScriptService.updateById(existing); + return existing; + } else { + script.setVersion(1); + washScriptService.save(script); + return script; + } + } + + @PostMapping("/wash-script/test") + public Map testWashScript(@RequestBody Map request) { + // TODO: invoke GraalVM engine to test the script + Map result = new HashMap<>(); + result.put("status", "Test endpoint placeholder — will invoke GraalVM sandbox in next phase"); + result.put("input", request.getOrDefault("rawJson", "")); + return result; + } + + // ================== Audit Log ================== + + @GetMapping("/audit-log") + public List listAuditLogs( + @RequestParam(required = false) String traceId, + @RequestParam(required = false) String toolName + ) { + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + if (traceId != null && !traceId.isBlank()) qw.eq(AiAuditLog::getTraceId, traceId); + if (toolName != null && !toolName.isBlank()) qw.eq(AiAuditLog::getToolName, toolName); + qw.orderByDesc(AiAuditLog::getId); + qw.last("LIMIT 200"); + return auditLogService.list(qw); + } + + // ================== AI Copilot Mock ================== + + @PostMapping("/copilot/generate-wash-script") + public Map generateWashScript(@RequestBody Map request) { + String systemPrompt = """ + # Role + 你是一个资深的 JavaScript 数据处理专家与大模型工程架构师。 + + # Objective + 根据用户提供的【原始庞大 JSON 样例】和【自然语言提取要求】,编写一段精简、安全、高效的 JavaScript 代码,用于在 GraalVM 环境下对 JSON 进行瘦身清洗。 + """; + + Map response = new HashMap<>(); + response.put("mockedSystemPrompt", systemPrompt); + response.put("status", "This endpoint should delegate to an LLM provider to generate the JS string."); + response.put("dummyOutput", "function wash(rawJsonString) { return '{}'; }"); + return response; + } +} diff --git a/src/main/java/com/cicc/enterprise/gateway/controller/GatewayEntryController.java b/backend/src/main/java/com/cicc/enterprise/gateway/controller/GatewayEntryController.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/controller/GatewayEntryController.java rename to backend/src/main/java/com/cicc/enterprise/gateway/controller/GatewayEntryController.java diff --git a/src/main/java/com/cicc/enterprise/gateway/engine/GraalVmJsEngine.java b/backend/src/main/java/com/cicc/enterprise/gateway/engine/GraalVmJsEngine.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/engine/GraalVmJsEngine.java rename to backend/src/main/java/com/cicc/enterprise/gateway/engine/GraalVmJsEngine.java diff --git a/src/main/java/com/cicc/enterprise/gateway/engine/LocalCacheManager.java b/backend/src/main/java/com/cicc/enterprise/gateway/engine/LocalCacheManager.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/engine/LocalCacheManager.java rename to backend/src/main/java/com/cicc/enterprise/gateway/engine/LocalCacheManager.java diff --git a/src/main/java/com/cicc/enterprise/gateway/engine/OkHttpProxyClient.java b/backend/src/main/java/com/cicc/enterprise/gateway/engine/OkHttpProxyClient.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/engine/OkHttpProxyClient.java rename to backend/src/main/java/com/cicc/enterprise/gateway/engine/OkHttpProxyClient.java diff --git a/src/main/java/com/cicc/enterprise/gateway/filter/core/ExecutionStrategy.java b/backend/src/main/java/com/cicc/enterprise/gateway/filter/core/ExecutionStrategy.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/filter/core/ExecutionStrategy.java rename to backend/src/main/java/com/cicc/enterprise/gateway/filter/core/ExecutionStrategy.java diff --git a/src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayContext.java b/backend/src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayContext.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayContext.java rename to backend/src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayContext.java diff --git a/src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilter.java b/backend/src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilter.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilter.java rename to backend/src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilter.java diff --git a/src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilterChain.java b/backend/src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilterChain.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilterChain.java rename to backend/src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilterChain.java diff --git a/src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilterExecutor.java b/backend/src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilterExecutor.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilterExecutor.java rename to backend/src/main/java/com/cicc/enterprise/gateway/filter/core/GatewayFilterExecutor.java diff --git a/src/main/java/com/cicc/enterprise/gateway/filter/impl/AsyncAuditFilter.java b/backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/AsyncAuditFilter.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/filter/impl/AsyncAuditFilter.java rename to backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/AsyncAuditFilter.java diff --git a/src/main/java/com/cicc/enterprise/gateway/filter/impl/AuthRateLimitingFilter.java b/backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/AuthRateLimitingFilter.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/filter/impl/AuthRateLimitingFilter.java rename to backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/AuthRateLimitingFilter.java diff --git a/src/main/java/com/cicc/enterprise/gateway/filter/impl/ConfigWatcherFilter.java b/backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/ConfigWatcherFilter.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/filter/impl/ConfigWatcherFilter.java rename to backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/ConfigWatcherFilter.java diff --git a/src/main/java/com/cicc/enterprise/gateway/filter/impl/GraalVmWashingFilter.java b/backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/GraalVmWashingFilter.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/filter/impl/GraalVmWashingFilter.java rename to backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/GraalVmWashingFilter.java diff --git a/src/main/java/com/cicc/enterprise/gateway/filter/impl/HitlSuspenderFilter.java b/backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/HitlSuspenderFilter.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/filter/impl/HitlSuspenderFilter.java rename to backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/HitlSuspenderFilter.java diff --git a/src/main/java/com/cicc/enterprise/gateway/filter/impl/HttpExecutionStrategyImpl.java b/backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/HttpExecutionStrategyImpl.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/filter/impl/HttpExecutionStrategyImpl.java rename to backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/HttpExecutionStrategyImpl.java diff --git a/src/main/java/com/cicc/enterprise/gateway/filter/impl/IdentityOboFilter.java b/backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/IdentityOboFilter.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/filter/impl/IdentityOboFilter.java rename to backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/IdentityOboFilter.java diff --git a/src/main/java/com/cicc/enterprise/gateway/filter/impl/ProxyExecutionFilter.java b/backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/ProxyExecutionFilter.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/filter/impl/ProxyExecutionFilter.java rename to backend/src/main/java/com/cicc/enterprise/gateway/filter/impl/ProxyExecutionFilter.java diff --git a/src/main/java/com/cicc/enterprise/gateway/mapper/AiAuditLogMapper.java b/backend/src/main/java/com/cicc/enterprise/gateway/mapper/AiAuditLogMapper.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/mapper/AiAuditLogMapper.java rename to backend/src/main/java/com/cicc/enterprise/gateway/mapper/AiAuditLogMapper.java diff --git a/src/main/java/com/cicc/enterprise/gateway/mapper/AiTenantMapper.java b/backend/src/main/java/com/cicc/enterprise/gateway/mapper/AiTenantMapper.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/mapper/AiTenantMapper.java rename to backend/src/main/java/com/cicc/enterprise/gateway/mapper/AiTenantMapper.java diff --git a/src/main/java/com/cicc/enterprise/gateway/mapper/AiTenantToolRelMapper.java b/backend/src/main/java/com/cicc/enterprise/gateway/mapper/AiTenantToolRelMapper.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/mapper/AiTenantToolRelMapper.java rename to backend/src/main/java/com/cicc/enterprise/gateway/mapper/AiTenantToolRelMapper.java diff --git a/src/main/java/com/cicc/enterprise/gateway/mapper/AiToolRegistryMapper.java b/backend/src/main/java/com/cicc/enterprise/gateway/mapper/AiToolRegistryMapper.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/mapper/AiToolRegistryMapper.java rename to backend/src/main/java/com/cicc/enterprise/gateway/mapper/AiToolRegistryMapper.java diff --git a/src/main/java/com/cicc/enterprise/gateway/mapper/AiWashScriptMapper.java b/backend/src/main/java/com/cicc/enterprise/gateway/mapper/AiWashScriptMapper.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/mapper/AiWashScriptMapper.java rename to backend/src/main/java/com/cicc/enterprise/gateway/mapper/AiWashScriptMapper.java diff --git a/src/main/java/com/cicc/enterprise/gateway/model/AiAuditLog.java b/backend/src/main/java/com/cicc/enterprise/gateway/model/AiAuditLog.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/model/AiAuditLog.java rename to backend/src/main/java/com/cicc/enterprise/gateway/model/AiAuditLog.java diff --git a/src/main/java/com/cicc/enterprise/gateway/model/AiTenant.java b/backend/src/main/java/com/cicc/enterprise/gateway/model/AiTenant.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/model/AiTenant.java rename to backend/src/main/java/com/cicc/enterprise/gateway/model/AiTenant.java diff --git a/src/main/java/com/cicc/enterprise/gateway/model/AiTenantToolRel.java b/backend/src/main/java/com/cicc/enterprise/gateway/model/AiTenantToolRel.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/model/AiTenantToolRel.java rename to backend/src/main/java/com/cicc/enterprise/gateway/model/AiTenantToolRel.java diff --git a/src/main/java/com/cicc/enterprise/gateway/model/AiToolRegistry.java b/backend/src/main/java/com/cicc/enterprise/gateway/model/AiToolRegistry.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/model/AiToolRegistry.java rename to backend/src/main/java/com/cicc/enterprise/gateway/model/AiToolRegistry.java diff --git a/src/main/java/com/cicc/enterprise/gateway/model/AiWashScript.java b/backend/src/main/java/com/cicc/enterprise/gateway/model/AiWashScript.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/model/AiWashScript.java rename to backend/src/main/java/com/cicc/enterprise/gateway/model/AiWashScript.java diff --git a/src/main/java/com/cicc/enterprise/gateway/service/AiAuditLogService.java b/backend/src/main/java/com/cicc/enterprise/gateway/service/AiAuditLogService.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/service/AiAuditLogService.java rename to backend/src/main/java/com/cicc/enterprise/gateway/service/AiAuditLogService.java diff --git a/src/main/java/com/cicc/enterprise/gateway/service/AiTenantService.java b/backend/src/main/java/com/cicc/enterprise/gateway/service/AiTenantService.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/service/AiTenantService.java rename to backend/src/main/java/com/cicc/enterprise/gateway/service/AiTenantService.java diff --git a/src/main/java/com/cicc/enterprise/gateway/service/AiTenantToolRelService.java b/backend/src/main/java/com/cicc/enterprise/gateway/service/AiTenantToolRelService.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/service/AiTenantToolRelService.java rename to backend/src/main/java/com/cicc/enterprise/gateway/service/AiTenantToolRelService.java diff --git a/src/main/java/com/cicc/enterprise/gateway/service/AiToolRegistryService.java b/backend/src/main/java/com/cicc/enterprise/gateway/service/AiToolRegistryService.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/service/AiToolRegistryService.java rename to backend/src/main/java/com/cicc/enterprise/gateway/service/AiToolRegistryService.java diff --git a/src/main/java/com/cicc/enterprise/gateway/service/AiWashScriptService.java b/backend/src/main/java/com/cicc/enterprise/gateway/service/AiWashScriptService.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/service/AiWashScriptService.java rename to backend/src/main/java/com/cicc/enterprise/gateway/service/AiWashScriptService.java diff --git a/src/main/java/com/cicc/enterprise/gateway/service/impl/AiAuditLogServiceImpl.java b/backend/src/main/java/com/cicc/enterprise/gateway/service/impl/AiAuditLogServiceImpl.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/service/impl/AiAuditLogServiceImpl.java rename to backend/src/main/java/com/cicc/enterprise/gateway/service/impl/AiAuditLogServiceImpl.java diff --git a/src/main/java/com/cicc/enterprise/gateway/service/impl/AiTenantServiceImpl.java b/backend/src/main/java/com/cicc/enterprise/gateway/service/impl/AiTenantServiceImpl.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/service/impl/AiTenantServiceImpl.java rename to backend/src/main/java/com/cicc/enterprise/gateway/service/impl/AiTenantServiceImpl.java diff --git a/src/main/java/com/cicc/enterprise/gateway/service/impl/AiTenantToolRelServiceImpl.java b/backend/src/main/java/com/cicc/enterprise/gateway/service/impl/AiTenantToolRelServiceImpl.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/service/impl/AiTenantToolRelServiceImpl.java rename to backend/src/main/java/com/cicc/enterprise/gateway/service/impl/AiTenantToolRelServiceImpl.java diff --git a/src/main/java/com/cicc/enterprise/gateway/service/impl/AiToolRegistryServiceImpl.java b/backend/src/main/java/com/cicc/enterprise/gateway/service/impl/AiToolRegistryServiceImpl.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/service/impl/AiToolRegistryServiceImpl.java rename to backend/src/main/java/com/cicc/enterprise/gateway/service/impl/AiToolRegistryServiceImpl.java diff --git a/src/main/java/com/cicc/enterprise/gateway/service/impl/AiWashScriptServiceImpl.java b/backend/src/main/java/com/cicc/enterprise/gateway/service/impl/AiWashScriptServiceImpl.java similarity index 100% rename from src/main/java/com/cicc/enterprise/gateway/service/impl/AiWashScriptServiceImpl.java rename to backend/src/main/java/com/cicc/enterprise/gateway/service/impl/AiWashScriptServiceImpl.java diff --git a/src/main/resources/application.yml b/backend/src/main/resources/application.yml similarity index 84% rename from src/main/resources/application.yml rename to backend/src/main/resources/application.yml index 61e4e49..3af8a36 100644 --- a/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -1,12 +1,14 @@ server: port: 8080 spring: + profiles: + active: dev application: name: ai-agent-gateway datasource: - url: jdbc:mysql://127.0.0.1:3306/db_agent_gateway?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true + url: jdbc:mysql://127.0.0.1:3306/db_agent_gateway?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false username: root - password: Gmcc@123 + password: YOUR_PASSWORD_HERE # Please configure actual password in application-dev.yml driver-class-name: com.mysql.cj.jdbc.Driver data: redis: diff --git a/src/main/resources/schema.sql b/backend/src/main/resources/schema.sql similarity index 100% rename from src/main/resources/schema.sql rename to backend/src/main/resources/schema.sql diff --git a/disign.md b/disign.md index 87e1478..e646cf2 100644 --- a/disign.md +++ b/disign.md @@ -1,12 +1,3 @@ -# enterprise-ai-agent-gateway -企业级 AI 智能体网关 - -这份终稿设计书已经为你全面整合完毕。它不仅包含了底层的**数据库模型**和**网关责任链**,还把你刚刚关心的**“前端如何降低脚本编写成本”**的设计思路,以及核心的**系统提示词(System Prompt)**全部固化了进去。 - -你可以直接将以下全部内容复制,喂给 Antigravity,让它开始生成骨架代码。 - -*** - # 🚀 Enterprise AI Agent Gateway (企业级 AI 智能体网关) - 核心架构与开发设计书 ## 1. 架构定位与核心设计理念 @@ -128,7 +119,4 @@ function wash(rawJsonString) { return JSON.stringify({ error: "数据清洗失败" }); } } -``` -*** - -把这份文档丢给 Antigravity 后,你可以直接下达指令:**“请先根据第 3 节生成所有 MySQL 建表语句,然后生成第 5 节的 Filter 责任链代码骨架。”** 期待你的架构早日跑通! \ No newline at end of file +``` \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/.vscode/extensions.json b/frontend/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/frontend/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..1511959 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,5 @@ +# Vue 3 + Vite + +This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..4e703a7 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,1694 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "@element-plus/icons-vue": "^2.3.2", + "axios": "^1.13.6", + "element-plus": "^2.13.5", + "vue": "^3.5.12", + "vue-router": "^4.6.4" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.1.4", + "vite": "^5.4.10" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", + "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz", + "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.30", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.30.tgz", + "integrity": "sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.30.tgz", + "integrity": "sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.30.tgz", + "integrity": "sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/runtime-core": "3.5.30", + "@vue/shared": "3.5.30", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.30.tgz", + "integrity": "sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "vue": "3.5.30" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.0.0.tgz", + "integrity": "sha512-C12RukhXiJCbx4MGhjmd/gH52TjJsc3G0E0kQj/kb19H3Nt6n1CA4DRWuTdWWcaFRdlTe0npWDS942mvacvNBw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "12.0.0", + "@vueuse/shared": "12.0.0", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.0.0.tgz", + "integrity": "sha512-Yzimd1D3sjxTDOlF05HekU5aSGdKjxhuhRFHA7gDWLn57PRbBIh+SF5NmjhJ0WRgF3my7T8LBucyxdFJjIfRJQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.0.0.tgz", + "integrity": "sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==", + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/element-plus": { + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.13.5.tgz", + "integrity": "sha512-dmY24fhSREfZN/PuUt0YZigMso7wWzl+B5o+YKNN15kQIn/0hzamsPU+ebj9SES0IbUqsLX1wkrzYmzU8VrVOQ==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.2.0", + "@element-plus/icons-vue": "^2.3.2", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.17.20", + "@types/lodash-es": "^4.17.12", + "@vueuse/core": "12.0.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.19", + "lodash": "^4.17.23", + "lodash-es": "^4.17.23", + "lodash-unified": "^1.0.3", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.3.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "license": "MIT" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", + "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..0a2cdb6 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,22 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.2", + "axios": "^1.13.6", + "element-plus": "^2.13.5", + "vue": "^3.5.12", + "vue-router": "^4.6.4" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.1.4", + "vite": "^5.4.10" + } +} diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/frontend/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..e0b7430 --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,52 @@ + + + diff --git a/frontend/src/api/index.js b/frontend/src/api/index.js new file mode 100644 index 0000000..3d936d2 --- /dev/null +++ b/frontend/src/api/index.js @@ -0,0 +1,37 @@ +import axios from 'axios' + +const api = axios.create({ + baseURL: '/api/v1', + timeout: 15000, + headers: { 'Content-Type': 'application/json' } +}) + +// ========== Tenant ========== +export const tenantApi = { + list: () => api.get('/admin/tenant'), + create: (data) => api.post('/admin/tenant', data), + update: (id, data) => api.put(`/admin/tenant/${id}`, data), + delete: (id) => api.delete(`/admin/tenant/${id}`) +} + +// ========== Tool Registry ========== +export const toolApi = { + list: () => api.get('/admin/tool'), + create: (data) => api.post('/admin/tool', data), + update: (id, data) => api.put(`/admin/tool/${id}`, data), + delete: (id) => api.delete(`/admin/tool/${id}`) +} + +// ========== Wash Script ========== +export const washScriptApi = { + getByToolId: (toolId) => api.get(`/admin/wash-script/${toolId}`), + save: (data) => api.post('/admin/wash-script', data), + testScript: (data) => api.post('/admin/wash-script/test', data) +} + +// ========== Audit Log ========== +export const auditApi = { + list: (params) => api.get('/admin/audit-log', { params }) +} + +export default api diff --git a/frontend/src/assets/vue.svg b/frontend/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/frontend/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/components/HelloWorld.vue b/frontend/src/components/HelloWorld.vue new file mode 100644 index 0000000..546ebbc --- /dev/null +++ b/frontend/src/components/HelloWorld.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/frontend/src/main.js b/frontend/src/main.js new file mode 100644 index 0000000..e243994 --- /dev/null +++ b/frontend/src/main.js @@ -0,0 +1,17 @@ +import { createApp } from 'vue' +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' +import * as ElementPlusIconsVue from '@element-plus/icons-vue' +import App from './App.vue' +import router from './router' +import './style.css' + +const app = createApp(App) +app.use(ElementPlus) +app.use(router) + +for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component) +} + +app.mount('#app') diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js new file mode 100644 index 0000000..3ddc655 --- /dev/null +++ b/frontend/src/router/index.js @@ -0,0 +1,39 @@ +import { createRouter, createWebHistory } from 'vue-router' + +const routes = [ + { + path: '/', + redirect: '/tenant' + }, + { + path: '/tenant', + name: 'TenantManage', + component: () => import('../views/TenantManage.vue'), + meta: { title: '租户管理', icon: 'User' } + }, + { + path: '/tool', + name: 'ToolRegistry', + component: () => import('../views/ToolRegistry.vue'), + meta: { title: '工具注册', icon: 'SetUp' } + }, + { + path: '/wash-script', + name: 'WashScript', + component: () => import('../views/WashScript.vue'), + meta: { title: '清洗脚本', icon: 'MagicStick' } + }, + { + path: '/audit-log', + name: 'AuditLog', + component: () => import('../views/AuditLog.vue'), + meta: { title: '审计日志', icon: 'Document' } + } +] + +const router = createRouter({ + history: createWebHistory(), + routes +}) + +export default router diff --git a/frontend/src/style.css b/frontend/src/style.css new file mode 100644 index 0000000..a178eef --- /dev/null +++ b/frontend/src/style.css @@ -0,0 +1,117 @@ +:root { + --sidebar-bg: #1d1e2c; + --sidebar-active: #409eff; + --header-bg: #ffffff; + --body-bg: #f0f2f5; + --card-bg: #ffffff; +} + +* { margin: 0; padding: 0; box-sizing: border-box; } + +body { + font-family: 'Inter', 'PingFang SC', 'Microsoft YaHei', sans-serif; + background: var(--body-bg); + color: #303133; + -webkit-font-smoothing: antialiased; +} + +.layout { + display: flex; + height: 100vh; +} + +.sidebar { + width: 220px; + background: var(--sidebar-bg); + display: flex; + flex-direction: column; + flex-shrink: 0; + box-shadow: 2px 0 8px rgba(0,0,0,0.15); + z-index: 10; +} + +.sidebar-logo { + height: 64px; + display: flex; + align-items: center; + justify-content: center; + border-bottom: 1px solid rgba(255,255,255,0.08); +} + +.sidebar-logo h1 { + color: #fff; + font-size: 16px; + font-weight: 600; + letter-spacing: 1px; +} + +.sidebar-logo .logo-icon { + font-size: 22px; + margin-right: 8px; + background: linear-gradient(135deg, #409eff, #67c23a); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.sidebar .el-menu { + border: none; + background: transparent; +} + +.main-area { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.top-header { + height: 56px; + background: var(--header-bg); + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 24px; + box-shadow: 0 1px 4px rgba(0,0,0,0.08); + z-index: 5; +} + +.top-header .page-title { + font-size: 18px; + font-weight: 600; + color: #1d1e2c; +} + +.top-header .header-right { + display: flex; + align-items: center; + gap: 16px; + color: #909399; + font-size: 14px; +} + +.content-area { + flex: 1; + padding: 20px; + overflow-y: auto; +} + +.page-card { + background: var(--card-bg); + border-radius: 8px; + padding: 20px; + box-shadow: 0 2px 12px rgba(0,0,0,0.06); +} + +.page-card .toolbar { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 16px; +} + +.page-card .toolbar-left { + display: flex; + gap: 12px; + align-items: center; +} diff --git a/frontend/src/views/AuditLog.vue b/frontend/src/views/AuditLog.vue new file mode 100644 index 0000000..bc889c2 --- /dev/null +++ b/frontend/src/views/AuditLog.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/frontend/src/views/TenantManage.vue b/frontend/src/views/TenantManage.vue new file mode 100644 index 0000000..b2d9cac --- /dev/null +++ b/frontend/src/views/TenantManage.vue @@ -0,0 +1,116 @@ + + + diff --git a/frontend/src/views/ToolRegistry.vue b/frontend/src/views/ToolRegistry.vue new file mode 100644 index 0000000..1b61572 --- /dev/null +++ b/frontend/src/views/ToolRegistry.vue @@ -0,0 +1,137 @@ + + + diff --git a/frontend/src/views/WashScript.vue b/frontend/src/views/WashScript.vue new file mode 100644 index 0000000..1e5bbfc --- /dev/null +++ b/frontend/src/views/WashScript.vue @@ -0,0 +1,108 @@ + + + diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100644 index 0000000..28bcb38 --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,15 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +export default defineConfig({ + plugins: [vue()], + server: { + port: 5173, + proxy: { + '/api': { + target: 'http://localhost:8080', + changeOrigin: true, + } + } + } +}) diff --git a/src/main/java/com/cicc/enterprise/gateway/controller/ControlPlaneAdminController.java b/src/main/java/com/cicc/enterprise/gateway/controller/ControlPlaneAdminController.java deleted file mode 100644 index 3100b11..0000000 --- a/src/main/java/com/cicc/enterprise/gateway/controller/ControlPlaneAdminController.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.cicc.enterprise.gateway.controller; - -import com.cicc.enterprise.gateway.model.AiToolRegistry; -import com.cicc.enterprise.gateway.service.AiToolRegistryService; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@RestController -@RequestMapping("/api/v1/admin") -@RequiredArgsConstructor -public class ControlPlaneAdminController { - - private final AiToolRegistryService toolRegistryService; - - // Standard CRUD - @GetMapping("/tools") - public List listTools() { - return toolRegistryService.list(); - } - - @PostMapping("/tools") - public AiToolRegistry createTool(@RequestBody AiToolRegistry tool) { - toolRegistryService.save(tool); - return tool; - } - - // AI Copilot Mock API for Wash Script Generation - @PostMapping("/copilot/generate-wash-script") - public Map generateWashScript(@RequestBody Map request) { - // Extract parameters from request if needed for dynamic prompt building - // String rawJsonSample = request.get("rawJsonSample"); - // String requirement = request.get("requirement"); - String systemPrompt = """ - # Role - 你是一个资深的 JavaScript 数据处理专家与大模型工程架构师。 - - # Objective - 根据用户提供的【原始庞大 JSON 样例】和【自然语言提取要求】,编写一段精简、安全、高效的 JavaScript 代码,用于在 GraalVM 环境下对 JSON 进行瘦身清洗。这段清洗后的数据将被直接喂给大模型(LLM)作为上下文。 - - # Constraints & Rules - 1. 你的输出必须且只能包含一个名为 `wash` 的 JavaScript 函数。 - 2. 该函数的入参必须是 `rawJsonString` (字符串类型)。 - 3. 该函数的返回值必须是清洗并序列化后的 JSON 字符串,以确保后续直接使用。 - ... - """; - - Map response = new HashMap<>(); - response.put("mockedSystemPrompt", systemPrompt); - response.put("status", "This endpoint should delegate to an LLM provider to generate the JS string."); - response.put("dummyOutput", "function wash(rawJsonString) { return '{}'; }"); - - return response; - } -}