release: v0.12.0-beta.5
This commit is contained in:
@@ -1,2 +1,2 @@
|
|||||||
AIRI_VERSION_NAME=0.12.0-beta.4
|
AIRI_VERSION_NAME=0.12.0-beta.5
|
||||||
AIRI_VERSION_CODE=20
|
AIRI_VERSION_CODE=21
|
||||||
|
|||||||
@@ -321,7 +321,7 @@
|
|||||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 24;
|
CURRENT_PROJECT_VERSION = 25;
|
||||||
DEVELOPMENT_TEAM = 433DLLA855;
|
DEVELOPMENT_TEAM = 433DLLA855;
|
||||||
INFOPLIST_FILE = App/Info.plist;
|
INFOPLIST_FILE = App/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = AIRI;
|
INFOPLIST_KEY_CFBundleDisplayName = AIRI;
|
||||||
@@ -349,7 +349,7 @@
|
|||||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
|
||||||
CODE_SIGN_IDENTITY = "Apple Distribution";
|
CODE_SIGN_IDENTITY = "Apple Distribution";
|
||||||
CODE_SIGN_STYLE = Manual;
|
CODE_SIGN_STYLE = Manual;
|
||||||
CURRENT_PROJECT_VERSION = 24;
|
CURRENT_PROJECT_VERSION = 25;
|
||||||
DEVELOPMENT_TEAM = 433DLLA855;
|
DEVELOPMENT_TEAM = 433DLLA855;
|
||||||
INFOPLIST_FILE = App/Info.plist;
|
INFOPLIST_FILE = App/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = AIRI;
|
INFOPLIST_KEY_CFBundleDisplayName = AIRI;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/stage-tamagotchi",
|
"name": "@proj-airi/stage-tamagotchi",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "LLM powered virtual character",
|
"description": "LLM powered virtual character",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/docs",
|
"name": "@proj-airi/docs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "vitepress build",
|
"build": "vitepress build",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/stage-tamagotchi-godot",
|
"name": "@proj-airi/stage-tamagotchi-godot",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Godot-native desktop stage runtime workspace engine for stage-tamagotchi",
|
"description": "Godot-native desktop stage runtime workspace engine for stage-tamagotchi",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/twitter-services",
|
"name": "@proj-airi/twitter-services",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Twitter Services for MCP",
|
"description": "Twitter Services for MCP",
|
||||||
"author": "RainbowBird <rbxin2003@outlook.com>",
|
"author": "RainbowBird <rbxin2003@outlook.com>",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/airi-plugin-vscode",
|
"name": "@proj-airi/airi-plugin-vscode",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "AIRI host plugin that bridges VS Code context and UI",
|
"description": "AIRI host plugin that bridges VS Code context and UI",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"name": "vscode-airi",
|
"name": "vscode-airi",
|
||||||
"displayName": "AIRI VSCode adapter",
|
"displayName": "AIRI VSCode adapter",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Adapter that connects VSCode into Project AIRI",
|
"description": "Adapter that connects VSCode into Project AIRI",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/root",
|
"name": "@proj-airi/root",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"packageManager": "pnpm@11.24.0",
|
"packageManager": "pnpm@11.24.0",
|
||||||
"description": "LLM powered virtual character",
|
"description": "LLM powered virtual character",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/better-ws",
|
"name": "@proj-airi/better-ws",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Transport-agnostic reliable WebSocket runtime primitives",
|
"description": "Transport-agnostic reliable WebSocket runtime primitives",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/cap-vite",
|
"name": "@proj-airi/cap-vite",
|
||||||
"type": "module",
|
"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",
|
"description": "CLI that starts a Vite dev server and runs Capacitor live reload",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Moeru AI Project AIRI Team",
|
"name": "Moeru AI Project AIRI Team",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/core-agent",
|
"name": "@proj-airi/core-agent",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Core agent runtime orchestration for AIRI",
|
"description": "Core agent runtime orchestration for AIRI",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/core-character",
|
"name": "@proj-airi/core-character",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Core character pipeline orchestration for AIRI (segmentation, emotion, delay, optional TTS)",
|
"description": "Core character pipeline orchestration for AIRI (segmentation, emotion, delay, optional TTS)",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/electron-eventa",
|
"name": "@proj-airi/electron-eventa",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Shared Eventa contracts for Electron IPC",
|
"description": "Shared Eventa contracts for Electron IPC",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/electron-screen-capture",
|
"name": "@proj-airi/electron-screen-capture",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Screen capture",
|
"description": "Screen capture",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/electron-vueuse",
|
"name": "@proj-airi/electron-vueuse",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "VueUse-like composables and helpers for Electron apps",
|
"description": "VueUse-like composables and helpers for Electron apps",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/font-chillroundm",
|
"name": "@proj-airi/font-chillroundm",
|
||||||
"type": "module",
|
"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",
|
"description": "Essential CSS for font, ChillRoundM (a.k.a. 寒蝉半圆体), used by Project AIRI",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Warren2060",
|
"name": "Warren2060",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/font-cjkfonts-allseto",
|
"name": "@proj-airi/font-cjkfonts-allseto",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"description": "Essential CSS for font, cjkfonts 全瀨體, used by Project AIRI",
|
"description": "Essential CSS for font, cjkfonts 全瀨體, used by Project AIRI",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Creators of cjkFonts",
|
"name": "Creators of cjkFonts",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/font-departure-mono",
|
"name": "@proj-airi/font-departure-mono",
|
||||||
"type": "module",
|
"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",
|
"description": "Essential CSS for font, Departure Mono, used by Project AIRI",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Tobias Fried",
|
"name": "Tobias Fried",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/font-xiaolai",
|
"name": "@proj-airi/font-xiaolai",
|
||||||
"type": "module",
|
"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",
|
"description": "Essential CSS for font, Xiaolai (小赖字体 / 小賴字體 / シャオライ / Xiaolai Font), used by Project AIRI",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "ʟxɢᴡ",
|
"name": "ʟxɢᴡ",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/input-gamepad-vueuse",
|
"name": "@proj-airi/input-gamepad-vueuse",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.1",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Vue composables for AIRI gamepad input",
|
"description": "Vue composables for AIRI gamepad input",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/input-gamepad",
|
"name": "@proj-airi/input-gamepad",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.1",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Standard Gamepad API input for AIRI",
|
"description": "Standard Gamepad API input for AIRI",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/input-playstation-dualsense-5",
|
"name": "@proj-airi/input-playstation-dualsense-5",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.1",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "WebHID input and output support for the PlayStation 5 DualSense controller",
|
"description": "WebHID input and output support for the PlayStation 5 DualSense controller",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/memory-pgvector",
|
"name": "@proj-airi/memory-pgvector",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "",
|
"description": "",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/model-driver-lipsync",
|
"name": "@proj-airi/model-driver-lipsync",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"exports": {
|
"exports": {
|
||||||
".": "./src/index.ts",
|
".": "./src/index.ts",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/model-driver-magic-live2d",
|
"name": "@proj-airi/model-driver-magic-live2d",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.1",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Live2D model driver for MAGIC motion",
|
"description": "Live2D model driver for MAGIC motion",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/motion-driver-magic",
|
"name": "@proj-airi/motion-driver-magic",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.1",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Markovian Animation Generator with Illusory Conditioning for Project AIRI",
|
"description": "Markovian Animation Generator with Illusory Conditioning for Project AIRI",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/pipelines-audio",
|
"name": "@proj-airi/pipelines-audio",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Audio pipeline orchestration for AIRI (capture, VAD, encode, stream)",
|
"description": "Audio pipeline orchestration for AIRI (capture, VAD, encode, stream)",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -45,4 +45,12 @@ describe('normalizeActPayload', () => {
|
|||||||
emotion: { name: 'happy', intensity: 1 },
|
emotion: { name: 'happy', intensity: 1 },
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('normalizes an expression name from an ACT payload', () => {
|
||||||
|
expect(normalizeActPayload({
|
||||||
|
expression: ' smile ',
|
||||||
|
})).toEqual({
|
||||||
|
expression: 'smile',
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/plugin-protocol",
|
"name": "@proj-airi/plugin-protocol",
|
||||||
"type": "module",
|
"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",
|
"description": "Plugin protocol event definitions and shared websocket types for Project AIRI",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Moeru AI Project AIRI Team",
|
"name": "Moeru AI Project AIRI Team",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/plugin-sdk-tamagotchi",
|
"name": "@proj-airi/plugin-sdk-tamagotchi",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Tamagotchi-specific DX helpers for Project AIRI plugins",
|
"description": "Tamagotchi-specific DX helpers for Project AIRI plugins",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/plugin-sdk",
|
"name": "@proj-airi/plugin-sdk",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Plugin SDK for Project AIRI",
|
"description": "Plugin SDK for Project AIRI",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/scenarios-stage-tamagotchi-browser",
|
"name": "@proj-airi/scenarios-stage-tamagotchi-browser",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Vite/Vue scene app for stage tamagotchi browser captures",
|
"description": "Vite/Vue scene app for stage tamagotchi browser captures",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/scenarios-stage-tamagotchi-electron",
|
"name": "@proj-airi/scenarios-stage-tamagotchi-electron",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Product-owned Electron scenarios for stage-tamagotchi raw screenshot capture",
|
"description": "Product-owned Electron scenarios for stage-tamagotchi raw screenshot capture",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/server-runtime",
|
"name": "@proj-airi/server-runtime",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"description": "Server runtime implementation for AIRI running in different environments",
|
"description": "Server runtime implementation for AIRI running in different environments",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Moeru AI Project AIRI Team",
|
"name": "Moeru AI Project AIRI Team",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/server-sdk",
|
"name": "@proj-airi/server-sdk",
|
||||||
"type": "module",
|
"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",
|
"description": "Client-side SDK implementation for connecting to AIRI server components and runtimes",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Moeru AI Project AIRI Team",
|
"name": "Moeru AI Project AIRI Team",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/server-shared",
|
"name": "@proj-airi/server-shared",
|
||||||
"type": "module",
|
"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",
|
"description": "Server shared types, utilities for AIRI server components and runtimes",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Moeru AI Project AIRI Team",
|
"name": "Moeru AI Project AIRI Team",
|
||||||
|
|||||||
@@ -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 () => {
|
it('loads an OPFS-restored file directory when model3.json contains Physics: null', async () => {
|
||||||
await import('./live2d-zip-loader')
|
await import('./live2d-zip-loader')
|
||||||
const { FileLoader } = await import('pixi-live2d-display/cubism4')
|
const { FileLoader } = await import('pixi-live2d-display/cubism4')
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/stage-ui",
|
"name": "@proj-airi/stage-ui",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Shared core for stage",
|
"description": "Shared core for stage",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import type { AiriCard } from './airi-card'
|
import type { AiriCard } from './airi-card'
|
||||||
|
|
||||||
|
import { useLive2DActCapabilitiesStore } from '@proj-airi/stage-ui-live2d'
|
||||||
import { createPinia, setActivePinia } from 'pinia'
|
import { createPinia, setActivePinia } from 'pinia'
|
||||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
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?')
|
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 () => {
|
it('falls back to the default card when the active custom card is deleted', async () => {
|
||||||
const cardStore = useAiriCardStore()
|
const cardStore = useAiriCardStore()
|
||||||
await cardStore.initialize()
|
await cardStore.initialize()
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/stream-kit",
|
"name": "@proj-airi/stream-kit",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Stream utilities for AIRI (queues, streams)",
|
"description": "Stream utilities for AIRI (queues, streams)",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/testing-audio",
|
"name": "@proj-airi/testing-audio",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "AIRI Web and Electron audio pipeline tests",
|
"description": "AIRI Web and Electron audio pipeline tests",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/ui",
|
"name": "@proj-airi/ui",
|
||||||
"type": "module",
|
"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",
|
"description": "A collection of UI components that used by Project AIRI",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Moeru AI Project AIRI Team",
|
"name": "Moeru AI Project AIRI Team",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/unocss-preset-fonts",
|
"name": "@proj-airi/unocss-preset-fonts",
|
||||||
"type": "module",
|
"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",
|
"description": "Fonts that are not included by Google Fonts, FontSource but open-source used by Project AIRI",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Moeru AI Project AIRI Team",
|
"name": "Moeru AI Project AIRI Team",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/vitest-plugin-fakemic",
|
"name": "@proj-airi/vitest-plugin-fakemic",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Fake microphone test runtime and Vitest integration",
|
"description": "Fake microphone test runtime and Vitest integration",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/airi-plugin-bilibili-laplace",
|
"name": "@proj-airi/airi-plugin-bilibili-laplace",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Live stream chat plugin, a bridge to forward Bilibili live chat via LAPLACE Event Bridge into AIRI server channel",
|
"description": "Live stream chat plugin, a bridge to forward Bilibili live chat via LAPLACE Event Bridge into AIRI server channel",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/airi-plugin-claude-code",
|
"name": "@proj-airi/airi-plugin-claude-code",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "manifest.json description",
|
"description": "manifest.json description",
|
||||||
"bin": {
|
"bin": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/airi-plugin-game-chess",
|
"name": "@proj-airi/airi-plugin-game-chess",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Chess plugin for AIRI gamelet/widget runtime",
|
"description": "Chess plugin for AIRI gamelet/widget runtime",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/airi-plugin-homeassistant",
|
"name": "@proj-airi/airi-plugin-homeassistant",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Home Assistant integration plugin for AIRI server",
|
"description": "Home Assistant integration plugin for AIRI server",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/airi-plugin-web-extension",
|
"name": "@proj-airi/airi-plugin-web-extension",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "manifest.json description",
|
"description": "manifest.json description",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/api-server",
|
"name": "@proj-airi/api-server",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"exports": {
|
"exports": {
|
||||||
"./app-type": "./src/app-type.ts"
|
"./app-type": "./src/app-type.ts"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/auth-server",
|
"name": "@proj-airi/auth-server",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"apply:env": "dotenvx run -f .env.local --overload --ignore=MISSING_ENV_FILE",
|
"apply:env": "dotenvx run -f .env.local --overload --ignore=MISSING_ENV_FILE",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/auth-shared",
|
"name": "@proj-airi/auth-shared",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Shared authentication schema and principal contracts for AIRI services",
|
"description": "Shared authentication schema and principal contracts for AIRI services",
|
||||||
"exports": "./src/index.ts",
|
"exports": "./src/index.ts",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/server-sdk-shared",
|
"name": "@proj-airi/server-sdk-shared",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Eventa contracts for the hosted chat WebSocket",
|
"description": "Eventa contracts for the hosted chat WebSocket",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@proj-airi/computer-use-mcp",
|
"name": "@proj-airi/computer-use-mcp",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.12.0-beta.4",
|
"version": "0.12.0-beta.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "AIRI-specific macOS desktop orchestration MCP service",
|
"description": "AIRI-specific macOS desktop orchestration MCP service",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
Reference in New Issue
Block a user