浏览代码

fix: 调整概括页面/组件

Mickey Mike 1 周之前
父节点
当前提交
7dad74278a

+ 1 - 1
apps/web/src/components/RunWork.vue

@@ -45,4 +45,4 @@ const emit = defineEmits<{
 .pt-0 {
     padding-top: 0px;
 }
-</style>
+</style>

+ 1 - 1
apps/web/src/components/SearchDialog/index.vue

@@ -38,7 +38,7 @@
 				<div class="search-items">
 					<div class="search-item action-item" @click="handleCreateWorkflow">
 						<span class="item-icon">+</span>
-						<span class="item-text">在个人环境中创建工作流程</span>
+						<span class="item-text">创建工作流程</span>
 					</div>
 				</div>
 			</div>

+ 1 - 51
apps/web/src/layouts/MainLayout.vue

@@ -5,64 +5,14 @@
 		</el-aside>
 
 		<el-container>
-			<el-header
-				v-if="!isWorkflowPage"
-				style="
-					height: 64px;
-					display: flex;
-					align-items: center;
-					padding: 0 16px;
-					justify-content: space-between;
-				"
-			>
-				<div style="display: flex; align-items: center; gap: 12px">
-					<div style="font-weight: 700; font-size: 18px">AI Agent</div>
-					<div style="color: #888; font-size: 13px">概述</div>
-				</div>
-
-				<div style="display: flex; align-items: center; gap: 12px">
-					<el-dropdown style="background: #ff6b6b" split-button type="primary" @click="handleClick">
-						创建工作流程
-						<template #dropdown>
-							<el-dropdown-menu>
-								<el-dropdown-item>创建凭证</el-dropdown-item>
-								<el-dropdown-item>创建变量</el-dropdown-item>
-								<el-dropdown-item>创建数据表</el-dropdown-item>
-							</el-dropdown-menu>
-						</template>
-					</el-dropdown>
-				</div>
-			</el-header>
-
-			<el-main style="padding: 16px; overflow: auto" :style="mainStyle">
+			<el-main style="padding: 16px; overflow: auto">
 				<router-view />
 			</el-main>
 		</el-container>
 	</el-container>
 </template>
 <script setup lang="ts">
-import { useRouter, useRoute } from 'vue-router'
-import { computed, provide, ref, type CSSProperties } from 'vue'
 import Sidebar from '@/components/Sidebar/index.vue'
-
-const router = useRouter()
-const route = useRoute()
-
-const mainStyle = ref<CSSProperties>({})
-
-const isWorkflowPage = computed(() => {
-	return route.path.includes('/workflow/')
-})
-
-const handleClick = () => {
-	router.push('/workflow/0')
-}
-
-provide('layout', {
-	setMainStyle(style: CSSProperties) {
-		mainStyle.value = style
-	}
-})
 </script>
 
 <style lang="less" scoped></style>

+ 10 - 2
apps/web/src/router/index.ts

@@ -9,8 +9,16 @@ const routes = [
 		path: '/',
 		component: MainLayout,
 		children: [
-			{ path: '', name: 'Dashboard', component: Dashboard },
-			{ path: 'workflow/:id', name: 'Editor', component: Editor }
+			{
+				path: '',
+				name: 'Dashboard',
+				component: Dashboard
+			},
+			{
+				path: 'workflow/:id',
+				name: 'Editor',
+				component: Editor
+			}
 		]
 	}
 ]

+ 39 - 0
apps/web/src/stores/dashboard.ts

@@ -0,0 +1,39 @@
+import { defineStore } from 'pinia'
+import { ref } from 'vue'
+
+export const useDashboardStore = defineStore('dashboard', () => {
+	const activeTab = ref<string>('flows')
+	const showVarDialog = ref(false)
+	const showTableDialog = ref(false)
+
+	const setActiveTab = (tab: string) => {
+		activeTab.value = tab
+	}
+
+	const openVarDialog = () => {
+		showVarDialog.value = true
+	}
+
+	const closeVarDialog = () => {
+		showVarDialog.value = false
+	}
+
+	const openTableDialog = () => {
+		showTableDialog.value = true
+	}
+
+	const closeTableDialog = () => {
+		showTableDialog.value = false
+	}
+
+	return {
+		activeTab,
+		setActiveTab,
+		showVarDialog,
+		openVarDialog,
+		closeVarDialog,
+		showTableDialog,
+		openTableDialog,
+		closeTableDialog
+	}
+})

+ 132 - 38
apps/web/src/views/Dashboard.vue

@@ -1,26 +1,58 @@
 <template>
