From 20355670a942d9f815d14f77d060a5fe8bcaefa7 Mon Sep 17 00:00:00 2001 From: RainbowBird Date: Sun, 26 Jul 2026 17:45:04 +0800 Subject: [PATCH] fix(stage-pages): sync active card sessions (#2110) --- packages/i18n/src/locales/en/settings.yaml | 2 + packages/i18n/src/locales/es/settings.yaml | 2 + packages/i18n/src/locales/fr/settings.yaml | 2 + packages/i18n/src/locales/ja/settings.yaml | 2 + packages/i18n/src/locales/ko/settings.yaml | 2 + packages/i18n/src/locales/ru/settings.yaml | 2 + packages/i18n/src/locales/vi/settings.yaml | 2 + .../i18n/src/locales/zh-Hans/settings.yaml | 2 + .../i18n/src/locales/zh-Hant/settings.yaml | 2 + .../components/CardCreationDialog.vue | 33 +++++-- .../src/pages/settings/airi-card/index.vue | 23 +++-- .../src/stores/chat/session-store.test.ts | 98 +++++++++++++++++++ .../stage-ui/src/stores/chat/session-store.ts | 40 ++++++++ .../src/stores/modules/airi-card.test.ts | 27 +++++ .../stage-ui/src/stores/modules/airi-card.ts | 15 ++- 15 files changed, 237 insertions(+), 17 deletions(-) diff --git a/packages/i18n/src/locales/en/settings.yaml b/packages/i18n/src/locales/en/settings.yaml index f58dbb9d1..2569f17f8 100644 --- a/packages/i18n/src/locales/en/settings.yaml +++ b/packages/i18n/src/locales/en/settings.yaml @@ -316,8 +316,10 @@ pages: activate: Activate active: Active active_badge: Currently Active + activation_notice: Switched to {name}. The current conversation now uses this character. cancel: Cancel action save: Save changes + save_and_activate: Save and activate card_not_found: Card not found character: Character close: Close diff --git a/packages/i18n/src/locales/es/settings.yaml b/packages/i18n/src/locales/es/settings.yaml index 92ec8eecd..119c06cda 100644 --- a/packages/i18n/src/locales/es/settings.yaml +++ b/packages/i18n/src/locales/es/settings.yaml @@ -301,8 +301,10 @@ pages: activate: Activar active: Activo active_badge: Actualmente Activo + activation_notice: Se cambió a {name}. La conversación actual ahora usa este personaje. cancel: Cancelar acción save: Guardar cambios + save_and_activate: Guardar y activar card_not_found: Tarjeta no encontrada character: Personaje close: Cerrar diff --git a/packages/i18n/src/locales/fr/settings.yaml b/packages/i18n/src/locales/fr/settings.yaml index 4d41a588d..ec1542690 100644 --- a/packages/i18n/src/locales/fr/settings.yaml +++ b/packages/i18n/src/locales/fr/settings.yaml @@ -301,8 +301,10 @@ pages: activate: Activer active: Actif active_badge: Actuellement actif + activation_notice: Passage à {name}. La conversation actuelle utilise maintenant ce personnage. cancel: Annuler l'action save: Enregistrer les modifications + save_and_activate: Enregistrer et activer card_not_found: Carte non trouvée character: Personnage close: Fermer diff --git a/packages/i18n/src/locales/ja/settings.yaml b/packages/i18n/src/locales/ja/settings.yaml index 8ed255a64..b82f9d330 100644 --- a/packages/i18n/src/locales/ja/settings.yaml +++ b/packages/i18n/src/locales/ja/settings.yaml @@ -301,8 +301,10 @@ pages: activate: 有効化 active: 有効 active_badge: 現在有効 + activation_notice: '{name} に切り替えました。現在の会話ではこのキャラクターが使用されます。' cancel: 操作の取消 save: 変更を保存 + save_and_activate: 保存して有効化 card_not_found: カードが見つかりません character: キャラクター close: 閉じる diff --git a/packages/i18n/src/locales/ko/settings.yaml b/packages/i18n/src/locales/ko/settings.yaml index fe63050d3..48852afa6 100644 --- a/packages/i18n/src/locales/ko/settings.yaml +++ b/packages/i18n/src/locales/ko/settings.yaml @@ -301,8 +301,10 @@ pages: activate: 활성화 active: 활성 active_badge: 현재 활성 상태 + activation_notice: '{name}(으)로 전환했습니다. 현재 대화에서 이 캐릭터를 사용합니다.' cancel: 작업 취소 save: 변경 사항 저장 + save_and_activate: 저장 및 활성화 card_not_found: 카드를 찾을 수 없음 character: 캐릭터 close: 닫기 diff --git a/packages/i18n/src/locales/ru/settings.yaml b/packages/i18n/src/locales/ru/settings.yaml index 1821f9f97..d9c3e407e 100644 --- a/packages/i18n/src/locales/ru/settings.yaml +++ b/packages/i18n/src/locales/ru/settings.yaml @@ -301,8 +301,10 @@ pages: activate: Активировать active: Активно active_badge: Текущая + activation_notice: Выбран персонаж {name}. Текущий разговор теперь использует его. cancel: Отменить действие save: Сохранить изменения + save_and_activate: Сохранить и активировать card_not_found: Карта не найдена character: Персонаж close: Закрыть diff --git a/packages/i18n/src/locales/vi/settings.yaml b/packages/i18n/src/locales/vi/settings.yaml index f1bb2d517..d1b86a700 100644 --- a/packages/i18n/src/locales/vi/settings.yaml +++ b/packages/i18n/src/locales/vi/settings.yaml @@ -301,8 +301,10 @@ pages: activate: Kích hoạt active: Đang hoạt động active_badge: Hiện đang hoạt động + activation_notice: Đã chuyển sang {name}. Cuộc trò chuyện hiện tại giờ sử dụng nhân vật này. cancel: Hủy thao tác save: Lưu thay đổi + save_and_activate: Lưu và kích hoạt card_not_found: Không tìm thấy thẻ character: Nhân vật close: Đóng diff --git a/packages/i18n/src/locales/zh-Hans/settings.yaml b/packages/i18n/src/locales/zh-Hans/settings.yaml index eb1eceb73..9e1c7719d 100644 --- a/packages/i18n/src/locales/zh-Hans/settings.yaml +++ b/packages/i18n/src/locales/zh-Hans/settings.yaml @@ -301,8 +301,10 @@ pages: activate: 激活 active: 已激活 active_badge: 当前使用中 + activation_notice: 已切换到 {name},当前会话将使用该角色。 cancel: 取消操作 save: 保存更改 + save_and_activate: 保存并激活 card_not_found: 未找到角色卡 character: 角色设定 close: 关闭 diff --git a/packages/i18n/src/locales/zh-Hant/settings.yaml b/packages/i18n/src/locales/zh-Hant/settings.yaml index 1d8941b86..8b10ff4fa 100644 --- a/packages/i18n/src/locales/zh-Hant/settings.yaml +++ b/packages/i18n/src/locales/zh-Hant/settings.yaml @@ -301,8 +301,10 @@ pages: activate: 啟用 active: 已啟用 active_badge: 目前使用中 + activation_notice: 已切換至 {name},目前對話將使用此角色。 cancel: 取消操作 save: 儲存變更 + save_and_activate: 儲存並啟用 card_not_found: 找不到角色卡 character: 角色設定 close: 關閉 diff --git a/packages/stage-pages/src/pages/settings/airi-card/components/CardCreationDialog.vue b/packages/stage-pages/src/pages/settings/airi-card/components/CardCreationDialog.vue index 1e54f1bcf..918c53066 100644 --- a/packages/stage-pages/src/pages/settings/airi-card/components/CardCreationDialog.vue +++ b/packages/stage-pages/src/pages/settings/airi-card/components/CardCreationDialog.vue @@ -77,6 +77,7 @@ const { activeProvider: defaultArtistryProvider } = storeToRefs(artistryStore) // Determine if we're in edit mode const isEditMode = computed(() => !!props.cardId) +const isEditingActiveCard = computed(() => isEditMode.value && props.cardId === cardStore.activeCardId) // Modules configuration const selectedConsciousnessProvider = ref('') @@ -303,7 +304,7 @@ watch(() => props.modelValue, (isOpen) => { const showError = ref(false) const errorMessage = ref('') -function saveCard(card: Card): boolean { +function saveCard(card: Card, activate: boolean): boolean { const draftResult = safeParseAiriCardDraft(toRaw(card), selectedArtistryConfigStr.value) if (!draftResult.success) { showError.value = true @@ -350,18 +351,24 @@ function saveCard(card: Card): boolean { } as AiriExtension, }, } + let savedCardId: string if (isEditMode.value && props.cardId) { // Edit mode: update existing card - cardStore.updateCard(props.cardId, cardWithModules) + if (!cardStore.updateCard(props.cardId, cardWithModules)) { + showError.value = true + errorMessage.value = t('settings.pages.card.card_not_found') + return false + } + savedCardId = props.cardId trackCardEdited({ card_id: props.cardId }) } else { - const newCardId = cardStore.addCard(cardWithModules, 'scratch') - // A new card becomes the runtime profile immediately so Create does not - // appear to succeed while conversations continue using the previous card. - cardStore.activeCardId = newCardId + savedCardId = cardStore.addCard(cardWithModules, 'scratch') } + if (activate) + cardStore.activeCardId = savedCardId + modelValue.value = false // Close this return true } @@ -690,11 +697,19 @@ function getDefaultPlaceholder(defaultValue: string | undefined): string { @click="modelValue = false" />