From 2c1e223c8dd813d7c74a324d7fd7399fbf47e8bf Mon Sep 17 00:00:00 2001 From: Neko Ayaka Date: Sun, 30 Aug 2026 02:31:30 +0800 Subject: [PATCH] release: v0.12.0-beta.5 --- .../android/app-version.properties | 4 +- .../ios/App/App.xcodeproj/project.pbxproj | 4 +- apps/stage-tamagotchi/package.json | 2 +- docs/package.json | 2 +- engines/stage-tamagotchi-godot/package.json | 2 +- integrations/twitter-services/package.json | 2 +- .../vscode/airi-plugin-vscode/package.json | 2 +- integrations/vscode/vscode-airi/package.json | 2 +- package.json | 2 +- packages/better-ws/package.json | 2 +- packages/cap-vite/package.json | 2 +- packages/core-agent/package.json | 2 +- packages/core-character/package.json | 2 +- packages/electron-eventa/package.json | 2 +- packages/electron-screen-capture/package.json | 2 +- packages/electron-vueuse/package.json | 2 +- packages/font-chillroundm/package.json | 2 +- packages/font-cjkfonts-allseto/package.json | 2 +- packages/font-departure-mono/package.json | 2 +- packages/font-xiaolai/package.json | 2 +- packages/input-gamepad-vueuse/package.json | 2 +- packages/input-gamepad/package.json | 2 +- .../package.json | 2 +- packages/memory-pgvector/package.json | 2 +- packages/model-driver-lipsync/package.json | 2 +- .../model-driver-magic-live2d/package.json | 2 +- packages/motion-driver-magic/package.json | 2 +- packages/pipelines-audio/package.json | 2 +- .../llm-streaming-control/payloads.test.ts | 8 ++++ packages/plugin-protocol/package.json | 2 +- packages/plugin-sdk-tamagotchi/package.json | 2 +- packages/plugin-sdk/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- packages/server-runtime/package.json | 2 +- packages/server-sdk/package.json | 2 +- packages/server-shared/package.json | 2 +- .../src/utils/live2d-zip-loader.test.ts | 48 +++++++++++++++++++ packages/stage-ui/package.json | 2 +- .../src/stores/modules/airi-card.test.ts | 26 ++++++++++ packages/stream-kit/package.json | 2 +- packages/testing-audio/package.json | 2 +- packages/ui/package.json | 2 +- packages/unocss-preset-fonts/package.json | 2 +- packages/vitest-plugin-fakemic/package.json | 2 +- .../airi-plugin-bilibili-laplace/package.json | 2 +- plugins/airi-plugin-claude-code/package.json | 2 +- plugins/airi-plugin-game-chess/package.json | 2 +- .../airi-plugin-homeassistant/package.json | 2 +- .../airi-plugin-web-extension/package.json | 2 +- server/apps/api/package.json | 2 +- server/apps/auth/package.json | 2 +- server/packages/auth-shared/package.json | 2 +- .../packages/server-sdk-shared/package.json | 2 +- services/computer-use-mcp/package.json | 2 +- 55 files changed, 136 insertions(+), 54 deletions(-) diff --git a/apps/stage-pocket/android/app-version.properties b/apps/stage-pocket/android/app-version.properties index b1f8f9242..094e83b0c 100644 --- a/apps/stage-pocket/android/app-version.properties +++ b/apps/stage-pocket/android/app-version.properties @@ -1,2 +1,2 @@ -AIRI_VERSION_NAME=0.12.0-beta.4 -AIRI_VERSION_CODE=20 +AIRI_VERSION_NAME=0.12.0-beta.5 +AIRI_VERSION_CODE=21 diff --git a/apps/stage-pocket/ios/App/App.xcodeproj/project.pbxproj b/apps/stage-pocket/ios/App/App.xcodeproj/project.pbxproj index d2030c59e..22e70cc4d 100644 --- a/apps/stage-pocket/ios/App/App.xcodeproj/project.pbxproj +++ b/apps/stage-pocket/ios/App/App.xcodeproj/project.pbxproj @@ -321,7 +321,7 @@ ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 24; + CURRENT_PROJECT_VERSION = 25; DEVELOPMENT_TEAM = 433DLLA855; INFOPLIST_FILE = App/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = AIRI; @@ -349,7 +349,7 @@ ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CODE_SIGN_IDENTITY = "Apple Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 24; + CURRENT_PROJECT_VERSION = 25; DEVELOPMENT_TEAM = 433DLLA855; INFOPLIST_FILE = App/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = AIRI; diff --git a/apps/stage-tamagotchi/package.json b/apps/stage-tamagotchi/package.json index f8b4a3658..3b2015675 100644 --- a/apps/stage-tamagotchi/package.json +++ b/apps/stage-tamagotchi/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/stage-tamagotchi", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "LLM powered virtual character", "author": { diff --git a/docs/package.json b/docs/package.json index f98bf4ed4..267e05194 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/docs", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "scripts": { "build": "vitepress build", diff --git a/engines/stage-tamagotchi-godot/package.json b/engines/stage-tamagotchi-godot/package.json index fee2c0357..7e8532b42 100644 --- a/engines/stage-tamagotchi-godot/package.json +++ b/engines/stage-tamagotchi-godot/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/stage-tamagotchi-godot", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Godot-native desktop stage runtime workspace engine for stage-tamagotchi", "author": { diff --git a/integrations/twitter-services/package.json b/integrations/twitter-services/package.json index b8ec69889..005d544b7 100644 --- a/integrations/twitter-services/package.json +++ b/integrations/twitter-services/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/twitter-services", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Twitter Services for MCP", "author": "RainbowBird ", diff --git a/integrations/vscode/airi-plugin-vscode/package.json b/integrations/vscode/airi-plugin-vscode/package.json index c495e8a50..d677e54da 100644 --- a/integrations/vscode/airi-plugin-vscode/package.json +++ b/integrations/vscode/airi-plugin-vscode/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/airi-plugin-vscode", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "AIRI host plugin that bridges VS Code context and UI", "repository": { diff --git a/integrations/vscode/vscode-airi/package.json b/integrations/vscode/vscode-airi/package.json index 79fb248c4..504b79937 100644 --- a/integrations/vscode/vscode-airi/package.json +++ b/integrations/vscode/vscode-airi/package.json @@ -3,7 +3,7 @@ "name": "vscode-airi", "displayName": "AIRI VSCode adapter", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Adapter that connects VSCode into Project AIRI", "repository": { diff --git a/package.json b/package.json index b0e54b790..fac4a2e06 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/root", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "packageManager": "pnpm@11.24.0", "description": "LLM powered virtual character", diff --git a/packages/better-ws/package.json b/packages/better-ws/package.json index 245e8583c..35e30f78f 100644 --- a/packages/better-ws/package.json +++ b/packages/better-ws/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/better-ws", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Transport-agnostic reliable WebSocket runtime primitives", "author": { diff --git a/packages/cap-vite/package.json b/packages/cap-vite/package.json index 3221752b0..4eb21bb97 100644 --- a/packages/cap-vite/package.json +++ b/packages/cap-vite/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/cap-vite", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "description": "CLI that starts a Vite dev server and runs Capacitor live reload", "author": { "name": "Moeru AI Project AIRI Team", diff --git a/packages/core-agent/package.json b/packages/core-agent/package.json index bd70e26f8..42c633761 100644 --- a/packages/core-agent/package.json +++ b/packages/core-agent/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/core-agent", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Core agent runtime orchestration for AIRI", "author": { diff --git a/packages/core-character/package.json b/packages/core-character/package.json index f75ccfdde..6dfe5a8cc 100644 --- a/packages/core-character/package.json +++ b/packages/core-character/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/core-character", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Core character pipeline orchestration for AIRI (segmentation, emotion, delay, optional TTS)", "author": { diff --git a/packages/electron-eventa/package.json b/packages/electron-eventa/package.json index 31c38b5ed..406c95eab 100644 --- a/packages/electron-eventa/package.json +++ b/packages/electron-eventa/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/electron-eventa", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Shared Eventa contracts for Electron IPC", "author": { diff --git a/packages/electron-screen-capture/package.json b/packages/electron-screen-capture/package.json index 1072edb18..d97b5175f 100644 --- a/packages/electron-screen-capture/package.json +++ b/packages/electron-screen-capture/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/electron-screen-capture", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Screen capture", "author": { diff --git a/packages/electron-vueuse/package.json b/packages/electron-vueuse/package.json index 1a92b46ef..f3d468ef1 100644 --- a/packages/electron-vueuse/package.json +++ b/packages/electron-vueuse/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/electron-vueuse", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "VueUse-like composables and helpers for Electron apps", "author": { diff --git a/packages/font-chillroundm/package.json b/packages/font-chillroundm/package.json index a203d5c39..e4a0985c9 100644 --- a/packages/font-chillroundm/package.json +++ b/packages/font-chillroundm/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/font-chillroundm", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "description": "Essential CSS for font, ChillRoundM (a.k.a. 寒蝉半圆体), used by Project AIRI", "author": { "name": "Warren2060", diff --git a/packages/font-cjkfonts-allseto/package.json b/packages/font-cjkfonts-allseto/package.json index 46b643505..84157f384 100644 --- a/packages/font-cjkfonts-allseto/package.json +++ b/packages/font-cjkfonts-allseto/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/font-cjkfonts-allseto", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "description": "Essential CSS for font, cjkfonts 全瀨體, used by Project AIRI", "author": { "name": "Creators of cjkFonts", diff --git a/packages/font-departure-mono/package.json b/packages/font-departure-mono/package.json index 639f898c6..9cd126239 100644 --- a/packages/font-departure-mono/package.json +++ b/packages/font-departure-mono/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/font-departure-mono", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "description": "Essential CSS for font, Departure Mono, used by Project AIRI", "author": { "name": "Tobias Fried", diff --git a/packages/font-xiaolai/package.json b/packages/font-xiaolai/package.json index 8d9898b75..23cd4d69a 100644 --- a/packages/font-xiaolai/package.json +++ b/packages/font-xiaolai/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/font-xiaolai", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "description": "Essential CSS for font, Xiaolai (小赖字体 / 小賴字體 / シャオライ / Xiaolai Font), used by Project AIRI", "author": { "name": "ʟxɢᴡ", diff --git a/packages/input-gamepad-vueuse/package.json b/packages/input-gamepad-vueuse/package.json index 4f31fbde6..e3c0c176e 100644 --- a/packages/input-gamepad-vueuse/package.json +++ b/packages/input-gamepad-vueuse/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/input-gamepad-vueuse", "type": "module", - "version": "0.12.0-beta.1", + "version": "0.12.0-beta.5", "private": true, "description": "Vue composables for AIRI gamepad input", "author": { diff --git a/packages/input-gamepad/package.json b/packages/input-gamepad/package.json index 52738cb25..53e5bf20b 100644 --- a/packages/input-gamepad/package.json +++ b/packages/input-gamepad/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/input-gamepad", "type": "module", - "version": "0.12.0-beta.1", + "version": "0.12.0-beta.5", "private": true, "description": "Standard Gamepad API input for AIRI", "author": { diff --git a/packages/input-playstation-dualsense-5/package.json b/packages/input-playstation-dualsense-5/package.json index 1f47462dc..96db7f359 100644 --- a/packages/input-playstation-dualsense-5/package.json +++ b/packages/input-playstation-dualsense-5/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/input-playstation-dualsense-5", "type": "module", - "version": "0.12.0-beta.1", + "version": "0.12.0-beta.5", "private": true, "description": "WebHID input and output support for the PlayStation 5 DualSense controller", "author": { diff --git a/packages/memory-pgvector/package.json b/packages/memory-pgvector/package.json index b5ed03e9e..7029c665c 100644 --- a/packages/memory-pgvector/package.json +++ b/packages/memory-pgvector/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/memory-pgvector", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "", "author": { diff --git a/packages/model-driver-lipsync/package.json b/packages/model-driver-lipsync/package.json index a598fb57a..dc4e64226 100644 --- a/packages/model-driver-lipsync/package.json +++ b/packages/model-driver-lipsync/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/model-driver-lipsync", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "exports": { ".": "./src/index.ts", diff --git a/packages/model-driver-magic-live2d/package.json b/packages/model-driver-magic-live2d/package.json index 39fdb94e7..2002c4469 100644 --- a/packages/model-driver-magic-live2d/package.json +++ b/packages/model-driver-magic-live2d/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/model-driver-magic-live2d", "type": "module", - "version": "0.12.0-beta.1", + "version": "0.12.0-beta.5", "private": true, "description": "Live2D model driver for MAGIC motion", "author": { diff --git a/packages/motion-driver-magic/package.json b/packages/motion-driver-magic/package.json index 8517fbbec..3e39c9dc2 100644 --- a/packages/motion-driver-magic/package.json +++ b/packages/motion-driver-magic/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/motion-driver-magic", "type": "module", - "version": "0.12.0-beta.1", + "version": "0.12.0-beta.5", "private": true, "description": "Markovian Animation Generator with Illusory Conditioning for Project AIRI", "author": { diff --git a/packages/pipelines-audio/package.json b/packages/pipelines-audio/package.json index 9ad5f65c0..ab9fed877 100644 --- a/packages/pipelines-audio/package.json +++ b/packages/pipelines-audio/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/pipelines-audio", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Audio pipeline orchestration for AIRI (capture, VAD, encode, stream)", "author": { diff --git a/packages/pipelines-audio/src/llm-streaming-control/payloads.test.ts b/packages/pipelines-audio/src/llm-streaming-control/payloads.test.ts index 00d43ea74..bb2ffbcdf 100644 --- a/packages/pipelines-audio/src/llm-streaming-control/payloads.test.ts +++ b/packages/pipelines-audio/src/llm-streaming-control/payloads.test.ts @@ -45,4 +45,12 @@ describe('normalizeActPayload', () => { emotion: { name: 'happy', intensity: 1 }, }) }) + + it('normalizes an expression name from an ACT payload', () => { + expect(normalizeActPayload({ + expression: ' smile ', + })).toEqual({ + expression: 'smile', + }) + }) }) diff --git a/packages/plugin-protocol/package.json b/packages/plugin-protocol/package.json index e5f37d9b9..3af4fa853 100644 --- a/packages/plugin-protocol/package.json +++ b/packages/plugin-protocol/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/plugin-protocol", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "description": "Plugin protocol event definitions and shared websocket types for Project AIRI", "author": { "name": "Moeru AI Project AIRI Team", diff --git a/packages/plugin-sdk-tamagotchi/package.json b/packages/plugin-sdk-tamagotchi/package.json index 5dd18d44c..9693c3934 100644 --- a/packages/plugin-sdk-tamagotchi/package.json +++ b/packages/plugin-sdk-tamagotchi/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/plugin-sdk-tamagotchi", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Tamagotchi-specific DX helpers for Project AIRI plugins", "author": { diff --git a/packages/plugin-sdk/package.json b/packages/plugin-sdk/package.json index df16c6975..f94cdd4c0 100644 --- a/packages/plugin-sdk/package.json +++ b/packages/plugin-sdk/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/plugin-sdk", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Plugin SDK for Project AIRI", "author": { diff --git a/packages/scenarios-stage-tamagotchi-browser/package.json b/packages/scenarios-stage-tamagotchi-browser/package.json index 31a501e14..ca9e96c05 100644 --- a/packages/scenarios-stage-tamagotchi-browser/package.json +++ b/packages/scenarios-stage-tamagotchi-browser/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/scenarios-stage-tamagotchi-browser", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Vite/Vue scene app for stage tamagotchi browser captures", "author": { diff --git a/packages/scenarios-stage-tamagotchi-electron/package.json b/packages/scenarios-stage-tamagotchi-electron/package.json index e89bd072a..45317c6c7 100644 --- a/packages/scenarios-stage-tamagotchi-electron/package.json +++ b/packages/scenarios-stage-tamagotchi-electron/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/scenarios-stage-tamagotchi-electron", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Product-owned Electron scenarios for stage-tamagotchi raw screenshot capture", "author": { diff --git a/packages/server-runtime/package.json b/packages/server-runtime/package.json index 1f177789d..ec8c0db72 100644 --- a/packages/server-runtime/package.json +++ b/packages/server-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/server-runtime", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "description": "Server runtime implementation for AIRI running in different environments", "author": { "name": "Moeru AI Project AIRI Team", diff --git a/packages/server-sdk/package.json b/packages/server-sdk/package.json index c256588a6..61e40a655 100644 --- a/packages/server-sdk/package.json +++ b/packages/server-sdk/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/server-sdk", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "description": "Client-side SDK implementation for connecting to AIRI server components and runtimes", "author": { "name": "Moeru AI Project AIRI Team", diff --git a/packages/server-shared/package.json b/packages/server-shared/package.json index 6a8efd250..ead66e514 100644 --- a/packages/server-shared/package.json +++ b/packages/server-shared/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/server-shared", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "description": "Server shared types, utilities for AIRI server components and runtimes", "author": { "name": "Moeru AI Project AIRI Team", diff --git a/packages/stage-ui-live2d/src/utils/live2d-zip-loader.test.ts b/packages/stage-ui-live2d/src/utils/live2d-zip-loader.test.ts index dcfad0aef..edd4d2d61 100644 --- a/packages/stage-ui-live2d/src/utils/live2d-zip-loader.test.ts +++ b/packages/stage-ui-live2d/src/utils/live2d-zip-loader.test.ts @@ -241,6 +241,54 @@ describe('live2d zip loader settings sanitization', () => { ]) }) + // ROOT CAUSE: + // + // Some valid Live2D archives contain expression and motion files that are + // absent from model3.json. The ZIP loader discovered these files for its + // report, but it did not add them to the runtime model settings. Pixi then + // omitted them from extraction and AIRI could not register them for ACT. + it('adds unreferenced expressions and motions to runtime model settings', async () => { + await import('./live2d-zip-loader') + const { ZipLoader } = await import('pixi-live2d-display/cubism4') + + const settingsText = JSON.stringify({ + Version: 3, + FileReferences: { + Moc: 'avatar.moc3', + Textures: ['textures/avatar.png'], + }, + Groups: [], + }) + const zip = new JSZip() + zip.file('avatar/avatar.model3.json', settingsText) + zip.file('avatar/avatar.moc3', new Uint8Array([77, 79, 67, 51])) + zip.file('avatar/textures/avatar.png', new Uint8Array([1, 2, 3])) + zip.file('avatar/expressions/smile.exp3.json', JSON.stringify({ + Type: 'Live2D Expression', + Parameters: [{ Id: 'ParamMouthForm', Value: 1, Blend: 'Add' }], + })) + zip.file('avatar/motions/wave.motion3.json', JSON.stringify({ Version: 3, Curves: [] })) + + const zipBytes = await zip.generateAsync({ type: 'uint8array' }) + const reader = await JSZip.loadAsync(await blobFromBytes(zipBytes).arrayBuffer()) + const settings = await ZipLoader.createSettings(reader) + const files = await ZipLoader.unzip(reader, settings) + + expect(settings.expressions).toEqual([ + { Name: 'smile', File: 'expressions/smile.exp3.json' }, + ]) + expect(settings.motions).toEqual({ + AIRI: [{ File: 'motions/wave.motion3.json' }], + }) + expect(files.map(file => file.webkitRelativePath).sort()).toEqual([ + 'avatar/avatar.moc3', + 'avatar/expressions/smile.exp3.json', + 'avatar/motions/wave.motion3.json', + 'avatar/textures/avatar.png', + ]) + expect(await reader.file('avatar/avatar.model3.json')!.async('string')).toBe(settingsText) + }) + it('loads an OPFS-restored file directory when model3.json contains Physics: null', async () => { await import('./live2d-zip-loader') const { FileLoader } = await import('pixi-live2d-display/cubism4') diff --git a/packages/stage-ui/package.json b/packages/stage-ui/package.json index c4999ee80..9d00df9c6 100644 --- a/packages/stage-ui/package.json +++ b/packages/stage-ui/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/stage-ui", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Shared core for stage", "author": { diff --git a/packages/stage-ui/src/stores/modules/airi-card.test.ts b/packages/stage-ui/src/stores/modules/airi-card.test.ts index 35e81ab82..e220255c1 100644 --- a/packages/stage-ui/src/stores/modules/airi-card.test.ts +++ b/packages/stage-ui/src/stores/modules/airi-card.test.ts @@ -1,5 +1,6 @@ import type { AiriCard } from './airi-card' +import { useLive2DActCapabilitiesStore } from '@proj-airi/stage-ui-live2d' import { createPinia, setActivePinia } from 'pinia' import { beforeEach, describe, expect, it, vi } from 'vitest' @@ -503,6 +504,31 @@ describe('airi-card store', () => { expect(cardStore.systemPrompt).not.toContain('What did you find?') }) + // ROOT CAUSE: + // + // The card prompt listed only AIRI's fixed emotion vocabulary. A loaded + // Live2D model could expose more expressions and motions, but the LLM did + // not receive their exact ACT identifiers. + it('adds current Live2D ACT capabilities to the system prompt', async () => { + const cardStore = useAiriCardStore() + const capabilities = useLive2DActCapabilitiesStore() + await cardStore.initialize() + + capabilities.beginModel('display-model-iru-v2') + capabilities.setExpressions('display-model-iru-v2', [ + { name: 'smile', fileName: 'expressions/smile.exp3.json' }, + ]) + capabilities.setMotions('display-model-iru-v2', [ + { fileName: 'motions/wave.motion3.json', group: 'AIRI', index: 0 }, + ]) + + expect(cardStore.systemPrompt).toContain('Live2D ACT controls for the current model:') + expect(cardStore.systemPrompt).toContain('- "smile"') + expect(cardStore.systemPrompt).toContain('- "motions/wave.motion3.json"') + expect(cardStore.systemPrompt).toContain('<|ACT {"expression":"smile"}|>') + expect(cardStore.systemPrompt).toContain('<|ACT {"motion":"motions/wave.motion3.json"}|>') + }) + it('falls back to the default card when the active custom card is deleted', async () => { const cardStore = useAiriCardStore() await cardStore.initialize() diff --git a/packages/stream-kit/package.json b/packages/stream-kit/package.json index 50faed990..2db6a44ba 100644 --- a/packages/stream-kit/package.json +++ b/packages/stream-kit/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/stream-kit", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Stream utilities for AIRI (queues, streams)", "author": { diff --git a/packages/testing-audio/package.json b/packages/testing-audio/package.json index 79c90fcb3..9e31a2814 100644 --- a/packages/testing-audio/package.json +++ b/packages/testing-audio/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/testing-audio", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "AIRI Web and Electron audio pipeline tests", "author": { diff --git a/packages/ui/package.json b/packages/ui/package.json index 65497a450..f83664ca8 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/ui", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "description": "A collection of UI components that used by Project AIRI", "author": { "name": "Moeru AI Project AIRI Team", diff --git a/packages/unocss-preset-fonts/package.json b/packages/unocss-preset-fonts/package.json index 3f97e044e..cec1d0dc1 100644 --- a/packages/unocss-preset-fonts/package.json +++ b/packages/unocss-preset-fonts/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/unocss-preset-fonts", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "description": "Fonts that are not included by Google Fonts, FontSource but open-source used by Project AIRI", "author": { "name": "Moeru AI Project AIRI Team", diff --git a/packages/vitest-plugin-fakemic/package.json b/packages/vitest-plugin-fakemic/package.json index 7afb2aaeb..0b61ea424 100644 --- a/packages/vitest-plugin-fakemic/package.json +++ b/packages/vitest-plugin-fakemic/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/vitest-plugin-fakemic", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Fake microphone test runtime and Vitest integration", "author": { diff --git a/plugins/airi-plugin-bilibili-laplace/package.json b/plugins/airi-plugin-bilibili-laplace/package.json index e2fd9af23..03b22c638 100644 --- a/plugins/airi-plugin-bilibili-laplace/package.json +++ b/plugins/airi-plugin-bilibili-laplace/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/airi-plugin-bilibili-laplace", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Live stream chat plugin, a bridge to forward Bilibili live chat via LAPLACE Event Bridge into AIRI server channel", "scripts": { diff --git a/plugins/airi-plugin-claude-code/package.json b/plugins/airi-plugin-claude-code/package.json index 3e2d4ec15..8026bdb8c 100644 --- a/plugins/airi-plugin-claude-code/package.json +++ b/plugins/airi-plugin-claude-code/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/airi-plugin-claude-code", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "manifest.json description", "bin": { diff --git a/plugins/airi-plugin-game-chess/package.json b/plugins/airi-plugin-game-chess/package.json index 1d935fefd..0ff7f4048 100644 --- a/plugins/airi-plugin-game-chess/package.json +++ b/plugins/airi-plugin-game-chess/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/airi-plugin-game-chess", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Chess plugin for AIRI gamelet/widget runtime", "scripts": { diff --git a/plugins/airi-plugin-homeassistant/package.json b/plugins/airi-plugin-homeassistant/package.json index ea74804ed..1b352108d 100644 --- a/plugins/airi-plugin-homeassistant/package.json +++ b/plugins/airi-plugin-homeassistant/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/airi-plugin-homeassistant", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Home Assistant integration plugin for AIRI server", "scripts": { diff --git a/plugins/airi-plugin-web-extension/package.json b/plugins/airi-plugin-web-extension/package.json index cea7ed113..abe94c74f 100644 --- a/plugins/airi-plugin-web-extension/package.json +++ b/plugins/airi-plugin-web-extension/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/airi-plugin-web-extension", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "manifest.json description", "scripts": { diff --git a/server/apps/api/package.json b/server/apps/api/package.json index ab513589b..6d546cd60 100644 --- a/server/apps/api/package.json +++ b/server/apps/api/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/api-server", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "exports": { "./app-type": "./src/app-type.ts" diff --git a/server/apps/auth/package.json b/server/apps/auth/package.json index be7445c32..e181518fb 100644 --- a/server/apps/auth/package.json +++ b/server/apps/auth/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/auth-server", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "scripts": { "apply:env": "dotenvx run -f .env.local --overload --ignore=MISSING_ENV_FILE", diff --git a/server/packages/auth-shared/package.json b/server/packages/auth-shared/package.json index ba4badb64..8ede0fc6b 100644 --- a/server/packages/auth-shared/package.json +++ b/server/packages/auth-shared/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/auth-shared", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Shared authentication schema and principal contracts for AIRI services", "exports": "./src/index.ts", diff --git a/server/packages/server-sdk-shared/package.json b/server/packages/server-sdk-shared/package.json index 3a1db15f5..4bc5497ad 100644 --- a/server/packages/server-sdk-shared/package.json +++ b/server/packages/server-sdk-shared/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/server-sdk-shared", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "Eventa contracts for the hosted chat WebSocket", "author": { diff --git a/services/computer-use-mcp/package.json b/services/computer-use-mcp/package.json index 5b905fbb1..67df31410 100644 --- a/services/computer-use-mcp/package.json +++ b/services/computer-use-mcp/package.json @@ -1,7 +1,7 @@ { "name": "@proj-airi/computer-use-mcp", "type": "module", - "version": "0.12.0-beta.4", + "version": "0.12.0-beta.5", "private": true, "description": "AIRI-specific macOS desktop orchestration MCP service", "author": {