-	<div>
-		<el-card shadow="never" style="padding: 18px">
-			<el-row :gutter="16" justify="start">
-				<el-col :span="4" v-for="(card, idx) in cards" :key="idx">
-					<div
-						style="
-							background: linear-gradient(135deg, #fff 0%, #fafafa 100%);
-							padding: 16px;
-							border-radius: 8px;
-							box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
-							border: 1px solid #f0f0f0;
-						"
-					>
-						<div style="font-size: 13px; color: #888">{{ card.title }}</div>
-						<div style="font-size: 20px; margin-top: 6px; font-weight: 600">{{ card.value }}</div>
-					</div>
-				</el-col>
-			</el-row>
-		</el-card>
+	<div style="margin: -16px -16px 0 -16px">
+		<!-- 顶部栏 -->
+		<div
+			style="
+				height: 64px;
+				display: flex;
+				align-items: center;
+				padding: 0 16px;
+				justify-content: space-between;
+				background: #fff;
+				border-bottom: 1px solid #f0f0f0;
+			"
+		>
+			<div style="display: flex; align-items: center; gap: 12px">
+				<div style="font-weight: 700; font-size: 18px">AI Agent</div>
+				<div style="color: #888; font-size: 13px">概述</div>
+			</div>
+
+			<div style="display: flex; align-items: center; gap: 12px">
+				<el-dropdown style="background: #ff6b6b" split-button type="primary" @click="handleMenuClick(buttonConfig.text)">
+					{{ buttonConfig.text }}
+					<template #dropdown>
+						<el-dropdown-menu>
+							<el-dropdown-item v-for="item in buttonConfig.items" :key="item" @click="handleMenuClick(item)">
+								{{ item }}
+							</el-dropdown-item>
+						</el-dropdown-menu>
+					</template>
+				</el-dropdown>
+			</div>
+		</div>
+
+		<div style="padding: 16px">
+			<el-card shadow="never" style="padding: 18px">
+				<el-row :gutter="16" justify="start">
+					<el-col :span="4" v-for="(card, idx) in cards" :key="idx">
+						<div
+							style="
+								background: linear-gradient(135deg, #fff 0%, #fafafa 100%);
+								padding: 16px;
+								border-radius: 8px;
+								box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+								border: 1px solid #f0f0f0;
+							"
+						>
+							<div style="font-size: 13px; color: #888">{{ card.title }}</div>
+							<div style="font-size: 20px; margin-top: 6px; font-weight: 600">{{ card.value }}</div>
+						</div>
+					</el-col>
+				</el-row>
+			</el-card>
 
 		<el-card style="margin-top: 16px">
-			<el-tabs v-model="activeTab">
+			<el-tabs v-model="dashboardStore.activeTab">
 				<el-tab-pane label="工作流程" name="flows"></el-tab-pane>
 				<el-tab-pane label="证书" name="certs"></el-tab-pane>
 				<el-tab-pane label="执行" name="execs"></el-tab-pane>
@@ -215,7 +247,7 @@
 						<div style="font-size: 13px; color: #999; margin-bottom: 16px">
 							变量可用于存储可在多个工作流程中轻松引用的数据。
 						</div>
-						<el-button @click="showVarDialog = true">添加第一个变量</el-button>
+						<el-button @click="dashboardStore.openVarDialog">添加第一个变量</el-button>
 					</div>
 					<el-table v-else :data="filteredVariables" style="width: 100%; margin-top: 12px">
 						<el-table-column prop="key" label="钥匙" />
@@ -267,7 +299,7 @@
 						<div style="font-size: 13px; color: #999; margin-bottom: 20px">
 							使用数据表来保存执行结果、在工作流之间共享数据以及跨进程体估指标。
 						</div>
-						<el-button @click="showTableDialog = true">创建数据表</el-button>
+						<el-button @click="dashboardStore.openTableDialog">创建数据表</el-button>
 					</div>
 					<div v-else>
 						<div
@@ -348,7 +380,7 @@
 									</div>
 
 									<div style="display: flex; gap: 8px; align-items: center">
-										<el-tag size="small" type="info">个人的</el-tag>
+										<!-- <el-tag size="small" type="info">个人的</el-tag> -->
 										<el-dropdown>
 											<span class="el-dropdown-link">•••</span>
 											<template #dropdown>
@@ -396,8 +428,8 @@
 		</el-card>
 
 		<!-- 新变量对话框 -->
-		<el-dialog v-model="showVarDialog" title="新变量" width="500px" @close="resetVarForm">
-			<el-form :model="varForm">
+	<el-dialog v-model="dashboardStore.showVarDialog" :title="varDialogTitle" width="500px" @close="resetVarForm">
+			<el-form :model="varForm" label-position="top">
 				<el-form-item label="钥匙" required>
 					<el-input v-model="varForm.key" placeholder="请输入姓名" />
 				</el-form-item>
@@ -412,14 +444,14 @@
 			</el-form>
 			<template #footer>
 				<div style="text-align: right">
-					<el-button @click="showVarDialog = false">取消</el-button>
+				<el-button @click="dashboardStore.closeVarDialog">取消</el-button>
 					<el-button type="primary" @click="submitVariable">提交</el-button>
 				</div>
 			</template>
 		</el-dialog>
 
 		<!-- 创建新数据表对话框 -->
-		<el-dialog v-model="showTableDialog" title="创建新数据表" width="500px" @close="resetTableForm">
+	<el-dialog v-model="dashboardStore.showTableDialog" title="创建新数据表" width="500px" @close="resetTableForm">
 			<el-form :model="tableForm">
 				<el-form-item label="数据表名称" required>
 					<el-input v-model="tableForm.name" placeholder="输入数据表名称" />
@@ -433,21 +465,54 @@
 			</el-form>
 			<template #footer>
 				<div style="text-align: right">
-					<el-button @click="showTableDialog = false">取消</el-button>
+				<el-button @click="dashboardStore.closeTableDialog">取消</el-button>
 					<el-button type="primary" @click="submitTable">创建</el-button>
 				</div>
 			</template>
 		</el-dialog>
+		</div>
 	</div>
 </template>
 
 <script setup lang="ts">
 import { ref, computed } from 'vue'
 import { useRouter } from 'vue-router'
-import { Search } from '@element-plus/icons-vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
+import { Search } from '@element-plus/icons-vue'
+import { useDashboardStore } from '@/stores/dashboard'
 
 const $router = useRouter()
+const dashboardStore = useDashboardStore()
+
+// 根据当前 tab 确定按钮文字和下拉菜单
+const buttonConfig = computed(() => {
+	const tab = dashboardStore.activeTab
+	const configs: Record<string, { text: string; items: string[] }> = {
+		flows: { text: '创建工作流程', items: ['创建凭证', '创建变量', '创建数据表'] },
+		certs: { text: '创建凭证', items: ['创建工作流程', '创建变量', '创建数据表'] },
+		execs: { text: '创建工作流程', items: ['创建凭证', '创建变量', '创建数据表'] },
+		vars: { text: '创建变量', items: ['创建工作流程', '创建凭证', '创建数据表'] },
+		tables: { text: '创建数据表', items: ['创建工作流程', '创建凭证', '创建变量'] }
+	}
+	return configs[tab] || { text: '创建工作流程', items: ['创建凭证', '创建变量', '创建数据表'] }
+})
+
+const handleMenuClick = (text: string) => {
+	const actionMap: Record<string, () => void> = {
+		'创建工作流程': () => $router.push('/workflow/0'),
+		'创建凭证': () => console.log('创建凭证'),
+		'创建变量': () => {
+			dashboardStore.setActiveTab('vars')
+			dashboardStore.openVarDialog()
+		},
+		'创建数据表': () => {
+			dashboardStore.setActiveTab('tables')
+			dashboardStore.openTableDialog()
+		}
+	}
+	const action = actionMap[text]
+	if (action) action()
+}
 
 const cards = [
 	{ title: '生产执行', value: 0 },
@@ -511,12 +576,15 @@ const executions = ref([
 	}
 ])
 
-const variables = ref([])
+const variables = ref<{ id: number; key: string; value: string; usage: string; scope: string }[]>(
+	[]
+)
 
-const tables = ref([])
+const tables = ref<
+	{ id: number; name: string; description: string; method: string; size: string; rows: string }[]
+>([])
 
 // 数据表相关
-const showTableDialog = ref(false)
 const tablePageInput = ref('')
 const tablePageSize = ref('50')
 const tableForm = ref({
@@ -540,25 +608,29 @@ const submitTable = () => {
 		id: Math.max(...tables.value.map((t: any) => t.id), 0) + 1,
 		name: tableForm.value.name,
 		description: tableForm.value.method === 'from-scratch' ? '从零开始创建' : '从 CSV 导入',
-		method: tableForm.value.method
+		method: tableForm.value.method,
+		size: '0MB',
+		rows: '0'
 	}
 	tables.value.push(newTable)
-	showTableDialog.value = false
+	dashboardStore.closeTableDialog()
 	resetTableForm()
 	ElMessage.success('数据表已创建')
 }
 
 const filter = ref('')
 const sort = ref('name')
-const activeTab = ref('flows')
 const pageSize = ref(10)
 
+// 使用 computed 来包装 dashboardStore.activeTab,以便简化模板中的引用
+const activeTab = computed(() => dashboardStore.activeTab)
+
 // 变量表单相关
-const showVarDialog = ref(false)
 const varFilter = ref('')
 const varSort = ref('name')
 const varPageSize = ref('25')
 const varForm = ref({
+	id: undefined as number | undefined,
 	key: '',
 	value: '',
 	scope: '全局的'
@@ -566,6 +638,7 @@ const varForm = ref({
 
 const resetVarForm = () => {
 	varForm.value = {
+		id: undefined,
 		key: '',
 		value: '',
 		scope: '全局的'
@@ -577,6 +650,25 @@ const submitVariable = () => {
 		ElMessage.error('请输入钥匙')
 		return
 	}
+	// 编辑已有变量
+	if (varForm.value.id) {
+		const idx = variables.value.findIndex((v: any) => v.id === varForm.value.id)
+		if (idx !== -1) {
+			variables.value[idx] = {
+				id: varForm.value.id,
+				key: varForm.value.key,
+				value: varForm.value.value,
+				usage: `$vars.${varForm.value.key}`,
+				scope: varForm.value.scope
+			}
+			dashboardStore.closeVarDialog()
+			resetVarForm()
+			ElMessage.success('变量已更新')
+			return
+		}
+	}
+
+	// 新增变量
 	const newVar = {
 		id: Math.max(...variables.value.map((v: any) => v.id), 0) + 1,
 		key: varForm.value.key,
@@ -585,14 +677,16 @@ const submitVariable = () => {
 		scope: varForm.value.scope
 	}
 	variables.value.push(newVar)
-	showVarDialog.value = false
+	dashboardStore.closeVarDialog()
 	resetVarForm()
 	ElMessage.success('变量已添加')
 }
 
+const varDialogTitle = computed(() => (varForm.value.id ? '编辑变量' : '新增'))
+
 const editVariable = (variable: any) => {
 	varForm.value = { ...variable, scope: variable.scope }
-	showVarDialog.value = true
+	dashboardStore.openVarDialog()
 }
 
 const deleteVariable = (id: number) => {

+ 146 - 78
pnpm-lock.yaml

@@ -148,6 +148,9 @@ importers:
       normalize.css:
         specifier: ^8.0.1
         version: 8.0.1
+      pinia:
+        specifier: ^3.0.4
+        version: 3.0.4(typescript@5.9.3)(vue@3.5.27(typescript@5.9.3))
       uuid:
         specifier: ^13.0.0
         version: 13.0.0
@@ -166,7 +169,7 @@ importers:
         version: link:../../packages/workflow
       '@vitejs/plugin-vue':
         specifier: ^6.0.1
-        version: 6.0.3(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2))(vue@3.5.27(typescript@5.9.3))
+        version: 6.0.3(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1))(vue@3.5.27(typescript@5.9.3))
       '@vue/tsconfig':
         specifier: ^0.8.1
         version: 0.8.1(typescript@5.9.3)(vue@3.5.27(typescript@5.9.3))
@@ -178,7 +181,7 @@ importers:
         version: 5.9.3
       unocss:
         specifier: ^66.6.0
-        version: 66.6.0(postcss@5.2.18)(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2))
+        version: 66.6.0(postcss@5.2.18)(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1))
       unplugin-auto-import:
         specifier: ^21.0.0
         version: 21.0.0(@vueuse/core@10.11.1(vue@3.5.27(typescript@5.9.3)))
@@ -190,10 +193,10 @@ importers:
         version: 31.0.0(vue@3.5.27(typescript@5.9.3))
       vite:
         specifier: npm:rolldown-vite@7.2.5
-        version: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2)
+        version: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)
       vite-plugin-svg-icons:
         specifier: ^2.0.1
-        version: 2.0.1(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2))
+        version: 2.0.1(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1))
       vue-tsc:
         specifier: ^3.1.4
         version: 3.2.2(typescript@5.9.3)
@@ -209,7 +212,7 @@ importers:
         version: link:../typescript-config
       '@umijs/openapi':
         specifier: ^1.14.1
-        version: 1.14.1(chokidar@5.0.0)(typescript@5.9.3)
+        version: 1.14.1(typescript@5.9.3)
 
   packages/api-service:
     devDependencies:
@@ -221,7 +224,7 @@ importers:
         version: link:../typescript-config
       '@umijs/openapi':
         specifier: ^1.14.1
-        version: 1.14.1(chokidar@5.0.0)(typescript@5.9.3)
+        version: 1.14.1(typescript@5.9.3)
 
   packages/eslint-config:
     devDependencies:
@@ -266,7 +269,7 @@ importers:
         version: 4.5.1
       less-loader:
         specifier: ^12.3.0
-        version: 12.3.0(@rspack/core@1.7.3(@swc/helpers@0.5.18))(less@4.5.1)
+        version: 12.3.0(@rspack/core@1.7.3)(less@4.5.1)
     devDependencies:
       '@repo/nodes':
         specifier: workspace:*
@@ -335,13 +338,13 @@ importers:
         version: 4.5.1
       less-loader:
         specifier: ^12.3.0
-        version: 12.3.0(@rspack/core@1.7.3(@swc/helpers@0.5.18))(less@4.5.1)
+        version: 12.3.0(@rspack/core@1.7.3)(less@4.5.1)
       normalize.css:
         specifier: ^8.0.1
         version: 8.0.1
       unocss:
         specifier: ^66.6.0
-        version: 66.6.0(postcss@8.5.6)(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2))
+        version: 66.6.0(postcss@8.5.6)(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1))
       vue:
         specifier: ^3.5.24
         version: 3.5.27(typescript@5.9.3)
