Commit Graph
4388 Commits
Author SHA1 Message Date
Arata c30d169543 fix(stage-ui-live2d): preserve lip sync during MAGIC motion (#2481) 2026-09-11 01:56:54 +08:00
Neko 69ca0a9171 feat(stage-web): show FPS history in performance visualizer (#2516) 2026-09-11 01:46:40 +08:00
Weathercoldandgithub-actions[bot] 22b164bab0 chore(nix): update pnpmDeps hash (#2515)
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-09-10 16:47:58 +00:00
bianyi ac3601c061 chore(CONTRIBUTING.md): align setup guides with pinned tooling (#2503) 2026-09-11 00:34:17 +08:00
Lovehsigure_520 8928dca0b5 fix(stage-tamagotchi): restore macOS Steam signing (#2509) 2026-09-11 00:33:07 +08:00
Neko 2904b795dd fix(stage-ui): keep mobile swipe attached to touch (#2514) 2026-09-10 21:42:17 +08:00
LuluandCursor 9a76eaec32 fix(server): trust moeru-ai Cloudflare Workers preview origins (#2513)
## Summary

- Auth and API origin policy now trusts `*.moeru-ai.workers.dev`.
- The retired `*.kwaa.workers.dev` suffix is removed. Server-dev
stage-web previews on the moeru-ai Cloudflare account can complete OIDC
login.

## Test plan

- [x] `pnpm exec vitest run server/apps/auth/src/tests/auth.test.ts
server/apps/auth/src/tests/origin.test.ts
server/apps/api/src/utils/tests/origin.test.ts`
- [ ] After deploy, sign in from
https://server-dev-moeru-ai-airi.moeru-ai.workers.dev and confirm
`/auth/callback` is accepted.

## Visual changes

No user-visible changes.


Made with [Cursor](https://cursor.com)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-10 20:28:17 +08:00
leafyy 3c9e60907c test(stage-tamagotchi): stabilize interactive area browser fixtures (#2510)
## Summary

The desktop browser suite can mount `InteractiveArea` before its utility
styles settle, then scroll history while the reply composer is still
expanding. A pending Virtua tail scroll can replace the message that the
test selected and make the scrollport assertion fail.

This addresses the pre-existing browser-test failure reported during
#2506 ([CI
failure](https://github.com/moeru-ai/airi/actions/runs/34448585692/job/102804067154)).

- Scan desktop and shared Vue components before the initial test
stylesheet is served. Load the desktop UnoCSS config explicitly so
config discovery does not replace the scan.
- Give each fixture a window-sized host, reset the viewport, and dispose
the component, host, and Pinia after each test.
- Wait for the reply transition and virtual-list measurements to settle
before scrolling. Cover both 200 ms and 1 s transitions, and assert the
requested scroll position throughout the existing message-mount checks.

Only browser tests and their configuration change.

## Validation

The complete desktop browser suite passed with three shuffled seeds: **6
files, 65 tests per run**, with no skipped tests.

```sh
for seed in 2508 2506 2507; do
  npm_config_registry=https://registry.npmjs.org/ NODE_OPTIONS=--no-experimental-webstorage \
    pnpm exec vitest run --config apps/stage-tamagotchi/vitest.config.ts \
    --project browser --sequence.shuffle --sequence.seed="$seed" --bail=1
done
npm_config_registry=https://registry.npmjs.org/ pnpm run typecheck
npm_config_registry=https://registry.npmjs.org/ pnpm run lint
git diff --check
```

Typecheck passed all 52 tasks. Lint passed with existing repository
warnings. ResizeObserver loop warnings remain visible; this change does
not suppress them. Linux CI validation is pending.
2026-09-10 17:41:29 +08:00
Neko 21d0e9d3a7 fix(stage-ui): use touch events for mobile swipe (#2508) 2026-09-10 16:11:09 +08:00
Weathercoldandgithub-actions[bot] 13ae708541 chore(nix): update assets hash (#2501)
Auto-generated by CI to keep Nix asset hash up-to-date.

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-10 15:01:52 +08:00
Neko b2a7dc252c fix(stage-ui): center mobile user message text (#2505) 2026-09-10 14:59:33 +08:00
Weathercoldandgithub-actions[bot] dfc6951a55 chore(nix): update pnpmDeps hash (#2500)
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-09-09 16:31:37 +00:00
leafyy d7f38783f7 fix(stage-ui): persist speech provider settings (#2497) 2026-09-10 00:21:06 +08:00
Lovehsigure_520 352a9e389b fix(stage-ui): restore TTS after first login (#2490) 2026-09-10 00:08:35 +08:00
Younsang Na 41f9fb616b fix(computer-use-mcp): fix type errors at serivce/computer-use-mcp (#2494) 2026-09-10 00:06:02 +08:00
Younsang Na db2f8e3064 chore: optimize typecheck execution (#2499) 2026-09-10 00:03:27 +08:00
Neko 0d7b5e9a60 feat(stage-ui): add swipe to reply for chat messages (#2489) 2026-09-10 00:01:53 +08:00
Weathercoldandgithub-actions[bot] 3e94ea816c chore(nix): update pnpmDeps hash (#2496)
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-09-09 18:51:34 +08:00
Weathercoldandgithub-actions[bot] 94873f8515 chore(nix): update assets hash (#2495)
Auto-generated by CI to keep Nix asset hash up-to-date.

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-09 08:37:30 +00:00
RainbowBird 66f0d45028 refactor(analytics): replace PostHog with OpenPanel (#2480) 2026-09-09 08:26:18 +00:00
Younsang Naandleafyy 5e78b64e35 fix(stage-tamagotchi): prevent controls island overflow in small windows with scroll (#2474)
## Description

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

### As-is
Depending on the size, the Controls Island area gets cut off, making the
buttons in the cropped area inaccessible.

### To-be
The Controls Island is managed via scrolling, allowing interaction with
buttons regardless of the size.
If the main controls also exceed the available space, the entire
Controls Island becomes scrollable. Horizontal scrolling is available
for narrow windows.

#### narrow & smaill

https://github.com/user-attachments/assets/1a44ff4f-8fe2-4a05-96a8-59ebf7dafcff

#### somewhat generous size


https://github.com/user-attachments/assets/c73dbee4-8c8f-4937-ae1a-eda00178274c



## Linked Issues



<!-- Optional, if you have any -->
close #2400

## Additional Context

<!-- e.g. is there anything you'd like reviewers to focus on? -->
Although the size is somewhat less than ideal, the issue has been
resolved, and this serves as a universal solution.

---------

Co-authored-by: leafyy <wuqizq@outlook.com>
2026-09-09 14:20:51 +08:00
leafyy 7bcd8e5274 test(stage-ui): fix browser fixtures and cleanup (#2492)
## Description

The Unit Test job reaches stage-ui, then fails and stalls in browser
tests. The same failures occur on the parent commit.

- Use the real consciousness store and Pinia refs in context bridge
tests. Check that input requests preserve temperature and top-p.
- Dispose each bridge and Pinia scope after every test, including failed
assertions. This prevents old listeners from receiving later stream
events.
- Create translated module stores during component setup and await card
initialization before drawer interactions. Dispose the fixture stores
after each test.
- Remove the Pinia and Mutex replacements from the context bridge
fixture.

This change only updates two test files.

## Verification

The original fixture reproduced three failures in the two affected
files. The updated files pass all 17 tests. The complete CI test command
passes 2,534 tests, with one skipped test. Stage-ui passes all 822
tests.

- `NODE_OPTIONS=--no-experimental-webstorage pnpm exec vitest run
--config packages/stage-ui/vitest.config.ts --project browser
packages/stage-ui/src/components/misc/character-switcher-drawer.browser.test.ts
packages/stage-ui/src/stores/mods/api/context-bridge.contract.browser.test.ts
--reporter=verbose`
- `NODE_OPTIONS=--no-experimental-webstorage pnpm run test:run`
- `pnpm run typecheck`
- `pnpm run lint`
- `sem diff --staged --no-cosmetics -v --file-exts .ts .tsx`, JSON diff,
and dependent analysis for `mountSwitcher`: no blocking findings.
- `git diff --cached --check`

GitHub CI also passes on this PR: [all nine CI jobs
succeeded](https://github.com/moeru-ai/airi/actions/runs/34306753310),
including [Unit
Test](https://github.com/moeru-ai/airi/actions/runs/34306753310/job/102324934330).

## Additional Context

[Reported CI
failure](https://github.com/moeru-ai/airi/actions/runs/34237304157/job/102098223378)
· [Parent commit
failure](https://github.com/moeru-ai/airi/actions/runs/34212756766/job/102017352566)
2026-09-09 11:55:32 +08:00
RainbowBird 097202cd38 feat(stage-ui): add signed-in nickname context to chat prompts (#2488) 2026-09-08 22:17:19 +08:00
Lovehsigure_520 f679616c34 fix(stage-tamagotchi): allow sign-in on the first attempt (#2482) 2026-09-08 17:56:23 +08:00
RainbowBird ef9f122d50 fix(stage-ui): inherit global settings for default card (#2332) 2026-09-08 09:48:39 +00:00
Makito 9a4e1da5a1 test(stage-ui): fix tests 2026-09-08 03:35:35 +09:00
Sho Jikumaru 332883d42f fix(stage-ui): onboarding repeat prompt when provider credentials exist (#1900) 2026-09-08 00:09:14 +08:00
e293b71abc feat: add support for temperature, top_p to be configurable (#2200)
Co-authored-by: twix03 <sathwikbalaa@gmail.com>
Co-authored-by: RainbowBird <git@luoling.moe>
2026-09-08 00:02:53 +08:00
RainbowBird 66c6aa9b57 chore: ignore .worktrees 2026-09-08 00:00:24 +08:00
leafyy 52a9f429ed feat(plugin-host): add combined lifecycle controls (#2476)
## Summary

- Add combined `Enable and Load` and `Disable and Unload` controls to
Plugin Host Debug.
- Keep enablement persistence and runtime lifecycle changes in one
sequential store action.
- Add tests for ordering, busy state, and failure handling.
- Localize the new controls and fallback error messages in English and
Simplified Chinese.

## Verification

- `pnpm exec vitest run --config packages/stage-ui/vitest.config.ts
--project node src/stores/devtools/plugin-host-debug.test.ts`
- `pnpm -F @proj-airi/i18n test`
- `pnpm -F @proj-airi/i18n build`
- `pnpm run build:packages`
- `pnpm typecheck`
- `pnpm lint`
- Manually tested the bundled `devtools-sample-plugin` in the Electron
Plugin Host Debug page. Both combined actions updated the persisted
registry and runtime session state without restarting the app.

## Visual changes

| Before | After |
|---|---|
| ![Plugin Host Debug
before](https://github.com/user-attachments/assets/c9b3a6ec-699b-444a-ba01-50bbc2ffa3ad)
| ![Plugin Host Debug
after](https://github.com/user-attachments/assets/889dec79-a157-42a8-98f5-906d2e0b41f3)
|
| Plugin Host Debug | Plugin Host Debug with combined lifecycle controls
|
2026-09-07 19:04:17 +08:00
RainbowBird 0fd71bc1ab feat(stage-layouts): add mobile view adjustment mode (#2475) 2026-09-07 12:37:45 +08:00
leafyy 05ac66edfa fix(stage-tamagotchi): show Live2D expressions in settings (#2451)
## Summary

- Send a serializable Live2D expression snapshot from the stage renderer
to the separate Settings window.
- Route expression changes back to the renderer that owns the loaded
model, with owner ID checks for stale-window isolation.
- Add browser regressions for the component boundary and the complete
BroadcastChannel round trip.

Fixes #2450

## Verification

- `pnpm typecheck`
- `pnpm lint`
- `../../node_modules/.bin/vitest run --project browser
src/components/scenarios/settings/model-settings/live2d.browser.test.ts`
- `node_modules/.bin/vitest run --config
apps/stage-tamagotchi/vitest.config.ts --project browser
apps/stage-tamagotchi/src/renderer/composables/model-settings-runtime.browser.test.ts`
- `./node_modules/.bin/electron-vite build`
- Vishot Electron capture with the issue Live2D fixture on the merge
base and this branch
- `sem diff upstream/main...HEAD --no-cosmetics -v --file-exts .ts .tsx`

## Visual changes

| Before | After |
|---|---|
|
![](https://github.com/user-attachments/assets/e383ebf3-d60e-4f66-8550-4cab0dc61261)
|
![](https://github.com/user-attachments/assets/b8aee712-c227-44d0-a60c-2dd24cc0b0cd)
|
| Settings / Models / Live2D expressions: empty list | Settings / Models
/ Live2D expressions: model entries are available |
2026-09-07 11:14:44 +08:00
RainbowBird 836941fda8 feat(stage-layouts): simplify mobile stage controls (#2472)
Signed-off-by: RainbowBird <git@luoling.moe>
2026-09-06 16:28:01 +00:00
RainbowBird b1170ea8ca docs(server): clarify adr delivery workflow 2026-09-07 00:22:08 +08:00
RainbowBird 96b629165b fix(server): pass through final upstream errors (#2333)
Signed-off-by: RainbowBird <git@luoling.moe>
2026-09-06 16:08:47 +00:00
Weathercoldandgithub-actions[bot] f166736a76 chore(nix): update pnpmDeps hash (#2470)
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-09-05 11:39:12 +00:00
藍+85CD 3fc1e6461c chore(deps): bump three-mmd to v0.2.0-beta.2 (#2469) 2026-09-05 19:29:32 +08:00
RainbowBird 05007ce3ca refactor(stage-ui): rename analytics runtime path (#2466) 2026-09-04 23:37:45 +08:00
RainbowBird ab2c1c99bb refactor(stage-ui): inject runtime emotion prompt (#2464) 2026-09-04 23:17:17 +08:00
88lin 04e9ed7707 chore(docs): mark Azure OpenAI as supported in zh-CN README (#2463) 2026-09-04 21:27:52 +08:00
88lin d98d9b0e7a chore(docs): add missing NixOS section to zh-CN README (#2462) 2026-09-04 21:27:22 +08:00
RainbowBird e23fa64b62 fix(stage-layouts): suppress mobile browser form assistance (#2460) 2026-09-04 15:56:01 +08:00
RainbowBird fb574e69da docs(readme): update star history links (#2430) 2026-09-04 05:34:47 +00:00
leafyy 2ca8339a49 fix(speech): synchronize streaming catalog state (#2445) 2026-09-03 19:20:35 +08:00
Doji 75bde7ee34 fix(stage-pocket): add missing account settings route (#2457) 2026-09-03 18:23:06 +08:00
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