From de0ff177ad0206874748ee61d6d1e5e665f0fae0 Mon Sep 17 00:00:00 2001 From: Neko Date: Wed, 8 Jul 2026 12:27:39 +0800 Subject: [PATCH 01/24] chore: update sponsors svg (#2036) This PR updates generated SponsorKit assets from the scheduled sponsors workflow. Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- docs/content/public/assets/sponsors/sponsors.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/public/assets/sponsors/sponsors.json b/docs/content/public/assets/sponsors/sponsors.json index d9a4c78e3..2e3463ae9 100644 --- a/docs/content/public/assets/sponsors/sponsors.json +++ b/docs/content/public/assets/sponsors/sponsors.json @@ -19640,7 +19640,7 @@ } }, "isOneTime": false, - "monthlyDollars": 8, + "monthlyDollars": -1, "privacyLevel": "PUBLIC", "tierName": "Patreon", "createdAt": "2026-04-03T08:34:28.264+00:00", From 5aa44aedd3f62b717d55516022b071d04357028d Mon Sep 17 00:00:00 2001 From: Doji Date: Wed, 8 Jul 2026 14:14:43 +0800 Subject: [PATCH 02/24] feat(stage-ui): add character card import and export (#1998) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- packages/i18n/src/locales/en/settings.yaml | 8 +- packages/i18n/src/locales/es/settings.yaml | 8 +- packages/i18n/src/locales/fr/settings.yaml | 8 +- packages/i18n/src/locales/ja/settings.yaml | 8 +- packages/i18n/src/locales/ko/settings.yaml | 8 +- packages/i18n/src/locales/ru/settings.yaml | 8 +- packages/i18n/src/locales/vi/settings.yaml | 8 +- .../i18n/src/locales/zh-Hans/settings.yaml | 8 +- .../i18n/src/locales/zh-Hant/settings.yaml | 8 +- .../airi-card/components/CardDetailDialog.vue | 36 +- .../src/pages/settings/airi-card/index.vue | 24 +- packages/stage-ui/package.json | 2 + .../services/airi-card-import-export.test.ts | 123 ++++++ .../src/services/airi-card-import-export.ts | 269 +++++++++++++ .../src/stores/exports.contract.test.ts | 2 + pnpm-lock.yaml | 354 +++++++++++++----- 16 files changed, 777 insertions(+), 105 deletions(-) create mode 100644 packages/stage-ui/src/services/airi-card-import-export.test.ts create mode 100644 packages/stage-ui/src/services/airi-card-import-export.ts diff --git a/packages/i18n/src/locales/en/settings.yaml b/packages/i18n/src/locales/en/settings.yaml index 7a87cd105..ae8f3a334 100644 --- a/packages/i18n/src/locales/en/settings.yaml +++ b/packages/i18n/src/locales/en/settings.yaml @@ -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 diff --git a/packages/i18n/src/locales/es/settings.yaml b/packages/i18n/src/locales/es/settings.yaml index cc5b62beb..7589fbb4f 100644 --- a/packages/i18n/src/locales/es/settings.yaml +++ b/packages/i18n/src/locales/es/settings.yaml @@ -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 diff --git a/packages/i18n/src/locales/fr/settings.yaml b/packages/i18n/src/locales/fr/settings.yaml index 3354d610a..175b48767 100644 --- a/packages/i18n/src/locales/fr/settings.yaml +++ b/packages/i18n/src/locales/fr/settings.yaml @@ -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 d’exporter 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 l’importer memory: description: Endroit où les souvenirs sont stockés et organisés title: Mémoire diff --git a/packages/i18n/src/locales/ja/settings.yaml b/packages/i18n/src/locales/ja/settings.yaml index 7109c6277..070e87714 100644 --- a/packages/i18n/src/locales/ja/settings.yaml +++ b/packages/i18n/src/locales/ja/settings.yaml @@ -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: 記憶 diff --git a/packages/i18n/src/locales/ko/settings.yaml b/packages/i18n/src/locales/ko/settings.yaml index d50ce4c70..9c12ae0cd 100644 --- a/packages/i18n/src/locales/ko/settings.yaml +++ b/packages/i18n/src/locales/ko/settings.yaml @@ -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: 메모리 diff --git a/packages/i18n/src/locales/ru/settings.yaml b/packages/i18n/src/locales/ru/settings.yaml index 39306a24d..57df40151 100644 --- a/packages/i18n/src/locales/ru/settings.yaml +++ b/packages/i18n/src/locales/ru/settings.yaml @@ -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: Память diff --git a/packages/i18n/src/locales/vi/settings.yaml b/packages/i18n/src/locales/vi/settings.yaml index a8c0c3467..c1a68ee2d 100644 --- a/packages/i18n/src/locales/vi/settings.yaml +++ b/packages/i18n/src/locales/vi/settings.yaml @@ -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ớ diff --git a/packages/i18n/src/locales/zh-Hans/settings.yaml b/packages/i18n/src/locales/zh-Hans/settings.yaml index f589d0e95..ced328f92 100644 --- a/packages/i18n/src/locales/zh-Hans/settings.yaml +++ b/packages/i18n/src/locales/zh-Hans/settings.yaml @@ -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: 记忆体 diff --git a/packages/i18n/src/locales/zh-Hant/settings.yaml b/packages/i18n/src/locales/zh-Hant/settings.yaml index fa67317c9..4ffe22b16 100644 --- a/packages/i18n/src/locales/zh-Hant/settings.yaml +++ b/packages/i18n/src/locales/zh-Hant/settings.yaml @@ -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: 記憶體 diff --git a/packages/stage-pages/src/pages/settings/airi-card/components/CardDetailDialog.vue b/packages/stage-pages/src/pages/settings/airi-card/components/CardDetailDialog.vue index c47738aff..a87a25a86 100644 --- a/packages/stage-pages/src/pages/settings/airi-card/components/CardDetailDialog.vue +++ b/packages/stage-pages/src/pages/settings/airi-card/components/CardDetailDialog.vue @@ -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(() => { @@ -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, '{{ $1 }}').trim()) } @@ -328,6 +355,13 @@ function getModuleDisplayValue(value: string | undefined, defaultValue: string |
+