@@ -360,7 +363,7 @@ importers:
         version: 24.10.9
       '@vitejs/plugin-vue':
         specifier: ^6.0.1
-        version: 6.0.3(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2))(vue@3.5.27(typescript@5.9.3))
+        version: 6.0.3(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1))(vue@3.5.27(typescript@5.9.3))
       '@vue/tsconfig':
         specifier: ^0.8.1
         version: 0.8.1(typescript@5.9.3)(vue@3.5.27(typescript@5.9.3))
@@ -369,7 +372,7 @@ importers:
         version: 5.9.3
       vite:
         specifier: npm:rolldown-vite@7.2.5
-        version: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2)
+        version: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)
       vue-tsc:
         specifier: ^3.1.4
         version: 3.2.2(typescript@5.9.3)
@@ -996,28 +999,24 @@ packages:
     engines: {node: '>=14.21.3'}
     cpu: [arm64]
     os: [linux]
-    libc: [musl]
 
   '@biomejs/cli-linux-arm64@2.3.11':
     resolution: {integrity: sha512-l4xkGa9E7Uc0/05qU2lMYfN1H+fzzkHgaJoy98wO+b/7Gl78srbCRRgwYSW+BTLixTBrM6Ede5NSBwt7rd/i6g==}
     engines: {node: '>=14.21.3'}
     cpu: [arm64]
     os: [linux]
