feat(stage-ui): add character card import and export (#1998)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
Doji
2026-07-08 14:14:43 +08:00
committed by GitHub
co-authored by autofix-ci[bot]
parent de0ff177ad
commit 5aa44aedd3
16 changed files with 777 additions and 105 deletions
+7 -1
View File
@@ -409,8 +409,14 @@ pages:
systemprompt: System Prompt
title: AIRI Card
try_different_search: Try a different search term
export: Export
exported: Card package exported
export_failed: Failed to export card package
imported: Card package imported
import_missing_file: Card package is missing required files
import_invalid_file: Card package file is invalid
upload: Upload
upload_desc: Click or drag file to upload
upload_desc: Click or drag an AIRI card package to import
memory:
description: Where memories got stored, and organized
title: Memory
+7 -1
View File
@@ -390,8 +390,14 @@ pages:
systemprompt: Prompt del Sistema
title: Tarjeta AIRI
try_different_search: Prueba un término de búsqueda diferente
export: Exportar
exported: Paquete de tarjeta exportado
export_failed: No se pudo exportar el paquete de tarjeta
imported: Paquete de tarjeta importado
import_missing_file: Al paquete de tarjeta le faltan archivos necesarios
import_invalid_file: El archivo del paquete de tarjeta no es válido
upload: Subir
upload_desc: Haz clic o arrastra el archivo para subir
upload_desc: Haz clic o arrastra un paquete de tarjeta AIRI para importar
memory:
description: Donde se almacenan y organizan las memorias
title: Memoria
+7 -1
View File
@@ -390,8 +390,14 @@ pages:
systemprompt: Prompt système
title: Carte AIRI
try_different_search: Essayez un autre terme de recherche
export: Exporter
exported: Paquet de carte exporté
export_failed: Impossible dexporter le paquet de carte
imported: Paquet de carte importé
import_missing_file: Le paquet de carte ne contient pas les fichiers requis
import_invalid_file: Le fichier du paquet de carte est invalide
upload: Téléverser
upload_desc: Cliquez ou glissez un fichier pour téléverser
upload_desc: Cliquez ou glissez un paquet de carte AIRI pour limporter
memory:
description: Endroit où les souvenirs sont stockés et organisés
title: Mémoire
+7 -1
View File
@@ -390,8 +390,14 @@ pages:
systemprompt: システムプロンプト
title: AIRIカード
try_different_search: 別の検索ワードを試してください
export: エクスポート
exported: カードパッケージをエクスポートしました
export_failed: カードパッケージのエクスポートに失敗しました
imported: カードパッケージをインポートしました
import_missing_file: カードパッケージに必要なファイルがありません
import_invalid_file: カードパッケージファイルが正しくありません
upload: アップロード
upload_desc: ファイルをアップロードするにはクリックまたはドラッグ
upload_desc: AIRI カードパッケージをクリックまたはドラッグしてインポート
memory:
description: 記憶が保存され、整理される場所
title: 記憶
+7 -1
View File
@@ -390,8 +390,14 @@ pages:
systemprompt: 시스템 프롬프트
title: AIRI 카드
try_different_search: 다른 검색어를 시도해보세요
export: 내보내기
exported: 카드 패키지를 내보냈습니다
export_failed: 카드 패키지를 내보내지 못했습니다
imported: 카드 패키지를 가져왔습니다
import_missing_file: 카드 패키지에 필요한 파일이 없습니다
import_invalid_file: 카드 패키지 파일이 올바르지 않습니다
upload: 업로드
upload_desc: 클릭 또는 파일을 드래그하여 업로드
upload_desc: AIRI 카드 패키지를 클릭하거나 드래그하여 가져오기
memory:
description: 기억이 저장되고 정리된 곳
title: 메모리
+7 -1
View File
@@ -390,8 +390,14 @@ pages:
systemprompt: Системный промпт
title: Карта AIRI
try_different_search: Попробуйте другой поисковый запрос
export: Экспорт
exported: Пакет карточки экспортирован
export_failed: Не удалось экспортировать пакет карточки
imported: Пакет карточки импортирован
import_missing_file: В пакете карточки отсутствуют необходимые файлы
import_invalid_file: Файл пакета карточки недействителен
upload: Загрузить
upload_desc: Нажмите или перетащите файл для загрузки
upload_desc: Нажмите или перетащите пакет карточки AIRI для импорта
memory:
description: Хранилище и организация воспоминаний
title: Память
+7 -1
View File
@@ -390,8 +390,14 @@ pages:
systemprompt: Lời nhắc hệ thống
title: Thẻ AIRI
try_different_search: Hãy thử từ khóa khác
export: Xuất
exported: Đã xuất gói thẻ
export_failed: Không thể xuất gói thẻ
imported: Đã nhập gói thẻ
import_missing_file: Gói thẻ thiếu tệp bắt buộc
import_invalid_file: Tệp gói thẻ không hợp lệ
upload: Tải lên
upload_desc: Bấm hoặc kéo thả tệp để tải lên
upload_desc: Bấm hoặc kéo thả gói thẻ AIRI để nhập
memory:
description: Nơi lưu trữ và tổ chức ký ức
title: Bộ nhớ
@@ -390,8 +390,14 @@ pages:
systemprompt: 系统提示词
title: AIRI 角色卡
try_different_search: 尝试使用其他关键词搜索
export: 导出
exported: 角色卡包已导出
export_failed: 角色卡包导出失败
imported: 角色卡包已导入
import_missing_file: 角色卡包缺少必要文件
import_invalid_file: 角色卡包文件错误
upload: 上传
upload_desc: 点击或拖拽文件到此处上传
upload_desc: 点击或拖拽 AIRI 角色卡包到此处导入
memory:
description: 存放记忆的地方,以及策略
title: 记忆体
@@ -390,8 +390,14 @@ pages:
systemprompt: 系統提示詞
title: AIRI 角色卡
try_different_search: 嘗試使用其他關鍵字搜尋
export: 匯出
exported: 角色卡包已匯出
export_failed: 角色卡包匯出失敗
imported: 角色卡包已匯入
import_missing_file: 角色卡包缺少必要檔案
import_invalid_file: 角色卡包檔案錯誤
upload: 上傳
upload_desc: 點擊或拖曳檔案到此處上傳
upload_desc: 點擊或拖曳 AIRI 角色卡包到此處匯入
memory:
description: 存放記憶的地方,以及策略
title: 記憶體
@@ -3,7 +3,10 @@ import type { AiriCard } from '@proj-airi/stage-ui/stores/modules/airi-card'
import DOMPurify from 'dompurify'
import { useDownload } from '@proj-airi/stage-ui/composables/download'
import { exportAiriCardPackage } from '@proj-airi/stage-ui/services/airi-card-import-export'
import { useBackgroundStore } from '@proj-airi/stage-ui/stores/background'
import { useDisplayModelsStore } from '@proj-airi/stage-ui/stores/display-models'
import { useAiriCardStore } from '@proj-airi/stage-ui/stores/modules/airi-card'
import { useConsciousnessStore } from '@proj-airi/stage-ui/stores/modules/consciousness'
import { useSpeechStore } from '@proj-airi/stage-ui/stores/modules/speech'
@@ -17,8 +20,9 @@ import {
DialogRoot,
DialogTitle,
} from 'reka-ui'
import { computed, ref, watch } from 'vue'
import { computed, ref, shallowRef, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import { toast } from 'vue-sonner'
import DeleteCardDialog from './DeleteCardDialog.vue'
@@ -39,6 +43,7 @@ const consciousnessStore = useConsciousnessStore()
const speechStore = useSpeechStore()
const visionStore = useVisionStore()
const backgroundStore = useBackgroundStore()
const displayModelsStore = useDisplayModelsStore()
const { removeCard } = cardStore
const { activeCardId } = storeToRefs(cardStore)
@@ -47,6 +52,7 @@ const { activeSpeechProvider: speechProvider, activeSpeechModel: defaultSpeechMo
const { activeProvider: visionProvider, activeModel: defaultVisionModel } = storeToRefs(visionStore)
const isRefreshingGallery = ref(false)
const isExportingCard = shallowRef(false)
// Get selected card data
const selectedCard = computed<AiriCard | undefined>(() => {
@@ -113,6 +119,27 @@ function handleActivate() {
}, 300)
}
async function handleExportCard() {
if (!selectedCard.value)
return
isExportingCard.value = true
try {
useDownload(
await exportAiriCardPackage({ card: selectedCard.value, displayModelsStore }),
`${selectedCard.value.name.trim()}.zip`,
).download()
toast(t('settings.pages.card.exported'))
}
catch (error) {
console.error('Error exporting card package:', error)
toast(t('settings.pages.card.export_failed'))
}
finally {
isExportingCard.value = false
}
}
function highlightTagToHtml(text: string) {
return DOMPurify.sanitize(text?.replace(/\{\{(.*?)\}\}/g, '<span class="bg-primary-500/20 inline-block">{{ $1 }}</span>').trim())
}
@@ -328,6 +355,13 @@ function getModuleDisplayValue(value: string | undefined, defaultValue: string |
<!-- Action buttons -->
<div flex="~ row" gap-2>
<Button
variant="secondary"
icon="i-solar:download-minimalistic-bold-duotone"
:label="t('settings.pages.card.export')"
:disabled="isExportingCard"
@click="handleExportCard"
/>
<!-- Activation button -->
<Button
variant="primary"
@@ -1,7 +1,7 @@
<script setup lang="ts">
import type { ccv3 } from '@proj-airi/ccc'
import { Alert } from '@proj-airi/stage-ui/components'
import { AiriCardPackageError, importAiriCardPackage } from '@proj-airi/stage-ui/services/airi-card-import-export'
import { useDisplayModelsStore } from '@proj-airi/stage-ui/stores/display-models'
import { useAiriCardStore } from '@proj-airi/stage-ui/stores/modules/airi-card'
import { InputFileCard } from '@proj-airi/ui'
import { ComboboxSelect } from '@proj-airi/ui/components/form'
@@ -9,6 +9,7 @@ import { storeToRefs } from 'pinia'
import { computed, ref, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import { useRoute, useRouter } from 'vue-router'
import { toast } from 'vue-sonner'
import CardCreate from './components/CardCreate.vue'
import CardCreationDialog from './components/CardCreationDialog.vue'
@@ -18,6 +19,7 @@ import DeleteCardDialog from './components/DeleteCardDialog.vue'
const { t } = useI18n()
const cardStore = useAiriCardStore()
const displayModelsStore = useDisplayModelsStore()
const { addCard, removeCard } = cardStore
const { cards, activeCardId } = storeToRefs(cardStore)
@@ -57,15 +59,17 @@ watch(inputFiles, async (newFiles) => {
return
try {
const content = await file.text()
const cardJSON = JSON.parse(content) as ccv3.CharacterCardV3
// Add card and select it
selectedCardId.value = addCard(cardJSON)
isCardDialogOpen.value = true
addCard(await importAiriCardPackage({ file, displayModelsStore }))
toast(t('settings.pages.card.imported'))
}
catch (error) {
console.error('Error processing card file:', error)
console.error('Error processing card package:', error)
toast(t(error instanceof AiriCardPackageError && error.code === 'missing-file'
? 'settings.pages.card.import_missing_file'
: 'settings.pages.card.import_invalid_file'))
}
finally {
inputFiles.value = []
}
})
@@ -267,7 +271,7 @@ function getModuleShortName(id: string, module: 'consciousness' | 'voice') {
:class="{ 'grid grid-cols-[repeat(auto-fill,minmax(280px,1fr))] gap-4 grid-auto-rows-[minmax(min-content,max-content)] grid-auto-flow-dense sm:grid-cols-[repeat(auto-fill,minmax(240px,1fr))] sm:gap-5 md:grid-cols-[repeat(auto-fill,minmax(220px,1fr))] lg:grid-cols-[repeat(auto-fill,minmax(250px,1fr))]': cards.size > 0 }"
>
<!-- Upload card -->
<InputFileCard v-model="inputFiles" accept="*.json">
<InputFileCard v-model="inputFiles" accept=".zip">
<template #default="{ isDragging }">
<template v-if="!isDragging">
<div flex flex-col items-center>
+2
View File
@@ -30,6 +30,7 @@
"./libs/inference": "./src/libs/inference/index.ts",
"./libs/*": "./src/libs/*.ts",
"./libs": "./src/libs/index.ts",
"./services/*": "./src/services/*.ts",
"./tools/mcp": "./src/tools/mcp.ts",
"./stores/providers/aliyun": "./src/stores/providers/aliyun/index.ts",
"./stores/analytics": "./src/stores/analytics/index.ts",
@@ -124,6 +125,7 @@
"hono": "catalog:",
"html2canvas": "catalog:",
"idb-keyval": "catalog:",
"jszip": "catalog:",
"kokoro-js": "catalog:",
"localforage": "catalog:",
"mediabunny": "catalog:",
@@ -0,0 +1,123 @@
import type { ccv3 } from '@proj-airi/ccc'
import type { AiriCard, AiriExtension } from '../stores/modules/airi-card'
import JSZip from 'jszip'
import { exportToJSON } from '@proj-airi/ccc'
import { createPinia, setActivePinia } from 'pinia'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { DisplayModelFormat, useDisplayModelsStore } from '../stores/display-models'
import { exportAiriCardPackage, importAiriCardPackage } from './airi-card-import-export'
describe('airi card package import/export', () => {
beforeEach(() => {
setActivePinia(createPinia())
vi.unstubAllGlobals()
})
it('exports sanitized packages and restores display models', async () => {
const displayModelsStore = useDisplayModelsStore()
const fetch = vi.fn(async () => new Response('preset-vrm-model'))
vi.stubGlobal('fetch', fetch)
vi.spyOn(displayModelsStore, 'getDisplayModel').mockResolvedValue({
id: 'preset-vrm-1',
format: DisplayModelFormat.VRM,
type: 'url' as const,
url: '/assets/avatar.vrm',
name: 'AvatarSample_A',
importedAt: 1,
})
mockAddDisplayModel(displayModelsStore, 'display-model-imported')
const exported = await exportAiriCardPackage({ card: createCard(), displayModelsStore })
const zip = await JSZip.loadAsync(await exported.arrayBuffer())
const cardJson = await readJson<ccv3.CharacterCardV3>(zip, 'card.json')
const imported = await importAiriCardPackage({ file: new File([exported], 'card.zip'), displayModelsStore })
const airi = airiFrom(cardJson)
expect(fetch).toHaveBeenCalledWith('/assets/avatar.vrm')
expect(await readJson(zip, 'manifest.json')).toMatchObject({ format: 'airi-character-card', version: 1, resources: { displayModel: { path: 'models/body-model.vrm', format: DisplayModelFormat.VRM, name: 'AvatarSample_A.vrm' } } })
expect(await zip.file('models/body-model.vrm')?.async('string')).toBe('preset-vrm-model')
expect(cardJson.data).toMatchObject({ name: 'AIRI / Test Card', creator: '', tags: [], mes_example: '' })
expect(airi.modules).toMatchObject({ consciousness: { provider: 'openai', model: 'gpt-4o' }, speech: { provider: 'elevenlabs', model: 'eleven', voice_id: 'alloy' } })
expect(airi.modules).not.toHaveProperty('activeBackgroundId')
expect(airi.modules.artistry).not.toHaveProperty('workflowId')
expect(airi.agents).toEqual({})
expect(displayModelsStore.addDisplayModel).toHaveBeenCalledWith(DisplayModelFormat.VRM, expect.objectContaining({ name: 'AvatarSample_A.vrm' }))
expect(airiFrom(imported).modules.displayModelId).toBe('display-model-imported')
})
it('classifies invalid packages', async () => {
const emptyZip = new JSZip()
const invalidJsonZip = new JSZip()
const displayModelsStore = useDisplayModelsStore()
invalidJsonZip.file('manifest.json', '{')
const cases = [
[new File(['not zip'], 'card.zip'), { code: 'invalid-file', message: 'Invalid zip file' }],
[new File([await emptyZip.generateAsync({ type: 'arraybuffer' })], 'empty.zip'), { code: 'missing-file' }],
[new File([await invalidJsonZip.generateAsync({ type: 'arraybuffer' })], 'invalid-json.zip'), { cause: expect.any(SyntaxError), code: 'invalid-file' }],
[await packageFile(exportToJSON(createCard()), { version: 2 }), { code: 'invalid-file' }],
] as const
for (const [file, expected] of cases)
await expect(importAiriCardPackage({ file, displayModelsStore })).rejects.toMatchObject(expected)
})
})
function mockAddDisplayModel(store: ReturnType<typeof useDisplayModelsStore>, id = 'unused') {
return vi.spyOn(store, 'addDisplayModel').mockImplementation(async (format, file) => ({
id,
format,
type: 'file' as const,
file,
name: file.name,
importedAt: 1,
}))
}
function createCard(displayModelId = 'preset-vrm-1'): AiriCard {
return {
name: 'AIRI / Test Card',
nickname: 'Tester',
version: '1.2.3',
description: 'Description',
creator: 'Hidden creator',
messageExample: [['{{user}}: hidden']],
tags: ['hidden'],
extensions: {
airi: {
modules: {
consciousness: { provider: 'openai', model: 'gpt-4o' },
vision: { provider: 'ollama', model: 'llava' },
speech: { provider: 'elevenlabs', model: 'eleven', voice_id: 'alloy', pitch: 1 },
displayModelId,
activeBackgroundId: 'background-secret',
artistry: { provider: 'replicate', model: 'flux', workflowId: 'workflow-secret' },
},
agents: { minecraft: { prompt: 'secret', enabled: true } },
},
},
}
}
async function packageFile(cardJson: ccv3.CharacterCardV3, manifestOverrides: Record<string, unknown> = {}) {
const zip = new JSZip()
zip.file('manifest.json', JSON.stringify({
format: 'airi-character-card',
version: 1,
card: { path: 'card.json', spec: 'chara_card_v3' },
...manifestOverrides,
}))
zip.file('card.json', JSON.stringify(cardJson))
return new File([await zip.generateAsync({ type: 'arraybuffer' })], 'card.zip')
}
async function readJson<T = Record<string, unknown>>(zip: JSZip, path: string): Promise<T> {
return JSON.parse(await zip.file(path)!.async('string')) as T
}
function airiFrom(card: ccv3.CharacterCardV3): AiriExtension {
return card.data.extensions.airi as AiriExtension
}
@@ -0,0 +1,269 @@
import type { Card, ccv3 } from '@proj-airi/ccc'
import type { GenericSchema, InferOutput } from 'valibot'
import type { DisplayModel, useDisplayModelsStore } from '../stores/display-models'
import type { AiriCard, AiriExtension } from '../stores/modules/airi-card'
import JSZip from 'jszip'
import { exportToJSON } from '@proj-airi/ccc'
import { array, literal, object, optional, parse, picklist, record, string, unknown as unknownSchema } from 'valibot'
import { DisplayModelFormat } from '../stores/display-models'
const FORMAT = 'airi-character-card'
const VERSION = 1
const CARD_PATH = 'card.json'
const MANIFEST_PATH = 'manifest.json'
const MODEL_EXT: Partial<Record<DisplayModelFormat, string>> = {
[DisplayModelFormat.Live2dZip]: 'zip',
[DisplayModelFormat.SpineZip]: 'zip',
[DisplayModelFormat.VRM]: 'vrm',
}
type DisplayModelsStore = ReturnType<typeof useDisplayModelsStore>
type ExportableCard = Card & { extensions: { airi: AiriExtension } }
const manifestSchema = object({
format: literal(FORMAT),
version: literal(VERSION),
card: object({ path: literal(CARD_PATH), spec: literal('chara_card_v3') }),
resources: optional(object({
displayModel: object({
path: string(),
format: picklist([DisplayModelFormat.Live2dZip, DisplayModelFormat.SpineZip, DisplayModelFormat.VRM]),
name: string(),
}),
})),
})
const characterCardV3Schema = object({
spec: literal('chara_card_v3'),
spec_version: literal('3.0'),
data: object({
name: string(),
nickname: optional(string()),
character_version: optional(string(), '1.0.0'),
description: optional(string(), ''),
personality: optional(string(), ''),
scenario: optional(string(), ''),
first_mes: optional(string(), ''),
alternate_greetings: optional(array(string()), []),
creator_notes: optional(string(), ''),
system_prompt: optional(string(), ''),
post_history_instructions: optional(string(), ''),
extensions: optional(record(string(), unknownSchema()), {}),
}),
})
type CharacterCardPackageJson = InferOutput<typeof characterCardV3Schema>
type AiriCardPackageErrorCode = 'missing-file' | 'invalid-file'
type Manifest = InferOutput<typeof manifestSchema>
export class AiriCardPackageError extends Error {
constructor(public readonly code: AiriCardPackageErrorCode, message: string, options?: { cause?: unknown }) {
super(message, options)
this.name = 'AiriCardPackageError'
}
}
/** Exports only the creation/edit form whitelist; provider globals and runtime state are never cloned. */
export async function exportAiriCardPackage({ card, displayModelsStore }: { card: AiriCard, displayModelsStore: DisplayModelsStore }): Promise<Blob> {
const exportableCard = cardFromAiriCard(card)
const displayModel = await exportDisplayModel(exportableCard, displayModelsStore)
const manifest = {
format: FORMAT,
version: VERSION,
createdAt: new Date().toISOString(),
card: { path: CARD_PATH, spec: 'chara_card_v3' },
...(displayModel ? { resources: { displayModel: displayModel.manifest } } : {}),
}
const zip = new JSZip()
zip.file(MANIFEST_PATH, JSON.stringify(manifest, null, 2))
zip.file(CARD_PATH, JSON.stringify(exportToJSON(exportableCard), null, 2))
if (displayModel)
zip.file(displayModel.manifest.path, displayModel.data)
return zip.generateAsync({ type: 'blob' })
}
/** Imports a package as sanitized CCv3 JSON; edited zip payloads cannot smuggle extra AIRI fields through. */
export async function importAiriCardPackage({ file, displayModelsStore }: { file: File, displayModelsStore: DisplayModelsStore }): Promise<ccv3.CharacterCardV3> {
const zip = await loadZip(file)
const manifest = await readJsonFile(zip, MANIFEST_PATH, manifestSchema)
const cardJson = await readJsonFile(zip, manifest.card.path, characterCardV3Schema)
const displayModelId = await importDisplayModel(zip, manifest, displayModelsStore)
return exportToJSON(cardFromCharacterCard(cardJson, displayModelId))
}
async function exportDisplayModel(card: ExportableCard, store: DisplayModelsStore) {
const displayModelId = card.extensions.airi.modules.displayModelId
if (!displayModelId)
return
const model = await store.getDisplayModel(displayModelId)
if (!model) {
if (displayModelId.startsWith('display-model-'))
throw error('invalid-file', 'Missing local display model')
return
}
const modelExt = MODEL_EXT[model.format]
if (!modelExt)
throw error('invalid-file', 'Unsupported or empty local display model')
const payload = await displayModelPayload(model)
return {
data: payload.data,
manifest: {
format: model.format,
name: payload.file.name,
path: `models/body-model.${modelExt}`,
},
}
}
async function importDisplayModel(zip: JSZip, manifest: Manifest, store: DisplayModelsStore) {
const resource = manifest.resources?.displayModel
if (!resource)
return
const file = zip.file(resource.path)
if (!file)
throw error('missing-file', 'Missing display model file')
try {
const data = await file.async('arraybuffer')
return (await store.addDisplayModel(resource.format, new File([data], resource.name))).id
}
catch (cause) {
throw error('invalid-file', 'Failed to import display model file', { cause })
}
}
async function loadZip(file: File) {
try {
return await JSZip.loadAsync(await file.arrayBuffer())
}
catch (cause) {
throw error('invalid-file', 'Invalid zip file', { cause })
}
}
async function readJsonFile<S extends GenericSchema>(zip: JSZip, path: string, schema: S): Promise<InferOutput<S>> {
const file = zip.file(path)
if (!file)
throw error('missing-file', `Missing ${path}`)
try {
return parse(schema, JSON.parse(await file.async('string')))
}
catch (cause) {
throw error('invalid-file', `Invalid ${path}`, { cause })
}
}
function cardFromAiriCard(card: AiriCard): ExportableCard {
return {
name: card.name,
nickname: card.nickname,
version: card.version,
description: card.description ?? '',
personality: card.personality ?? '',
scenario: card.scenario ?? '',
greetings: card.greetings ?? [],
notes: card.notes ?? '',
systemPrompt: card.systemPrompt ?? '',
postHistoryInstructions: card.postHistoryInstructions ?? '',
extensions: { airi: sanitizeAiri(card.extensions?.airi) },
}
}
function cardFromCharacterCard(card: CharacterCardPackageJson, displayModelId?: string): ExportableCard {
const data = card.data
return {
name: data.name,
nickname: data.nickname,
version: data.character_version,
description: data.description,
personality: data.personality,
scenario: data.scenario,
greetings: [data.first_mes, ...(data.alternate_greetings ?? [])],
notes: data.creator_notes,
systemPrompt: data.system_prompt,
postHistoryInstructions: data.post_history_instructions,
extensions: { airi: sanitizeAiri(data.extensions?.airi, displayModelId) },
}
}
function sanitizeAiri(value: unknown, displayModelIdOverride?: string): AiriExtension {
const source = isRecord(value) ? value : {}
const modules = isRecord(source.modules) ? source.modules : {}
const artistry = isRecord(modules.artistry) ? modules.artistry : {}
const speech = isRecord(modules.speech) ? modules.speech : {}
const displayModelId = displayModelIdOverride ?? stringValue(modules.displayModelId)
return {
modules: {
consciousness: providerModel(modules.consciousness),
vision: providerModel(modules.vision),
speech: {
...providerModel(modules.speech),
voice_id: stringValue(speech.voice_id),
},
...(displayModelId ? { displayModelId } : {}),
artistry: {
...(typeof artistry.provider === 'string' ? { provider: artistry.provider } : {}),
...(typeof artistry.model === 'string' ? { model: artistry.model } : {}),
...(typeof artistry.promptPrefix === 'string' ? { promptPrefix: artistry.promptPrefix } : {}),
...(typeof artistry.widgetInstruction === 'string' ? { widgetInstruction: artistry.widgetInstruction } : {}),
...(isSpawnMode(artistry.spawnMode) ? { spawnMode: artistry.spawnMode } : {}),
...(isRecord(artistry.options) ? { options: artistry.options } : {}),
...(typeof artistry.autonomousEnabled === 'boolean' ? { autonomousEnabled: artistry.autonomousEnabled } : {}),
...(typeof artistry.autonomousThreshold === 'number' ? { autonomousThreshold: artistry.autonomousThreshold } : {}),
},
},
agents: {},
}
}
function providerModel(value: unknown) {
const source = isRecord(value) ? value : {}
return { provider: stringValue(source.provider), model: stringValue(source.model) }
}
function isRecord(value: unknown): value is Record<string, unknown> {
return typeof value === 'object' && value !== null && !Array.isArray(value)
}
function stringValue(value: unknown) {
return typeof value === 'string' ? value : ''
}
function isSpawnMode(value: unknown): value is NonNullable<AiriExtension['modules']['artistry']>['spawnMode'] {
return value === 'bg' || value === 'widget' || value === 'inline' || value === 'bg_widget'
}
async function displayModelPayload(model: DisplayModel): Promise<{ data: ArrayBuffer, file: File }> {
try {
const response = model.type === 'url' ? await fetch(model.url) : undefined
if (response && !response.ok)
throw new Error(`Failed to read display model URL: ${response.status} ${response.statusText}`)
const file = model.type === 'file' ? model.file : new File([await response!.blob()], `${model.name}.${MODEL_EXT[model.format]}`)
if (file.size <= 0)
throw new Error('Display model file is empty')
return { data: await file.arrayBuffer(), file }
}
catch (cause) {
throw error('invalid-file', 'Failed to read display model file', { cause })
}
}
function error(code: AiriCardPackageErrorCode, message: string, options?: { cause?: unknown }) {
return new AiriCardPackageError(code, message, options)
}
@@ -34,6 +34,7 @@ describe('stage-ui exports contract', () => {
'./libs/*',
'./libs/inference',
'./libs/inference/adapters/*',
'./services/*',
'./stores',
'./stores/*',
'./stores/analytics',
@@ -62,6 +63,7 @@ describe('stage-ui exports contract', () => {
expect(exportsMap['./stores']).toBe('./src/stores/index.ts')
expect(exportsMap['./stores/*']).toBe('./src/stores/*.ts')
expect(exportsMap['./services/*']).toBe('./src/services/*.ts')
expect(exportsMap['./tools/mcp']).toBe('./src/tools/mcp.ts')
expect(exportsMap['./types']).toBe('./src/types/index.ts')
expect(exportsMap['./types/*']).toBe('./src/types/*.ts')
+269 -85
View File
@@ -971,7 +971,7 @@ catalogs:
version: 0.184.0
tinyexec:
specifier: ^1.1.1
version: 1.1.1
version: 1.2.4
tinyglobby:
specifier: ^0.2.16
version: 0.2.16
@@ -1287,7 +1287,7 @@ importers:
version: 19.11.0
tinyexec:
specifier: 'catalog:'
version: 1.1.1
version: 1.2.4
tsdown:
specifier: 'catalog:'
version: 0.21.9(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2))(publint@0.3.18)(synckit@0.11.12)(typescript@5.9.3)(unplugin-unused@0.5.7)(vue-tsc@3.2.6(typescript@5.9.3))
@@ -2257,7 +2257,7 @@ importers:
version: 3.0.2(electron@41.2.1)
'@electron-toolkit/tsconfig':
specifier: 'catalog:'
version: 2.0.0(@types/node@25.6.0)
version: 2.0.0(@types/node@24.12.2)
'@electron-toolkit/utils':
specifier: 'catalog:'
version: 4.0.0(electron@41.2.1)
@@ -2296,7 +2296,7 @@ importers:
version: 3.1.0
'@intlify/unplugin-vue-i18n':
specifier: 'catalog:'
version: 11.0.7(@vue/compiler-dom@3.5.32)(eslint@10.2.1(jiti@2.6.1))(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-i18n@11.3.2(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
version: 11.0.7(@vue/compiler-dom@3.5.32)(eslint@10.2.1(jiti@2.6.1))(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-i18n@11.3.2(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
'@modelcontextprotocol/sdk':
specifier: 'catalog:'
version: 1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6)
@@ -2332,10 +2332,10 @@ importers:
version: link:../../packages/ui-transitions
'@proj-airi/unplugin-fetch':
specifier: 'catalog:'
version: 0.2.3(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
version: 0.2.3(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
'@proj-airi/unplugin-live2d-sdk':
specifier: 'catalog:'
version: 0.1.7(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
version: 0.1.7(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
'@types/audioworklet':
specifier: 'catalog:'
version: 0.0.97
@@ -2362,7 +2362,7 @@ importers:
version: 2.10.3
'@vitejs/plugin-vue':
specifier: 'catalog:'
version: 6.0.6(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))
version: 6.0.6(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))
'@vue-macros/volar':
specifier: 'catalog:'
version: 3.1.2(typescript@5.9.3)(vue-tsc@3.2.6(typescript@5.9.3))(vue@3.5.32(typescript@5.9.3))
@@ -2395,7 +2395,7 @@ importers:
version: 6.8.3
electron-vite:
specifier: 'catalog:'
version: 5.0.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
version: 5.0.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
get-port-please:
specifier: 'catalog:'
version: 3.2.0
@@ -2416,31 +2416,31 @@ importers:
version: 2.2.6
unocss-preset-scrollbar:
specifier: 'catalog:'
version: 4.0.0(unocss@66.6.8(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))
version: 4.0.0(unocss@66.6.8(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))
unplugin-info:
specifier: 'catalog:'
version: 1.3.2(esbuild@0.27.2)(rollup@4.60.1)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
version: 1.3.2(esbuild@0.27.2)(rollup@4.60.1)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
unplugin-yaml:
specifier: 'catalog:'
version: 4.1.0(@nuxt/kit@3.20.2(magicast@0.5.2))(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
version: 4.1.0(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
vite:
specifier: 'catalog:'
version: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
version: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
vite-bundle-visualizer:
specifier: 'catalog:'
version: 1.2.1(rolldown@1.0.0-rc.16)(rollup@4.60.1)
vite-plugin-mkcert:
specifier: 'catalog:'
version: 2.0.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
version: 2.0.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
vite-plugin-vue-devtools:
specifier: 'catalog:'
version: 8.1.1(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))
version: 8.1.1(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))
vite-plugin-vue-layouts:
specifier: 'catalog:'
version: 0.11.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-router@5.0.4(@pinia/colada@1.2.1(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
version: 0.11.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-router@5.0.4(@pinia/colada@1.2.1(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
vue-macros:
specifier: 'catalog:'
version: 3.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@vueuse/core@14.2.1(vue@3.5.32(typescript@5.9.3)))(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.6(typescript@5.9.3))(vue@3.5.32(typescript@5.9.3))
version: 3.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@vueuse/core@14.2.1(vue@3.5.32(typescript@5.9.3)))(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.6(typescript@5.9.3))(vue@3.5.32(typescript@5.9.3))
vue-tsc:
specifier: 'catalog:'
version: 3.2.6(typescript@5.9.3)
@@ -3204,7 +3204,7 @@ importers:
version: 5.1.11
tinyexec:
specifier: 'catalog:'
version: 1.1.1
version: 1.2.4
vscode-ext-gen:
specifier: 'catalog:'
version: 1.6.0
@@ -3219,7 +3219,7 @@ importers:
version: 7.0.0
tinyexec:
specifier: 'catalog:'
version: 1.1.1
version: 1.2.4
packages/audio:
dependencies:
@@ -3277,7 +3277,7 @@ importers:
version: 7.0.0
tinyexec:
specifier: 'catalog:'
version: 1.1.1
version: 1.2.4
vite:
specifier: ^7.0.0 || ^8.0.0-beta.0
version: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
@@ -4181,6 +4181,9 @@ importers:
idb-keyval:
specifier: 'catalog:'
version: 6.2.2
jszip:
specifier: 'catalog:'
version: 3.10.1
kokoro-js:
specifier: 'catalog:'
version: 1.2.1
@@ -13539,9 +13542,6 @@ packages:
peerDependencies:
eslint: ^9.5.0 || ^10.0.0
eslint-flat-config-utils@3.1.0:
resolution: {integrity: sha512-lM+Nwo2CzpuTS/RASQExlEIwk/BQoKqJWX6VbDlLMb/mveqvt9MMrRXFEkG3bseuK6g8noKZLeX82epkILtv4A==}
eslint-flat-config-utils@3.2.0:
resolution: {integrity: sha512-PHgo1X5uqIorJONLVD9BIaOSdoYFD3z/AeJljdqDPlWVRpeCYkDbK9k0AXoYVqqNJr6FEYIEr5Rm2TSktLQcHw==}
@@ -13630,12 +13630,6 @@ packages:
peerDependencies:
eslint: ^8.45.0 || ^9.0.0 || ^10.0.0
eslint-plugin-perfectionist@5.8.0:
resolution: {integrity: sha512-k8uIptWIxkUclonCFGyDzgYs9NI+Qh0a7cUXS3L7IYZDEsjXuimFBVbxXPQQngWqMiaxJRwbtYB4smMGMqF+cw==}
engines: {node: ^20.0.0 || >=22.0.0}
peerDependencies:
eslint: ^8.45.0 || ^9.0.0 || ^10.0.0
eslint-plugin-pnpm@1.6.0:
resolution: {integrity: sha512-dxmt9r3zvPaft6IugS4i0k16xag3fTbOvm/road5uV9Y8qUCQT0xzheSh3gMlYAlC6vXRpfArBDsTZ7H7JKCbg==}
peerDependencies:
@@ -17751,10 +17745,6 @@ packages:
tinycolor2@1.6.0:
resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==}
tinyexec@1.1.1:
resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==}
engines: {node: '>=18'}
tinyexec@1.2.4:
resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==}
engines: {node: '>=18'}
@@ -19300,7 +19290,7 @@ snapshots:
cac: 7.0.0
eslint: 10.2.1(jiti@2.6.1)
eslint-config-flat-gitignore: 2.3.0(eslint@10.2.1(jiti@2.6.1))
eslint-flat-config-utils: 3.1.0
eslint-flat-config-utils: 3.2.0
eslint-merge-processors: 2.0.0(eslint@10.2.1(jiti@2.6.1))
eslint-plugin-antfu: 3.2.2(eslint@10.2.1(jiti@2.6.1))
eslint-plugin-command: 3.5.2(@typescript-eslint/rule-tester@8.56.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.63.0(typescript@5.9.3))(@typescript-eslint/utils@8.63.0(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))
@@ -19309,7 +19299,7 @@ snapshots:
eslint-plugin-jsonc: 3.1.2(eslint@10.2.1(jiti@2.6.1))
eslint-plugin-n: 17.24.0(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)
eslint-plugin-no-only-tests: 3.3.0
eslint-plugin-perfectionist: 5.8.0(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)
eslint-plugin-perfectionist: 5.10.0(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)
eslint-plugin-pnpm: 1.6.0(eslint@10.2.1(jiti@2.6.1))
eslint-plugin-regexp: 3.1.0(eslint@10.2.1(jiti@2.6.1))
eslint-plugin-toml: 1.3.1(eslint@10.2.1(jiti@2.6.1))
@@ -19340,13 +19330,13 @@ snapshots:
'@antfu/install-pkg@1.1.0':
dependencies:
package-manager-detector: 1.6.0
tinyexec: 1.1.1
tinyexec: 1.2.4
'@antfu/ni@30.0.0':
dependencies:
fzf: 0.5.2
package-manager-detector: 1.6.0
tinyexec: 1.1.1
tinyexec: 1.2.4
tinyglobby: 0.2.16
'@anthropic-ai/claude-code-darwin-arm64@2.1.114':
@@ -20730,9 +20720,9 @@ snapshots:
dependencies:
electron: 41.2.1
'@electron-toolkit/tsconfig@2.0.0(@types/node@25.6.0)':
'@electron-toolkit/tsconfig@2.0.0(@types/node@24.12.2)':
dependencies:
'@types/node': 25.6.0
'@types/node': 24.12.2
'@electron-toolkit/utils@4.0.0(electron@41.2.1)':
dependencies:
@@ -20864,7 +20854,7 @@ snapshots:
'@es-joy/jsdoccomment@0.84.0':
dependencies:
'@types/estree': 1.0.8
'@typescript-eslint/types': 8.58.1
'@typescript-eslint/types': 8.63.0
comment-parser: 1.4.5
esquery: 1.7.0
jsdoc-type-pratt-parser: 7.1.1
@@ -20872,7 +20862,7 @@ snapshots:
'@es-joy/jsdoccomment@0.86.0':
dependencies:
'@types/estree': 1.0.8
'@typescript-eslint/types': 8.58.1
'@typescript-eslint/types': 8.63.0
comment-parser: 1.4.6
esquery: 1.7.0
jsdoc-type-pratt-parser: 7.2.0
@@ -21624,8 +21614,8 @@ snapshots:
'@intlify/shared': 11.3.2
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.3.2)(@vue/compiler-dom@3.5.32)(vue-i18n@11.3.2(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
'@rollup/pluginutils': 5.3.0(rollup@2.80.0)
'@typescript-eslint/scope-manager': 8.58.1
'@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.63.0
'@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3)
debug: 4.4.3(supports-color@10.2.2)
fast-glob: 3.3.3
pathe: 2.0.3
@@ -21642,6 +21632,31 @@ snapshots:
- supports-color
- typescript
'@intlify/unplugin-vue-i18n@11.0.7(@vue/compiler-dom@3.5.32)(eslint@10.2.1(jiti@2.6.1))(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-i18n@11.3.2(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))':
dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1))
'@intlify/bundle-utils': 11.0.7(vue-i18n@11.3.2(vue@3.5.32(typescript@5.9.3)))
'@intlify/shared': 11.3.2
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.3.2)(@vue/compiler-dom@3.5.32)(vue-i18n@11.3.2(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
'@rollup/pluginutils': 5.3.0(rollup@4.60.1)
'@typescript-eslint/scope-manager': 8.63.0
'@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3)
debug: 4.4.3(supports-color@10.2.2)
fast-glob: 3.3.3
pathe: 2.0.3
picocolors: 1.1.1
unplugin: 2.3.11
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
vue: 3.5.32(typescript@5.9.3)
optionalDependencies:
vue-i18n: 11.3.2(vue@3.5.32(typescript@5.9.3))
transitivePeerDependencies:
- '@vue/compiler-dom'
- eslint
- rollup
- supports-color
- typescript
'@intlify/unplugin-vue-i18n@11.0.7(@vue/compiler-dom@3.5.32)(eslint@10.2.1(jiti@2.6.1))(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-i18n@11.3.2(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))':
dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1))
@@ -21649,8 +21664,8 @@ snapshots:
'@intlify/shared': 11.3.2
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.3.2)(@vue/compiler-dom@3.5.32)(vue-i18n@11.3.2(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
'@rollup/pluginutils': 5.3.0(rollup@4.60.1)
'@typescript-eslint/scope-manager': 8.58.1
'@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.63.0
'@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3)
debug: 4.4.3(supports-color@10.2.2)
fast-glob: 3.3.3
pathe: 2.0.3
@@ -23646,11 +23661,35 @@ snapshots:
transitivePeerDependencies:
- magicast
'@proj-airi/unplugin-fetch@0.2.3(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))':
dependencies:
ofetch: 1.5.1
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
'@proj-airi/unplugin-fetch@0.2.3(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))':
dependencies:
ofetch: 1.5.1
vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
'@proj-airi/unplugin-live2d-sdk@0.1.7(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)':
dependencies:
ofetch: 1.5.1
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
yauzl: 3.3.0
transitivePeerDependencies:
- '@types/node'
- '@vitejs/devtools'
- esbuild
- jiti
- less
- sass
- sass-embedded
- stylus
- sugarss
- terser
- tsx
- yaml
'@proj-airi/unplugin-live2d-sdk@0.1.7(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)':
dependencies:
ofetch: 1.5.1
@@ -24147,7 +24186,7 @@ snapshots:
'@stylistic/eslint-plugin@5.10.0(eslint@10.2.1(jiti@2.6.1))':
dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1))
'@typescript-eslint/types': 8.58.1
'@typescript-eslint/types': 8.63.0
eslint: 10.2.1(jiti@2.6.1)
eslint-visitor-keys: 4.2.1
espree: 10.4.0
@@ -24718,8 +24757,8 @@ snapshots:
'@typescript-eslint/project-service@8.51.0(typescript@5.9.3)':
dependencies:
'@typescript-eslint/tsconfig-utils': 8.58.1(typescript@5.9.3)
'@typescript-eslint/types': 8.58.1
'@typescript-eslint/tsconfig-utils': 8.63.0(typescript@5.9.3)
'@typescript-eslint/types': 8.63.0
debug: 4.4.3(supports-color@10.2.2)
typescript: 5.9.3
transitivePeerDependencies:
@@ -24727,7 +24766,7 @@ snapshots:
'@typescript-eslint/project-service@8.56.1(typescript@5.9.3)':
dependencies:
'@typescript-eslint/tsconfig-utils': 8.58.1(typescript@5.9.3)
'@typescript-eslint/tsconfig-utils': 8.63.0(typescript@5.9.3)
'@typescript-eslint/types': 8.63.0
debug: 4.4.3(supports-color@10.2.2)
typescript: 5.9.3
@@ -24736,8 +24775,8 @@ snapshots:
'@typescript-eslint/project-service@8.58.1(typescript@5.9.3)':
dependencies:
'@typescript-eslint/tsconfig-utils': 8.58.1(typescript@5.9.3)
'@typescript-eslint/types': 8.58.1
'@typescript-eslint/tsconfig-utils': 8.63.0(typescript@5.9.3)
'@typescript-eslint/types': 8.63.0
debug: 4.4.3(supports-color@10.2.2)
typescript: 5.9.3
transitivePeerDependencies:
@@ -24999,7 +25038,7 @@ snapshots:
'@unocss/eslint-plugin@66.6.8(@typescript-eslint/types@8.63.0)(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
'@typescript-eslint/types': 8.63.0
'@typescript-eslint/utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/utils': 8.63.0(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)
'@unocss/config': 66.6.8
'@unocss/core': 66.6.8
'@unocss/rule-utils': 66.6.8
@@ -25248,6 +25287,12 @@ snapshots:
transitivePeerDependencies:
- typescript
'@vitejs/plugin-vue@6.0.6(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))':
dependencies:
'@rolldown/pluginutils': 1.0.0-rc.13
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
vue: 3.5.32(typescript@5.9.3)
'@vitejs/plugin-vue@6.0.6(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))':
dependencies:
'@rolldown/pluginutils': 1.0.0-rc.13
@@ -25334,8 +25379,8 @@ snapshots:
'@vitest/eslint-plugin@1.6.15(@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.1.4)':
dependencies:
'@typescript-eslint/scope-manager': 8.58.1
'@typescript-eslint/utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.63.0
'@typescript-eslint/utils': 8.63.0(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)
eslint: 10.2.1(jiti@2.6.1)
optionalDependencies:
'@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.51.0(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)
@@ -25525,6 +25570,15 @@ snapshots:
transitivePeerDependencies:
- vue
'@vue-macros/devtools@3.1.2(typescript@5.9.3)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))':
dependencies:
sirv: 3.0.2
vue: 3.5.32(typescript@5.9.3)
optionalDependencies:
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
transitivePeerDependencies:
- typescript
'@vue-macros/devtools@3.1.2(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))':
dependencies:
sirv: 3.0.2
@@ -25947,7 +26001,7 @@ snapshots:
dependencies:
'@huggingface/transformers': 3.8.1
'@moeru/eventa': 0.3.0(electron@41.2.1)(h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.15)))
'@moeru/std': 0.1.0-beta.18
'@moeru/std': 0.1.0-beta.19
'@xsai-ext/shared-providers': 0.4.0-beta.12
'@xsai-transformers/shared': 0.1.0(electron@41.2.1)(h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.15)))
'@xsai/embed': 0.4.4
@@ -25961,7 +26015,7 @@ snapshots:
dependencies:
'@huggingface/transformers': 3.8.1
'@moeru/eventa': 0.3.0(electron@41.2.1)(h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.15)))
'@moeru/std': 0.1.0-beta.18
'@moeru/std': 0.1.0-beta.19
'@xsai-ext/shared-providers': 0.4.0-beta.12
'@xsai/shared': 0.4.4
onnxruntime-common: 1.24.3
@@ -25974,7 +26028,7 @@ snapshots:
dependencies:
'@huggingface/transformers': 3.8.1
'@moeru/eventa': 0.3.0(electron@41.2.1)(h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.15)))
'@moeru/std': 0.1.0-beta.18
'@moeru/std': 0.1.0-beta.19
'@xsai-ext/shared-providers': 0.4.0-beta.12
'@xsai-transformers/shared': 0.1.0(electron@41.2.1)(h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.15)))
'@xsai/embed': 0.4.4
@@ -26613,7 +26667,7 @@ snapshots:
jsonc-parser: 3.3.1
package-manager-detector: 1.6.0
semver: 7.7.4
tinyexec: 1.1.1
tinyexec: 1.2.4
tinyglobby: 0.2.16
unconfig: 7.5.0
yaml: 2.8.3
@@ -27602,7 +27656,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
electron-vite@5.0.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
electron-vite@5.0.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
'@babel/core': 7.29.0
'@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0)
@@ -27610,7 +27664,7 @@ snapshots:
esbuild: 0.25.12
magic-string: 0.30.21
picocolors: 1.1.1
vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
transitivePeerDependencies:
- supports-color
@@ -27914,11 +27968,6 @@ snapshots:
'@eslint/compat': 2.0.5(eslint@10.2.1(jiti@2.6.1))
eslint: 10.2.1(jiti@2.6.1)
eslint-flat-config-utils@3.1.0:
dependencies:
'@eslint/config-helpers': 0.5.5
pathe: 2.0.3
eslint-flat-config-utils@3.2.0:
dependencies:
'@eslint/config-helpers': 0.5.5
@@ -28034,15 +28083,6 @@ snapshots:
- supports-color
- typescript
eslint-plugin-perfectionist@5.8.0(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3):
dependencies:
'@typescript-eslint/utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)
eslint: 10.2.1(jiti@2.6.1)
natural-orderby: 5.0.0
transitivePeerDependencies:
- supports-color
- typescript
eslint-plugin-pnpm@1.6.0(eslint@10.2.1(jiti@2.6.1)):
dependencies:
empathic: 2.0.0
@@ -31040,7 +31080,7 @@ snapshots:
dependencies:
citty: 0.2.1
pathe: 2.0.3
tinyexec: 1.1.1
tinyexec: 1.2.4
oauth-sign@0.9.0: {}
@@ -33123,7 +33163,7 @@ snapshots:
pathe: 2.0.3
pnpm-workspace-yaml: 1.6.0
restore-cursor: 5.1.0
tinyexec: 1.1.1
tinyexec: 1.2.4
tinyglobby: 0.2.16
unconfig: 7.5.0
yaml: 2.8.3
@@ -33245,8 +33285,6 @@ snapshots:
tinycolor2@1.6.0: {}
tinyexec@1.1.1: {}
tinyexec@1.2.4: {}
tinyglobby@0.2.16:
@@ -33357,7 +33395,7 @@ snapshots:
rolldown: 1.0.0-rc.16
rolldown-plugin-dts: 0.23.2(oxc-resolver@11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2))(rolldown@1.0.0-rc.16)(typescript@5.9.3)(vue-tsc@3.2.6(typescript@5.9.3))
semver: 7.7.4
tinyexec: 1.1.1
tinyexec: 1.2.4
tinyglobby: 0.2.16
tree-kill: 1.2.2
unconfig-core: 7.5.0
@@ -33617,11 +33655,6 @@ snapshots:
'@unocss/preset-mini': 66.6.8
unocss: 66.6.8(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
unocss-preset-scrollbar@4.0.0(unocss@66.6.8(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))):
dependencies:
'@unocss/preset-mini': 66.6.8
unocss: 66.6.8(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
unocss@66.6.8(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
'@unocss/cli': 66.6.8
@@ -33688,6 +33721,14 @@ snapshots:
unplugin: 2.3.11
vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
unplugin-combine@2.3.0(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(unplugin@2.3.11)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
optionalDependencies:
esbuild: 0.27.2
rolldown: 1.0.0-rc.16
rollup: 4.60.1
unplugin: 2.3.11
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
unplugin-combine@2.3.0(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(unplugin@2.3.11)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
optionalDependencies:
esbuild: 0.27.2
@@ -33709,6 +33750,19 @@ snapshots:
transitivePeerDependencies:
- supports-color
unplugin-info@1.3.2(esbuild@0.27.2)(rollup@4.60.1)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
ci-info: 4.4.0
git-url-parse: 16.1.0
simple-git: 3.36.0
unplugin: 2.3.11
optionalDependencies:
esbuild: 0.27.2
rollup: 4.60.1
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
transitivePeerDependencies:
- supports-color
unplugin-info@1.3.2(esbuild@0.27.2)(rollup@4.60.1)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
ci-info: 4.4.0
@@ -33802,6 +33856,17 @@ snapshots:
rollup: 2.80.0
vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
unplugin-yaml@4.1.0(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
'@rollup/pluginutils': 5.3.0(rollup@4.60.1)
unplugin: 3.0.0
yaml: 2.8.3
optionalDependencies:
esbuild: 0.27.2
rolldown: 1.0.0-rc.16
rollup: 4.60.1
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
unplugin@2.3.11:
dependencies:
'@jridgewell/remapping': 2.3.5
@@ -34029,12 +34094,22 @@ snapshots:
- rollup
- supports-color
vite-dev-rpc@1.1.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
birpc: 2.9.0
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
vite-hot-client: 2.1.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
vite-dev-rpc@1.1.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
birpc: 2.9.0
vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
vite-hot-client: 2.1.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
vite-hot-client@2.1.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
vite-hot-client@2.1.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
@@ -34080,6 +34155,21 @@ snapshots:
- tsx
- yaml
vite-plugin-inspect@11.3.3(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
ansis: 4.2.0
debug: 4.4.3(supports-color@10.2.2)
error-stack-parser-es: 1.0.5
ohash: 2.0.11
open: 10.2.0
perfect-debounce: 2.1.0
sirv: 3.0.2
unplugin-utils: 0.3.1
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
vite-dev-rpc: 1.1.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
transitivePeerDependencies:
- supports-color
vite-plugin-inspect@11.3.3(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
ansis: 4.2.0
@@ -34111,6 +34201,13 @@ snapshots:
- typescript
- ws
vite-plugin-mkcert@2.0.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
debug: 4.4.3(supports-color@10.2.2)
supports-color: 10.2.2
undici: 8.1.0
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
vite-plugin-mkcert@2.0.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
debug: 4.4.3(supports-color@10.2.2)
@@ -34129,6 +34226,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
vite-plugin-vue-devtools@8.1.1(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3)):
dependencies:
'@vue/devtools-core': 8.1.1(vue@3.5.32(typescript@5.9.3))
'@vue/devtools-kit': 8.1.1
'@vue/devtools-shared': 8.1.1
sirv: 3.0.2
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
vite-plugin-inspect: 11.3.3(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
vite-plugin-vue-inspector: 5.3.2(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
transitivePeerDependencies:
- '@nuxt/kit'
- supports-color
- vue
vite-plugin-vue-devtools@8.1.1(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3)):
dependencies:
'@vue/devtools-core': 8.1.1(vue@3.5.32(typescript@5.9.3))
@@ -34143,6 +34254,21 @@ snapshots:
- supports-color
- vue
vite-plugin-vue-inspector@5.3.2(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
'@babel/core': 7.29.0
'@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.29.0)
'@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0)
'@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0)
'@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.29.0)
'@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.29.0)
'@vue/compiler-dom': 3.5.32
kolorist: 1.8.0
magic-string: 0.30.21
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
transitivePeerDependencies:
- supports-color
vite-plugin-vue-inspector@5.3.2(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
'@babel/core': 7.29.0
@@ -34158,6 +34284,16 @@ snapshots:
transitivePeerDependencies:
- supports-color
vite-plugin-vue-layouts@0.11.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-router@5.0.4(@pinia/colada@1.2.1(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)):
dependencies:
debug: 4.4.3(supports-color@10.2.2)
fast-glob: 3.3.3
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
vue: 3.5.32(typescript@5.9.3)
vue-router: 5.0.4(@pinia/colada@1.2.1(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
transitivePeerDependencies:
- supports-color
vite-plugin-vue-layouts@0.11.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-router@5.0.4(@pinia/colada@1.2.1(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)):
dependencies:
debug: 4.4.3(supports-color@10.2.2)
@@ -34299,7 +34435,7 @@ snapshots:
picomatch: 4.0.4
std-env: 4.1.0
tinybench: 2.9.0
tinyexec: 1.1.1
tinyexec: 1.2.4
tinyglobby: 0.2.16
tinyrainbow: 3.1.0
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
@@ -34330,7 +34466,7 @@ snapshots:
picomatch: 4.0.4
std-env: 4.1.0
tinybench: 2.9.0
tinyexec: 1.1.1
tinyexec: 1.2.4
tinyglobby: 0.2.16
tinyrainbow: 3.1.0
vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
@@ -34425,6 +34561,54 @@ snapshots:
- vue-tsc
- webpack
vue-macros@3.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@vueuse/core@14.2.1(vue@3.5.32(typescript@5.9.3)))(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.6(typescript@5.9.3))(vue@3.5.32(typescript@5.9.3)):
dependencies:
'@vue-macros/better-define': 3.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(vue@3.5.32(typescript@5.9.3))
'@vue-macros/boolean-prop': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/chain-call': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/common': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/config': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/define-emit': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/define-models': 3.1.2(@vueuse/core@14.2.1(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
'@vue-macros/define-prop': 3.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(vue@3.5.32(typescript@5.9.3))
'@vue-macros/define-props': 3.1.2(@vue-macros/reactivity-transform@3.1.2(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
'@vue-macros/define-props-refs': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/define-render': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/define-slots': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/define-stylex': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/devtools': 3.1.2(typescript@5.9.3)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
'@vue-macros/export-expose': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/export-props': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/export-render': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/hoist-static': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/jsx-directive': 3.1.2(typescript@5.9.3)
'@vue-macros/named-template': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/reactivity-transform': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/script-lang': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/setup-block': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/setup-component': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/setup-sfc': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/short-bind': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/short-emits': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/short-vmodel': 3.1.2(vue@3.5.32(typescript@5.9.3))
'@vue-macros/volar': 3.1.2(typescript@5.9.3)(vue-tsc@3.2.6(typescript@5.9.3))(vue@3.5.32(typescript@5.9.3))
unplugin: 2.3.11
unplugin-combine: 2.3.0(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(unplugin@2.3.11)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
unplugin-vue-define-options: 3.1.2(vue@3.5.32(typescript@5.9.3))
vue: 3.5.32(typescript@5.9.3)
transitivePeerDependencies:
- '@emnapi/core'
- '@emnapi/runtime'
- '@rspack/core'
- '@vueuse/core'
- esbuild
- rolldown
- rollup
- typescript
- vite
- vue-tsc
- webpack
vue-macros@3.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@vueuse/core@14.2.1(vue@3.5.32(typescript@5.9.3)))(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.6(typescript@5.9.3))(vue@3.5.32(typescript@5.9.3)):
dependencies:
'@vue-macros/better-define': 3.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(vue@3.5.32(typescript@5.9.3))