Commit Graph
4343 Commits
Author SHA1 Message Date
Neko c1d23081b4 feat(ui): add FieldButton component (#2448) 2026-09-03 02:13:09 +08:00
Garfield Lee 93f26a5714 chore: include browser test for provider-inference package (#2446)
## Description

<!-- Please insert your description here and especially provide info
about the "what" this PR is solving -->

## Linked Issues

<!-- Optional, if you have any -->

## Additional Context

<!-- e.g. is there anything you'd like reviewers to focus on? -->
2026-09-02 20:02:10 +08:00
Garfield Lee 59a064ea80 refactor(stage-ui): extract provider-inference package for runtime-neutral definitions (#2444)
## Summary

Extract runtime-neutral provider definitions from `@proj-airi/stage-ui`
into a new `@proj-airi/provider-inference` package that runs in both
Node.js and browser without Vue/Pinia dependencies.

## What changed

- **New package** `packages/provider-inference/` — owns
`ProviderDefinition`, `ProviderRegistry`, validators, and all provider
modules (cloud + local)
- **Provider modules relocated** — ~45 providers moved from
`stage-ui/src/libs/providers/providers/` to
`provider-inference/src/providers/cloud/` and
`provider-inference/src/providers/local/`
- **Type decoupling** — `ProviderContext.t` changed from
`ComposerTranslation` (Vue) to generic `ProviderTranslator`, removing
the Vue dependency from core types
- **stage-ui types slimmed** — `types.ts` now re-exports from
`provider-inference` and only adds the Vue-specific `ProviderViews`
extension
- **validators/run.ts** — becomes a pass-through re-export
- **Registry** — portable `createProviderRegistry()` with deterministic
ordering and duplicate-id detection

## Verification

```bash
pnpm -F @proj-airi/provider-inference typecheck
pnpm -F @proj-airi/provider-inference test:node
pnpm -F @proj-airi/provider-inference test:browser
pnpm -F @proj-airi/provider-inference build
pnpm -F @proj-airi/stage-ui typecheck
pnpm -F @proj-airi/stage-web typecheck
pnpm -F @proj-airi/stage-tamagotchi typecheck
pnpm lint
```

## Why

Provider definitions were tightly coupled to Vue (`ComposerTranslation`,
`Component`), preventing reuse in non-Vue runtimes (Node.js services,
tests, future Electron backend). This extraction creates a clean
boundary: runtime-neutral definitions live in `provider-inference`,
while Vue/Pinia-specific concerns stay in `stage-ui`.
2026-09-02 19:35:25 +08:00
leafyy 13bbad95dc fix(stage-pages): initialize streaming speech provider config (#2440) 2026-09-02 19:00:05 +08:00
Doji aafb39c435 fix(stage-layouts): fix Android input bubble dragging (#2438) 2026-09-02 18:58:51 +08:00
Nekoandgithub-actions[bot] f8f32f0012 chore: update README release artifacts to v0.12.0-beta.5 (#2443)
## Description

Updates stable desktop download links after the v0.12.0-beta.5 release.

## Linked Issues

None.

## Additional Context

Generated by the post-release README workflow.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-09-02 18:58:14 +08:00
Rin 1e37c054bf feat(stage-layouts): align account dropdown with onboarding (#2439) 2026-09-02 16:26:29 +08:00
Doji 6697cb4c87 fix(stage-layouts): fix iOS keyboard closing right after opening (#2436) 2026-09-02 12:21:51 +08:00
Doji 9c213115f8 fix(stage): unify mobile keyboard avoidance (#2426) 2026-09-02 02:23:24 +08:00
icefair 59f8d1bc16 chore(docs): updated setup and use (#2434) 2026-09-01 18:58:26 +08:00
leafyy 55ef3d416e fix(stage-ui-three): preserve imported VRM view settings (#2423) 2026-09-01 10:31:12 +08:00
Weathercoldandgithub-actions[bot] ffad10a716 chore(nix): update pnpmDeps hash (#2429)
Auto-generated by CI to keep Nix pnpmDeps hash up-to-date.

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-31 11:42:49 +00:00
藍+85CD 83478d2c79 chore: bump xsai to v0.5.0 (#2428) 2026-08-31 19:34:04 +08:00
藍+85CD ef7b0b4ee7 chore(cspell): update config (#2427) 2026-08-31 11:10:47 +00:00
Weathercoldandgithub-actions[bot] 276b5c5074 chore(nix): update pnpmDeps hash (#2425)
Auto-generated by CI to keep Nix pnpmDeps hash up-to-date.

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-31 08:59:54 +00:00
藍+85CD eea229741e chore: bump @moeru/three-mmd (#2424) 2026-08-31 16:48:41 +08:00
leafyy aa69ee62b5 refactor(lipsync): share renderer vowel policy (#2374)
## Description

The VRM and MMD renderers had the same two boundary problems:

- Both imported the Stage audio store from the `stage-ui` source tree.
- Both kept copies of the wLipSync profile and model-neutral vowel
policy.

This PR solves both problems as one architecture change.

```text
Stage owns AudioContext and the current audio source
  -> ThreeScene / MMDScene receive both as inputs
    -> model-driver-lipsync owns the profile and shared vowel policy
      -> VRM maps AEIOU to aa / ee / ih / oh / ou
      -> MMD maps AEIOU to vowelA / vowelE / vowelI / vowelO / vowelU
```

The shared driver owns viseme projection, winner and runner selection,
silence handling, and smoothing. It has no Vue, Three.js, VRM, or MMD
dependency. Each renderer keeps only its model-specific mapping.

The renderer packages no longer import the Stage audio store or depend
directly on `wlipsync`. Stage passes the owning `AudioContext` down with
the current audio source. Cleanup disconnects only the wLipSync node
owned by that renderer.

## Current solution

The package-boundary review identified two related findings:

- Finding 3: The VRM and MMD renderers imported `stage-ui` audio state
through source paths.
- Finding 4: The same renderers duplicated the wLipSync profile and
model-neutral vowel policy.

Both findings came from one missing boundary between Stage, the lip-sync
driver, and the renderer adapters. This PR fixes that boundary with one
ownership change.

| Layer | Responsibility |
| --- | --- |
| `stage-ui` | Owns the `AudioContext` and the current audio source. It
passes both values to each renderer. |
| `stage-ui-three` and `stage-ui-mmd` | Connect renderer components to
the shared driver. They do not import the Stage audio store. |
| `model-driver-lipsync/runtime/wlipsync` | Exposes `createWLipSyncNode`
as the public runtime entry. |
| `model-driver-lipsync/shared/wlipsync` | Owns the profile, public
types, and model-neutral vowel policy. |

Runtime flow:

1. `Stage.vue` passes `audioContext` and `currentAudioSource` to
`ThreeScene` or `MMDScene`.
2. The renderer composable watches the context and creates one wLipSync
node for that context.
3. The source watcher connects the current audio source to that node.
4. Each render frame sends the wLipSync values to
`createWLipSyncVowelDriver`.
5. The renderer adapter applies the returned AEIOU weights to its model
controls.
6. Cleanup disconnects the exact source and node pair that the renderer
owns.

The shared policy keeps the current renderer behavior:

- It maps the raw `S` viseme to `I`.
- It selects the two strongest vowels.
- It uses the existing volume and silence thresholds.
- It keeps the 160 ms silence window.
- It keeps the existing attack, release, cap, and output scale values.

The renderer-specific mappings stay in their renderer packages:

- VRM maps AEIOU to `aa`, `ee`, `ih`, `oh`, and `ou`.
- MMD maps AEIOU to `vowelA`, `vowelE`, `vowelI`, `vowelO`, and
`vowelU`.

This solution removes both duplicate profile files. It also removes the
direct `wlipsync` dependencies from both renderer packages.

## Linked Issues

None.

## Additional Context

There is no intended visual change. This refactor preserves the existing
vowel weights and renderer mappings.

Verification:

- `sem diff --staged --no-cosmetics -v --file-exts .ts .tsx`
- `sem diff --staged --no-cosmetics -v --file-exts .vue`
- `sem impact --entity-id <useVRMLipSync> --json --dependents`
- `sem impact --entity-id <useMMDLipSync> --json --dependents`
- `pnpm -F @proj-airi/model-driver-lipsync test` — 3 tests passed
- `pnpm -F @proj-airi/stage-ui-three exec vitest run` — 18 tests passed
- `pnpm -F @proj-airi/stage-ui-mmd exec vitest run` — 23 tests passed
- Type checks passed for `model-driver-lipsync`, `stage-ui-three`,
`stage-ui-mmd`, and `stage-ui`
- `pnpm install --frozen-lockfile --ignore-scripts`
- `pnpm lint` — 0 errors and 7 existing warnings outside this change
- `git diff --check`

The full workspace `pnpm typecheck` was also run. In the isolated
worktree it stopped in unchanged `electron-vueuse` and
`plugin-sdk-tamagotchi` because their generated dependency outputs were
not present. All affected package type checks above passed.
2026-08-31 14:58:43 +08:00
Jorge Polanco 0a30c2298f fix(better-ws): publish the package so server-sdk installs (#2408) 2026-08-30 14:12:26 +08:00
Neko 99ce4bdcd0 fix(stage-tamagotchi): enforce widget window lifecycle (#2409) 2026-08-30 14:11:14 +08:00
Neko d8e62f12f0 fix(ci): remove incomplete release tests (#2407) 2026-08-30 03:11:51 +08:00
Neko Ayaka 2c1e223c8d release: v0.12.0-beta.5 2026-08-30 02:31:30 +08:00
Neko 0977bcd741 feat(stage-ui): improve Live2D import diagnostics (#2406) 2026-08-30 01:48:37 +08:00
Lovehsigure_520 da2ac8bbcc fix(ui): standardize scrollable areas (#2399) 2026-08-29 22:34:24 +08:00
Neko 484a2b7b19 fix(stage-ui-live2d): ignore macOS archive metadata (#2405) 2026-08-29 22:16:44 +08:00
zhifu gao 939bf544f8 fix(ci): remove stale transcription test command (#2403) 2026-08-29 22:01:33 +08:00
Younsang Na 273a5e535c fix(stage-tamagotchi): hide inactive title bar info icon (#2404) 2026-08-29 22:01:09 +08:00
Neko Ayaka 7bf1dc6ae6 refactor(audio-pipelines-transcribe): remove package 2026-08-29 18:28:08 +08:00
Weathercoldandgithub-actions[bot] 9ebce86a9a chore(nix): update pnpmDeps hash (#2401)
Auto-generated by CI to keep Nix pnpmDeps hash up-to-date.

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-29 18:22:25 +08:00
RinandNeko Ayaka 8ddb35353e feat(stage-tamagotchi,stage-ui-live2d): procedural motion generation (#2376)
---------

Co-authored-by: Neko Ayaka <neko@ayaka.moe>
2026-08-29 18:15:28 +08:00
Neko 898a62e3b4 fix(stage-ui): bottom-align mobile chat messages (#2398) 2026-08-29 12:45:36 +08:00
Makito 1e7c468c03 feat(provider): add voicevox family speech providers (#2383)
## Description

Adds the VOICEVOX engine family as text-to-speech providers. Two
catalogue entries share one adapter:

- `voicevox` — VOICEVOX ENGINE, default `http://localhost:50021/`
- `aivis-speech` — AivisSpeech Engine, default `http://localhost:10101/`

<img width="1203" height="976" alt="Screenshot 2026-08-28 at 23 33 30"
src="https://github.com/user-attachments/assets/ae475852-ccc0-4bd7-81ea-9e9ba2f75e31"
/>

<img width="1203" height="976" alt="Screenshot 2026-08-28 at 23 34 14"
src="https://github.com/user-attachments/assets/f83f73a9-ee76-4a91-a2fc-907b361beb0d"
/>

## Linked Issues

Closes #2166
2026-08-28 19:46:27 +00:00
Neko 434f8de2be fix(stage-ui): remove the chat session initialization race (#2394) 2026-08-29 03:35:31 +08:00
Weathercoldandgithub-actions[bot] 5f8ed064d8 chore(nix): update pnpmDeps hash (#2396)
Auto-generated by CI to keep Nix pnpmDeps hash up-to-date.

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-29 03:17:42 +08:00
Neko 54da6eac0e feat(input-gamepad): add controller input packages (#2395) 2026-08-29 03:03:53 +08:00
Makito 4a18e51660 docs(AGENTS): correct typecheck command 2026-08-29 02:32:40 +09:00
Makito 56bcfc793e fix(stage-tamagotchi): include install-electron in scripts to ensure electron (#2392)
## Description

Let `dev` and `start` scripts run `install-electron` before
`electron-vite`.

Electron 42 removed the `postinstall` script. The `electron` package now
downloads its binary on its `bin` entry's first run. `electron-vite`
reads `node_modules/electron/path.txt` directly, so it never starts that
download. A fresh install therefore fails with:

```
error during start dev server and electron app:
Error: Electron uninstall
    at getElectronPath (...)
    ...
```

`install-electron` runs the same code as the removed `postinstall`
script. It returns immediately when the binary is already present.
2026-08-29 02:13:45 +09:00
Neko 48ee12d184 fix(server-runtime): disable socket port reuse (#2393) 2026-08-29 01:13:24 +08:00
Doji 0616eabd5b fix(stage-tamagotchi): disable reusePort on Windows (#2390) 2026-08-28 19:37:43 +08:00
leafyy 4f38487447 fix(stage-pocket): add iOS microphone usage description (#2389) 2026-08-28 17:44:30 +08:00
Neko Ayaka fe38fb9ded release: v0.12.0-beta.4 2026-08-28 04:59:05 +08:00
Neko eb7d7a7a50 fix(stage-layouts): preserve mobile Safari input focus (#2387) 2026-08-28 02:24:12 +08:00
Neko e64998db6d fix(stage-ui-live2d): avoid proxying renderer instances (#2386) 2026-08-28 00:42:08 +08:00
Neko Ayaka 175ad08477 release: v0.12.0-beta.3 2026-08-27 20:48:27 +08:00
ANIRUDDHA ADAK badbe63559 fix(stage-tamagotchi): guard systemPreferences calls on Linux (#2380) 2026-08-27 19:56:15 +08:00
이윤진(Lee Yunjin) 62b4fd21ff fix(stage-tamagotchi): fix window visibility and ozone flags on wayland (#2288) 2026-08-27 17:25:06 +08:00
mrlonely c86894ccdc chore(docs): correct setup and provider guidance (#2336) 2026-08-27 17:24:35 +08:00
leafyy 795c43f0a7 refactor(stage-pages): share polaroid page (#2375) 2026-08-27 17:10:34 +08:00
leafyy debe4019d1 refactor(stage-ui): use public package exports (#2373) 2026-08-27 17:08:44 +08:00
Neko Ayaka 7a357e0051 chore(ci): pin to node@26 2026-08-27 16:09:17 +08:00
Doji a72d0a3a02 feat(stage-pocket): add dockable input bubble (#2363) 2026-08-27 15:53:16 +08:00