-    libc: [glibc]
 
   '@biomejs/cli-linux-x64-musl@2.3.11':
     resolution: {integrity: sha512-vU7a8wLs5C9yJ4CB8a44r12aXYb8yYgBn+WeyzbMjaCMklzCv1oXr8x+VEyWodgJt9bDmhiaW/I0RHbn7rsNmw==}
     engines: {node: '>=14.21.3'}
     cpu: [x64]
     os: [linux]
-    libc: [musl]
 
   '@biomejs/cli-linux-x64@2.3.11':
     resolution: {integrity: sha512-/1s9V/H3cSe0r0Mv/Z8JryF5x9ywRxywomqZVLHAoa/uN0eY7F8gEngWKNS5vbbN/BsfpCG5yeBT5ENh50Frxg==}
     engines: {node: '>=14.21.3'}
     cpu: [x64]
     os: [linux]
-    libc: [glibc]
 
   '@biomejs/cli-win32-arm64@2.3.11':
     resolution: {integrity: sha512-PZQ6ElCOnkYapSsysiTy0+fYX+agXPlWugh6+eQ6uPKI3vKAqNp6TnMhoM3oY2NltSB89hz59o8xIfOdyhi9Iw==}
@@ -1957,28 +1956,24 @@ packages:
     engines: {node: ^20.19.0 || >=22.12.0}
     cpu: [arm64]
     os: [linux]
-    libc: [glibc]
 
   '@rolldown/binding-linux-arm64-musl@1.0.0-beta.50':
     resolution: {integrity: sha512-L0zRdH2oDPkmB+wvuTl+dJbXCsx62SkqcEqdM+79LOcB+PxbAxxjzHU14BuZIQdXcAVDzfpMfaHWzZuwhhBTcw==}
     engines: {node: ^20.19.0 || >=22.12.0}
     cpu: [arm64]
     os: [linux]
-    libc: [musl]
 
   '@rolldown/binding-linux-x64-gnu@1.0.0-beta.50':
     resolution: {integrity: sha512-gyoI8o/TGpQd3OzkJnh1M2kxy1Bisg8qJ5Gci0sXm9yLFzEXIFdtc4EAzepxGvrT2ri99ar5rdsmNG0zP0SbIg==}
     engines: {node: ^20.19.0 || >=22.12.0}
     cpu: [x64]
     os: [linux]
-    libc: [glibc]
 
   '@rolldown/binding-linux-x64-musl@1.0.0-beta.50':
     resolution: {integrity: sha512-zti8A7M+xFDpKlghpcCAzyOi+e5nfUl3QhU023ce5NCgUxRG5zGP2GR9LTydQ1rnIPwZUVBWd4o7NjZDaQxaXA==}
     engines: {node: ^20.19.0 || >=22.12.0}
     cpu: [x64]
     os: [linux]
-    libc: [musl]
 
   '@rolldown/binding-openharmony-arm64@1.0.0-beta.50':
     resolution: {integrity: sha512-eZUssog7qljrrRU9Mi0eqYEPm3Ch0UwB+qlWPMKSUXHNqhm3TvDZarJQdTevGEfu3EHAXJvBIe0YFYr0TPVaMA==}
@@ -2044,25 +2039,21 @@ packages:
     resolution: {integrity: sha512-SodEX3+1/GLz0LobX9cY1QdjJ1NftSEh4C2vGpr71iA3MS9HyXuw4giqSeRQ4DpCybqpdS/3RLjVqFQEfGpcnw==}
     cpu: [arm64]
     os: [linux]
-    libc: [glibc]
 
   '@rspack/binding-linux-arm64-musl@1.7.3':
     resolution: {integrity: sha512-ydD2fNdEy+G7EYJ/a3FfdFZPfrLj/UnZocCNlZTTSHEhu+jURdQk0hwV11CvL+sjnKU5e/8IVMGUzhu3Gu8Ghg==}
     cpu: [arm64]
     os: [linux]
-    libc: [musl]
 
   '@rspack/binding-linux-x64-gnu@1.7.3':
     resolution: {integrity: sha512-adnDbUqafSAI6/N6vZ+iONSo1W3yUpnNtJqP3rVp7+YdABhUpbOhtaY37qpIJ3uFajXctYFyISPrb4MWl1M9Yg==}
     cpu: [x64]
     os: [linux]
-    libc: [glibc]
 
   '@rspack/binding-linux-x64-musl@1.7.3':
     resolution: {integrity: sha512-5jnjdODk5HCUFPN6rTaFukynDU4Fn9eCL+4TSp6mqo6YAnfnJEuzDjfetA8t3aQFcAs7WriQfNwvdcA4HvYtbA==}
     cpu: [x64]
     os: [linux]
-    libc: [musl]
 
   '@rspack/binding-wasm32-wasi@1.7.3':
     resolution: {integrity: sha512-WLQK0ksUzMkVeGoHAMIxenmeEU5tMvFDK36Aip7VRj7T6vZTcAwvbMwc38QrIAvlG7dqWoxgPQi35ba1igNNDw==}
@@ -2525,49 +2516,41 @@ packages:
     resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
     cpu: [arm64]
     os: [linux]
-    libc: [glibc]
 
   '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
     resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
     cpu: [arm64]
     os: [linux]
-    libc: [musl]
 
   '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
     resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
     cpu: [ppc64]
     os: [linux]
-    libc: [glibc]
 
   '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
     resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
     cpu: [riscv64]
     os: [linux]
-    libc: [glibc]
 
   '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
     resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
     cpu: [riscv64]
     os: [linux]
-    libc: [musl]
 
   '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
     resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
     cpu: [s390x]
     os: [linux]
-    libc: [glibc]
 
   '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
     resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
     cpu: [x64]
     os: [linux]
-    libc: [glibc]
 
   '@unrs/resolver-binding-linux-x64-musl@1.11.1':
     resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
     cpu: [x64]
     os: [linux]
-    libc: [musl]
 
   '@unrs/resolver-binding-wasm32-wasi@1.11.1':
     resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
@@ -2658,6 +2641,15 @@ packages:
   '@vue/devtools-api@6.6.4':
     resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
 
+  '@vue/devtools-api@7.7.9':
+    resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==}
+
+  '@vue/devtools-kit@7.7.9':
+    resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==}
+
+  '@vue/devtools-shared@7.7.9':
+    resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==}
+
   '@vue/language-core@3.2.2':
     resolution: {integrity: sha512-5DAuhxsxBN9kbriklh3Q5AMaJhyOCNiQJvCskN9/30XOpdLiqZU9Q+WvjArP17ubdGEyZtBzlIeG5nIjEbNOrQ==}
 
@@ -2895,6 +2887,9 @@ packages:
   bignumber.js@9.3.1:
     resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==}
 
+  birpc@2.9.0:
+    resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==}
+
   bluebird@3.7.2:
     resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
 
@@ -3084,6 +3079,10 @@ packages:
   copy-anything@2.0.6:
     resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==}
 
+  copy-anything@4.0.5:
+    resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==}
+    engines: {node: '>=18'}
+
   copy-descriptor@0.1.1:
     resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==}
     engines: {node: '>=0.10.0'}
@@ -4009,6 +4008,9 @@ packages:
   hoist-non-react-statics@3.3.2:
     resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
 
+  hookable@5.5.3:
+    resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
+
   html-entities@2.6.0:
     resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==}
 
@@ -4246,6 +4248,10 @@ packages:
   is-what@3.14.1:
     resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==}
 
+  is-what@5.5.0:
+    resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==}
+    engines: {node: '>=18'}
+
   is-windows@1.0.2:
     resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
     engines: {node: '>=0.10.0'}
@@ -4452,28 +4458,24 @@ packages:
     engines: {node: '>= 12.0.0'}
     cpu: [arm64]
     os: [linux]
-    libc: [glibc]
 
   lightningcss-linux-arm64-musl@1.31.1:
     resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==}
     engines: {node: '>= 12.0.0'}
     cpu: [arm64]
     os: [linux]
-    libc: [musl]
 
   lightningcss-linux-x64-gnu@1.31.1:
     resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==}
     engines: {node: '>= 12.0.0'}
     cpu: [x64]
     os: [linux]
-    libc: [glibc]
 
   lightningcss-linux-x64-musl@1.31.1:
     resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==}
     engines: {node: '>= 12.0.0'}
     cpu: [x64]
     os: [linux]
-    libc: [musl]
 
   lightningcss-win32-arm64-msvc@1.31.1:
     resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==}
@@ -5103,6 +5105,9 @@ packages:
   pathe@2.0.3:
     resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
 
+  perfect-debounce@1.0.0:
+    resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
+
   perfect-debounce@2.1.0:
     resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==}
 
@@ -5121,6 +5126,15 @@ packages:
     resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
     engines: {node: '>=6'}
 
+  pinia@3.0.4:
+    resolution: {integrity: sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==}
+    peerDependencies:
+      typescript: '>=4.5.0'
+      vue: ^3.5.11
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
   pkg-types@1.3.1:
     resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
 
@@ -5462,6 +5476,9 @@ packages:
     resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
     engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
 
+  rfdc@1.4.1:
+    resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
   rimraf@3.0.2:
     resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
     deprecated: Rimraf versions prior to v4 are no longer supported
@@ -5686,6 +5703,10 @@ packages:
   space-separated-tokens@2.0.2:
     resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
 
+  speakingurl@14.0.1:
+    resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
+    engines: {node: '>=0.10.0'}
+
   split-string@3.1.0:
     resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
     engines: {node: '>=0.10.0'}
@@ -5781,6 +5802,10 @@ packages:
       react-dom: '>= 16.8.0'
       react-is: '>= 16.8.0'
 
+  superjson@2.2.6:
+    resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==}
+    engines: {node: '>=16'}
+
   supports-color@2.0.0:
     resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
     engines: {node: '>=0.8.0'}
@@ -6366,17 +6391,17 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@babel/eslint-parser@7.19.1(@babel/core@7.28.6)(eslint@8.57.1)':
+  '@babel/eslint-parser@7.19.1(@babel/core@7.28.6)(eslint@9.39.1(jiti@2.6.1))':
     dependencies:
       '@babel/core': 7.28.6
       '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1
-      eslint: 8.57.1
+      eslint: 9.39.1(jiti@2.6.1)
       eslint-visitor-keys: 2.1.0
       semver: 6.3.1
 
   '@babel/eslint-plugin@7.27.1(@babel/eslint-parser@7.19.1(@babel/core@7.28.6)(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1))':
     dependencies:
-      '@babel/eslint-parser': 7.19.1(@babel/core@7.28.6)(eslint@8.57.1)
+      '@babel/eslint-parser': 7.19.1(@babel/core@7.28.6)(eslint@9.39.1(jiti@2.6.1))
       eslint: 9.39.1(jiti@2.6.1)
       eslint-rule-composer: 0.3.0
 
@@ -7992,13 +8017,13 @@ snapshots:
   '@flowgram.ai/eslint-config@1.0.7(@types/node@18.19.130)(jiti@2.6.1)(typescript@5.9.3)':
     dependencies:
       '@babel/core': 7.28.6
-      '@babel/eslint-parser': 7.19.1(@babel/core@7.28.6)(eslint@8.57.1)
+      '@babel/eslint-parser': 7.19.1(@babel/core@7.28.6)(eslint@9.39.1(jiti@2.6.1))
       '@babel/eslint-plugin': 7.27.1(@babel/eslint-parser@7.19.1(@babel/core@7.28.6)(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1))
       '@babel/preset-env': 7.20.2(@babel/core@7.28.6)
       '@babel/preset-react': 7.13.13(@babel/core@7.28.6)
       '@eslint/eslintrc': 3.3.3
       '@typescript-eslint/eslint-plugin': 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
-      '@typescript-eslint/parser': 8.50.0(eslint@8.57.1)(typescript@5.9.3)
+      '@typescript-eslint/parser': 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
       eslint: 9.39.1(jiti@2.6.1)
       eslint-config-prettier: 8.10.2(eslint@9.39.1(jiti@2.6.1))
       eslint-define-config: 1.12.0
@@ -9176,7 +9201,7 @@ snapshots:
   '@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
     dependencies:
       '@eslint-community/regexpp': 4.12.2
-      '@typescript-eslint/parser': 8.50.0(eslint@8.57.1)(typescript@5.9.3)
+      '@typescript-eslint/parser': 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
       '@typescript-eslint/scope-manager': 8.50.0
       '@typescript-eslint/type-utils': 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
       '@typescript-eslint/utils': 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
@@ -9189,27 +9214,27 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@8.50.0(eslint@8.57.1)(typescript@5.9.3)':
+  '@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2)':
     dependencies:
       '@typescript-eslint/scope-manager': 8.50.0
       '@typescript-eslint/types': 8.50.0
-      '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3)
+      '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.2)
       '@typescript-eslint/visitor-keys': 8.50.0
       debug: 4.4.3(supports-color@5.5.0)
-      eslint: 8.57.1
-      typescript: 5.9.3
+      eslint: 9.39.1(jiti@2.6.1)
+      typescript: 5.9.2
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2)':
+  '@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
     dependencies:
       '@typescript-eslint/scope-manager': 8.50.0
       '@typescript-eslint/types': 8.50.0
-      '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.2)
+      '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3)
       '@typescript-eslint/visitor-keys': 8.50.0
       debug: 4.4.3(supports-color@5.5.0)
       eslint: 9.39.1(jiti@2.6.1)
-      typescript: 5.9.2
+      typescript: 5.9.3
     transitivePeerDependencies:
       - supports-color
 
@@ -9334,7 +9359,7 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@umijs/openapi@1.14.1(chokidar@5.0.0)(typescript@5.9.3)':
+  '@umijs/openapi@1.14.1(typescript@5.9.3)':
     dependencies:
       chalk: 4.1.2
       cosmiconfig: 9.0.0(typescript@5.9.3)
@@ -9346,7 +9371,7 @@ snapshots:
       mockjs: 1.1.0
       node-fetch: 2.7.0
       number-to-words: 1.2.4
-      nunjucks: 3.2.4(chokidar@5.0.0)
+      nunjucks: 3.2.4
       openapi3-ts: 2.0.2
       prettier: 2.8.8
       reserved-words: 0.1.2
@@ -9360,13 +9385,13 @@ snapshots:
 
   '@ungap/structured-clone@1.3.0': {}
 
-  '@unocss/astro@66.6.0(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2))':
+  '@unocss/astro@66.6.0(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1))':
     dependencies:
       '@unocss/core': 66.6.0
       '@unocss/reset': 66.6.0
-      '@unocss/vite': 66.6.0(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2))
+      '@unocss/vite': 66.6.0(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1))
     optionalDependencies:
-      vite: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2)
+      vite: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)
 
   '@unocss/cli@66.6.0':
     dependencies:
@@ -9505,7 +9530,7 @@ snapshots:
     dependencies:
       '@unocss/core': 66.6.0
 
-  '@unocss/vite@66.6.0(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2))':
+  '@unocss/vite@66.6.0(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1))':
     dependencies:
       '@jridgewell/remapping': 2.3.5
       '@unocss/config': 66.6.0
@@ -9516,7 +9541,7 @@ snapshots:
       pathe: 2.0.3
       tinyglobby: 0.2.15
       unplugin-utils: 0.3.1
-      vite: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2)
+      vite: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)
 
   '@unrs/resolver-binding-android-arm-eabi@1.11.1':
     optional: true
@@ -9577,10 +9602,10 @@ snapshots:
   '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
     optional: true
 
-  '@vitejs/plugin-vue@6.0.3(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2))(vue@3.5.27(typescript@5.9.3))':
+  '@vitejs/plugin-vue@6.0.3(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1))(vue@3.5.27(typescript@5.9.3))':
     dependencies:
       '@rolldown/pluginutils': 1.0.0-beta.53
-      vite: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2)
+      vite: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)
       vue: 3.5.27(typescript@5.9.3)
 
   '@volar/language-core@2.4.27':
@@ -9669,6 +9694,24 @@ snapshots:
 
   '@vue/devtools-api@6.6.4': {}
 
+  '@vue/devtools-api@7.7.9':
+    dependencies:
+      '@vue/devtools-kit': 7.7.9
+
+  '@vue/devtools-kit@7.7.9':
+    dependencies:
+      '@vue/devtools-shared': 7.7.9
+      birpc: 2.9.0
+      hookable: 5.5.3
+      mitt: 3.0.1
+      perfect-debounce: 1.0.0
+      speakingurl: 14.0.1
+      superjson: 2.2.6
+
+  '@vue/devtools-shared@7.7.9':
+    dependencies:
+      rfdc: 1.4.1
+
   '@vue/language-core@3.2.2':
     dependencies:
       '@volar/language-core': 2.4.27
@@ -9960,6 +10003,8 @@ snapshots:
 
   bignumber.js@9.3.1: {}
 
+  birpc@2.9.0: {}
+
   bluebird@3.7.2: {}
 
   boolbase@1.0.0: {}
@@ -10148,6 +10193,10 @@ snapshots:
     dependencies:
       is-what: 3.14.1
 
+  copy-anything@4.0.5:
+    dependencies:
+      is-what: 5.5.0
+
   copy-descriptor@0.1.1: {}
 
   copy-text-to-clipboard@2.2.0: {}
@@ -10674,13 +10723,14 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  eslint-module-utils@2.12.1(@typescript-eslint/parser@8.50.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1):
+  eslint-module-utils@2.12.1(@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)):
     dependencies:
       debug: 3.2.7
     optionalDependencies:
-      '@typescript-eslint/parser': 8.50.0(eslint@8.57.1)(typescript@5.9.3)
-      eslint: 8.57.1
+      '@typescript-eslint/parser': 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+      eslint: 9.39.1(jiti@2.6.1)
       eslint-import-resolver-node: 0.3.9
+      eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1))
     transitivePeerDependencies:
       - supports-color
 
@@ -10700,7 +10750,7 @@ snapshots:
       doctrine: 2.1.0
       eslint: 8.57.1
       eslint-import-resolver-node: 0.3.9
-      eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.50.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)
+      eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1))
       hasown: 2.0.2
       is-core-module: 2.16.1
       is-glob: 4.0.3
@@ -10712,7 +10762,7 @@ snapshots:
       string.prototype.trimend: 1.0.9
       tsconfig-paths: 3.15.0
     optionalDependencies:
-      '@typescript-eslint/parser': 8.50.0(eslint@8.57.1)(typescript@5.9.3)
+      '@typescript-eslint/parser': 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
     transitivePeerDependencies:
       - eslint-import-resolver-typescript
       - eslint-import-resolver-webpack
@@ -11317,6 +11367,8 @@ snapshots:
     dependencies:
       react-is: 16.13.1
 
+  hookable@5.5.3: {}
+
   html-entities@2.6.0: {}
 
   html-void-elements@3.0.0: {}
@@ -11549,6 +11601,8 @@ snapshots:
 
   is-what@3.14.1: {}
 
+  is-what@5.5.0: {}
+
   is-windows@1.0.2: {}
 
   isarray@1.0.0: {}
@@ -11665,7 +11719,7 @@ snapshots:
     dependencies:
       language-subtag-registry: 0.3.23
 
-  less-loader@12.3.0(@rspack/core@1.7.3(@swc/helpers@0.5.18))(less@4.5.1):
+  less-loader@12.3.0(@rspack/core@1.7.3)(less@4.5.1):
     dependencies:
       less: 4.5.1
     optionalDependencies:
@@ -12429,13 +12483,11 @@ snapshots:
 
   number-to-words@1.2.4: {}
 
-  nunjucks@3.2.4(chokidar@5.0.0):
+  nunjucks@3.2.4:
     dependencies:
       a-sync-waterfall: 1.0.1
       asap: 2.0.6
       commander: 5.1.0
-    optionalDependencies:
-      chokidar: 5.0.0
 
   oas-kit-common@1.0.8:
     dependencies:
@@ -12636,6 +12688,8 @@ snapshots:
 
   pathe@2.0.3: {}
 
+  perfect-debounce@1.0.0: {}
+
   perfect-debounce@2.1.0: {}
 
   picocolors@1.1.1: {}
@@ -12647,6 +12701,13 @@ snapshots:
   pify@4.0.1:
     optional: true
 
+  pinia@3.0.4(typescript@5.9.3)(vue@3.5.27(typescript@5.9.3)):
+    dependencies:
+      '@vue/devtools-api': 7.7.9
+      vue: 3.5.27(typescript@5.9.3)
+    optionalDependencies:
+      typescript: 5.9.3
+
   pkg-types@1.3.1:
     dependencies:
       confbox: 0.1.8
@@ -13074,11 +13135,13 @@ snapshots:
 
   reusify@1.1.0: {}
 
+  rfdc@1.4.1: {}
+
   rimraf@3.0.2:
     dependencies:
       glob: 7.2.3
 
-  rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2):
+  rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1):
     dependencies:
       '@oxc-project/runtime': 0.97.0
       fdir: 6.5.0(picomatch@4.0.3)
@@ -13092,7 +13155,6 @@ snapshots:
       fsevents: 2.3.3
       jiti: 2.6.1
       less: 4.5.1
-      yaml: 1.10.2
 
   rolldown@1.0.0-beta.50:
     dependencies:
@@ -13337,6 +13399,8 @@ snapshots:
 
   space-separated-tokens@2.0.2: {}
 
+  speakingurl@14.0.1: {}
+
   split-string@3.1.0:
     dependencies:
       extend-shallow: 3.0.2
@@ -13468,6 +13532,10 @@ snapshots:
     transitivePeerDependencies:
       - '@babel/core'
 
+  superjson@2.2.6:
+    dependencies:
+      copy-anything: 4.0.5
+
   supports-color@2.0.0: {}
 
   supports-color@3.2.3:
@@ -13813,9 +13881,9 @@ snapshots:
 
   universalify@2.0.1: {}
 
-  unocss@66.6.0(postcss@5.2.18)(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2)):
+  unocss@66.6.0(postcss@5.2.18)(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)):
     dependencies:
-      '@unocss/astro': 66.6.0(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2))
+      '@unocss/astro': 66.6.0(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1))
       '@unocss/cli': 66.6.0
       '@unocss/core': 66.6.0
       '@unocss/postcss': 66.6.0(postcss@5.2.18)
@@ -13833,16 +13901,16 @@ snapshots:
       '@unocss/transformer-compile-class': 66.6.0
       '@unocss/transformer-directives': 66.6.0
       '@unocss/transformer-variant-group': 66.6.0
-      '@unocss/vite': 66.6.0(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2))
+      '@unocss/vite': 66.6.0(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1))
     optionalDependencies:
-      vite: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2)
+      vite: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)
     transitivePeerDependencies:
       - postcss
       - supports-color
 
-  unocss@66.6.0(postcss@8.5.6)(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2)):
+  unocss@66.6.0(postcss@8.5.6)(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)):
     dependencies:
-      '@unocss/astro': 66.6.0(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2))
+      '@unocss/astro': 66.6.0(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1))
       '@unocss/cli': 66.6.0
       '@unocss/core': 66.6.0
       '@unocss/postcss': 66.6.0(postcss@8.5.6)
@@ -13860,9 +13928,9 @@ snapshots:
       '@unocss/transformer-compile-class': 66.6.0
       '@unocss/transformer-directives': 66.6.0
       '@unocss/transformer-variant-group': 66.6.0
-      '@unocss/vite': 66.6.0(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2))
+      '@unocss/vite': 66.6.0(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1))
     optionalDependencies:
-      vite: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2)
+      vite: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)
     transitivePeerDependencies:
       - postcss
       - supports-color
@@ -13984,7 +14052,7 @@ snapshots:
       '@types/unist': 3.0.3
       vfile-message: 4.0.3
 
-  vite-plugin-svg-icons@2.0.1(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2)):
+  vite-plugin-svg-icons@2.0.1(rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)):
     dependencies:
       '@types/svgo': 2.6.4
       cors: 2.8.6
@@ -13994,7 +14062,7 @@ snapshots:
       pathe: 0.2.0
       svg-baker: 1.7.0
       svgo: 2.8.0
-      vite: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)(yaml@1.10.2)
+      vite: rolldown-vite@7.2.5(@types/node@24.10.9)(jiti@2.6.1)(less@4.5.1)
     transitivePeerDependencies:
       - supports-color