Commit Graph
580 Commits
Author SHA1 Message Date
147d077aa7 feat(inference): unify and optimize WebGPU inference pipeline (#1622)
## Problem

The WebGPU inference pipeline had several structural issues:

1. **No unified protocol** — Kokoro TTS, Whisper ASR, and Background
Removal workers each used their own ad-hoc message formats. Adding a new
model meant reinventing worker communication from scratch.
2. **Infrastructure existed but was disconnected** —
`GPUResourceCoordinator`, `LoadQueue`, `InferenceWorkerManager`, and
`protocol.ts` were all implemented but had zero consumers. The adapters
duplicated the same lifecycle/timeout/mutex patterns independently.
3. **Performance gaps** — Kokoro only offered fp32 on WebGPU (no fp16),
Whisper warm-up compiled shaders for 187.5s of dummy audio, audio
transfer went through unnecessary WAV blob encode/decode, and
`listVoices` reloaded the model every time.
4. **Silent failures** — Whisper worker's `generate()` had no try-catch;
errors were swallowed and the main thread waited until timeout.
5. **No graceful degradation** — Whisper and Background Removal workers
hardcoded `device: 'webgpu'` with no WASM fallback.
6. **No observability** — Only Kokoro had performance tracing. No
adapter reported status to `useInferenceStatus`. No cache management UI
existed.
7. **Dead code accumulation** — Old `KokoroWorkerManager` (232 lines),
legacy Whisper message types, and scattered duplicate constants.

## Changes

### Phase 0 — Critical Performance & Bugs
- Add `fp16-webgpu` dtype for Kokoro TTS (~2x inference speed on
supported GPUs)
- Fix Whisper warm-up tensor from `[1, 128, 3000]` → `[1, 128, 1]`
(minimal shader compilation)
- Fix Whisper worker silent error bug (add try-catch to `generate()` and
`load()`)

### Phase 1 — Data Transfer & Caching
- Switch Kokoro audio to Float32Array transferable (skip WAV blob encode
in worker, lightweight WAV encode on main thread)
- Cache `listVoices` results (skip redundant model reload when adapter
state is `ready`)
- Normalize progress reporting to 0-100 across all adapters,
differentiate `warmup` phase

### Phase 2 — Protocol Unification & Infrastructure
- Migrate all 3 workers + 3 adapters to unified `protocol.ts` message
types (`load-model`, `run-inference`, `model-ready`, `inference-result`,
`progress`, `error`)
- Wire `GPUResourceCoordinator` into all adapters (VRAM allocation
tracking, LRU ordering, memory pressure events)
- Wire `LoadQueue` into all adapters (priority-based sequential model
loading: TTS=10 > ASR=5 > BG_REMOVAL=1)
- Add `coordinator.ts` global singleton for GPU coordinator + load queue
- Add WebGPU detection + WASM fallback in Whisper and Background Removal
workers

### Phase 3 — Error Recovery & Observability
- Add restart logic with exponential backoff to Whisper adapter
(matching Kokoro's existing pattern)
- Integrate `classifyError()` (OOM / DEVICE_LOST / TIMEOUT
classification) in Whisper adapter
- Extend `defaultPerfTracer` to Whisper `transcribe()` and Background
Removal `processImage()`
- Wire `useInferenceStatus` into all 3 adapters (downloading → ready →
terminated lifecycle)

### Phase 4 — Tests
- Add unit tests for `AsyncMutex` (4 tests), `LoadQueue` (4 tests),
`GPUResourceCoordinator` (7 tests) — all 15 passing

### Phase 5 — Cleanup & Features
- Delete old `KokoroWorkerManager` (232 lines, zero consumers)
- Delete orphaned `libs/workers/types.ts` (old Whisper message types)
- Clean up `workers/kokoro/types.ts` (remove legacy message types, keep
domain types)
- Create centralized `constants.ts` (MODEL_IDS, MODEL_NAMES, TIMEOUTS,
MAX_RESTARTS)
- Remove hardcoded WebGPU check from background-removal devtools pages
(worker auto-detects)
- Add `useModelPreload` composable for generic idle-time preloading
- Add `useInferencePreload` composable that reads provider config and
preloads configured local models
- Wire preloading into both `stage-web` and `stage-tamagotchi` App.vue
(Kokoro TTS preloads 3s after init)
- Add `ModelCacheManager.vue` settings component (cache size display,
per-model status, clear cache)
- Document GPU Device isolation architecture in protocol.ts

## After This PR

- All inference workers speak the same protocol → adding a new model
adapter is straightforward
- GPU memory is tracked across all models with automatic pressure
warnings at 80%/95% of VRAM budget
- Models load sequentially via priority queue → no bandwidth/VRAM
contention
- Workers auto-detect WebGPU and fall back to WASM → works on browsers
without WebGPU
- Kokoro TTS preloads during idle time → "instant" first use for
configured users
- All adapters auto-restart on worker crashes (max 3 attempts,
exponential backoff)
- 15 unit tests cover core infrastructure (mutex, queue, coordinator)
- Zero dead code remains in the inference pipeline

## Test Plan

- [x] `pnpm exec vitest run packages/stage-ui/src/libs/inference/` — 15
tests pass
- [x] `pnpm -F @proj-airi/stage-ui exec tsc --noEmit` — no TypeScript
errors
- [x] `pnpm lint:fix` — no lint errors in changed files
- [ ] Manual: verify Kokoro TTS works with fp16-webgpu on a supported
browser
- [ ] Manual: verify Whisper ASR loads and transcribes correctly
- [ ] Manual: verify Background Removal works in devtools page
- [ ] Manual: verify preloading triggers in console (`[Preload] Loading
kokoro-...`)

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-04-13 23:19:27 +08:00
Neko Ayaka 95eac8e41c chore(deps): bump dependencies 2026-04-11 04:00:49 +08:00
Neko Ayaka abc0cb0bc7 refactor(ui-server-auth,server): use better design of signin page 2026-04-10 16:25:11 +08:00
Neko Ayaka 90294ce15c refactor(stage-*): use new InputFileCard 2026-04-10 03:40:10 +08:00
286cc33d0e feat(stage-ui): let AIRI see tool failures in LLM context (captureToolErrors + xsai patches) (#1602)
---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Cursor
Co-authored-by-agent: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-04-08 01:29:17 +08:00
Neko Ayaka ffb7c2e05d refactor(stage-web,ui-server-auth): rollback sign in design 2026-04-07 18:18:55 +08:00
Neko Ayaka fe139f31cd chore(stage-*): configured https, now dev:web:https or pnpm -F @proj-airi/stage-web dev:https works 2026-04-07 01:39:49 +08:00
LemonNeko 883ec945d2 feat(stage-pocket): WebSocket status indicator + shared i18n (#1586) 2026-04-06 19:54:21 +08:00
Neko Ayaka 9baa81ec30 fix(stage-*): missing install of embla-carousel-vue 2026-04-03 15:49:37 +08:00
Neko Ayaka 248e28412a wip(ui-server-auth): basic ui, not yet finalized 2026-04-03 15:43:28 +08:00
Lovehsigure_520andNeko Ayaka f9ebe6522b feat(stage-ui): add hologram promo banner (#1514)
---------

Co-authored-by: Neko Ayaka <neko@ayaka.moe>
2026-04-03 07:22:34 +08:00
Neko Ayaka 3b76bab2fc feat(stage-*,workspace): added Nunito for default English font, ChillRoundM for CJK font
Close #1317, #1393
2026-04-02 18:31:53 +08:00
RainbowBird f1fe161bc0 feat(auth): OIDC (#1531) 2026-04-02 04:24:04 +08:00
fdeb9561bc feat(minecraft,stage-*): airi integration, isolated-vm plus misc updates (#1371)
* feat(minecraft): contextflow integration

Add AiriBridge to cognitive engine to enable communication with Airi system. Expose `notifyAiri` and `updateAiriContext` functions in JS planner runtime globals for sending notifications and context updates from agent code.

* refactor(minecraft): remove redundant destinations field from airi-bridge

Remove hardcoded `destinations: ['minecraft']` from spark:command, spark:notify, and context:update events as the destination is already implied by the bridge context.

* feat(minecraft): complete AIRI context flow integration

Wire up bidirectional AIRI ↔ Minecraft communication via dedicated
signal channels instead of reusing signal:chat_message.

- Add airi_command and airi_context to PerceptionSignalType
- Route spark:command intents: action/plan/proposal/reroute emit
  signal:airi_command; context intent emits signal:airi_context
- Add inbound context:update listener so AIRI can push context to
  the Minecraft agent
- airi_context signals are injected into conversation history directly
  without triggering a full cognitive cycle
- airi_command events reset the no-action budget (like player chat)
- enterContext/exitContext auto-emit context:update back to AIRI for
  task lifecycle visibility
- Add sendEmit() helper for queued/working/done progress reporting

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(minecraft): report bot startup state to AIRI

Send initial context update to AIRI when brain comes online, including
bot username, server address, position, health, game mode, and list of
other online players. Tagged with 'startup' and bot username for
filtering.

* feat(minecraft): manage bot config through airi

* feat(stage-ui): add minecraft service shell

* fix(stage-ui): use applied minecraft config for chat context

* fix(minecraft): fall back on invalid env port

* fix(minecraft): support quoted env values

* fix(minecraft): ignore empty env overrides

* fix(stage-ui): keep minecraft draft during apply

* fix(stage-ui): simplify minecraft heartbeat label

* feat(stage-ui): simplify minecraft settings shell

* fix(minecraft): use registry heartbeat for stage liveness

* chore(minecraft): remove annoying detector decision logging

* fix(minecraft): limit context flow to bot pushes

* fix(minecraft): use workspace server sdk

* fix(stage-ui): replay registry snapshots for late listeners

* chore(minecraft): add todo for explicit stage deregistration

* feat: improve context flow observability

* fix(stage-ui): remove redundant header and callout from settings and context flow pages

* feat(stage-ui): enhance context flow prompt projection UI with readiness indicator

* docs(stage-ui): clarify context flow prompt projection terminology

* fix(stage-ui): add test for clone-safe context snapshots with nested fields

* todo

* fix(minecraft): avoid blocking startup on airi connection

* Remove LLM timeouts from the Minecraft brain

* Remove context boundary system from Minecraft brain

* feat(minecraft): use isolated-vm for JS planner sandbox

* refactor(minecraft): harden planner sandbox defaults

* Remove LLM attempt timeout guard

* [autofix.ci] apply automated fixes

* Fix server runtime shutdown signal handling

* Remove misleading Minecraft integration toggle

* contextflow destination to stage-*

* chore(deps): updated

* Add settings layout route for web devtools

* chore: default to expand context panels

* fix(server-*): should export more types, and for module:announced should ignore self

* refactor(minecraft): better context orchestration, handle module announce, context sync, and more

* feat(stage-ui): not spark command ready

* [autofix.ci] apply automated fixes

* clean up

* refactor: use :class arrays per AGENTS.md styling guidelines

* cleanup bloated tests

* rm more tests

* use errorMessageFrom

* hardcode to reduce bloat

* update setup instructions

* timeout for brain

* remove more bloat

* fix

---------

Co-authored-by-agent: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by-agent: Codex
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Neko Ayaka <neko@ayaka.moe>
2026-04-01 23:33:59 +08:00
Lilia_Chenandautofix-ci[bot] d9ba2ab40e refactor(stage-ui-three): improved outline logic (#1536)
* refactor(stage-ui-three): improved outline logic

* [autofix.ci] apply automated fixes

* fix(stage-ui-three): restored runtime hooks being exposed

* some type fix

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-04-01 07:48:00 +08:00
Lilia-Chen 718e91a833 refactor(stage-ui-three): add hooks in VRM loading workflow 2026-03-31 00:24:13 +01:00
Neko Ayaka b6c5882366 chore(stage-ui): pwa toaster prompt 2026-03-30 23:18:29 +08:00
JasonandJasonOA888 7164318002 fix(pwa): show update toast when new version is available (#1517)
---------

Co-authored-by: JasonOA888 <JasonOA888@users.noreply.github.com>
Assume-co-authored-by-agent: Unknown <unknown@example.com>
2026-03-30 22:54:54 +08:00
Neko Ayaka 5f07b68876 fix(stage-*): should not wait until context bridge 2026-03-30 20:18:55 +08:00
LemonNekoandautofix-ci[bot] 38f0306100 fix(stage-*): remove unused json format and platform checking (#1523)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-03-30 17:03:00 +08:00
Neko Ayaka 306f8e66f0 fix(stage-ui): text change, i18n change 2026-03-29 02:38:26 +08:00
RainbowBird 1b3ade3f41 chore(stage-*): login component icon alignment 2026-03-28 02:25:44 +08:00
RainbowBird a63bfa0da0 refactor(stage-*): useBreakpoints 2026-03-28 02:25:44 +08:00
RainbowBird dcfa00ca64 docs(stage-web): update term of services 2026-03-28 02:25:44 +08:00
RainbowBird b0576d3b89 chore(deps): move eventa to catalog 2026-03-26 21:45:01 +08:00
RainbowBird 40bd86f668 chore(deps): move drizzle-orm to catalog (#1480) 2026-03-26 20:52:40 +08:00
Neko Ayaka 46147b0f8b fix(stage-*): incorrect use of useAudioDevices hook 2026-03-26 19:05:54 +08:00
Neko Ayaka 25b5de179d Revert "chore(deps): replace with unplugin-vue"
This reverts commit 3339daa746.

As unplugin-vue-i18n:

```
[unplugin-vue-i18n]  `@vitejs/plugin-vue` plugin is not found or invalid version. Please install `@vitejs/plugin-vue` v4.3.4 or later version.
```

https://github.com/intlify/bundle-tools/blob/3da4987500bbf9b398b0681852b90470968bdc8c/packages/unplugin-vue-i18n/src/core/resource.ts#L167-L168

it seems they are depending on vite:vue while https://github.com/unplugin/unplugin-vue is different on plugin resolving, yet unplugin-vue seems
lost the track of new version.
2026-03-26 18:10:30 +08:00
Neko Ayaka 3339daa746 chore(deps): replace with unplugin-vue 2026-03-26 17:22:49 +08:00
f85a809d7c refactor(stage-*): analytics and telemetry, including consent (#1414)
---------

Co-authored-by-agent: Codex <267193182+codex@users.noreply.github.com>
Co-authored-by-agent: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: RainbowBird <rbxin2003@outlook.com>
Co-authored-by: Neko <neko@ayaka.moe>
2026-03-24 13:01:39 +08:00
Neko Ayaka 7313d567d6 chore(deps): bump more dependencies 2026-03-24 09:20:19 +08:00
Neko Ayaka e3f5671f4d chore(deps): bump vite dependencies to solve the build issue 2026-03-24 09:16:25 +08:00
Neko Ayaka 1bd3472246 fix: many type errors 2026-03-23 14:17:06 +08:00
Neko Ayaka ce60323d8a style: lint 2026-03-23 02:16:10 +08:00
Neko Ayaka ac1de680d0 chore(deps): bump dependencies 2026-03-23 02:15:40 +08:00
Neko Ayaka 7fe410b969 chore(stage-tamagotchi,stage-pages,stage-layouts): vision devtools improved 2026-03-20 02:27:21 +08:00
Neko Ayaka 2dd2a149b8 feat(stage-tamagotchi): added fundamental vision 2026-03-20 02:27:21 +08:00
Makito 3870471c3c fix(stage-web): allow vite serving files outside of the allow list 2026-03-17 03:01:01 +09:00
RinandClaude Opus 4.6 688836912d chore: disable PostHog telemetry in development mode (#1365)
* chore: disable PostHog telemetry in development mode

Skip posthog.init() when import.meta.env.DEV is true to avoid
sending telemetry data during local development.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Apply suggestions from code review

Co-authored-by: Rin <shinohara-rin@users.noreply.github.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 09:39:54 +08:00
LemonNekoandautofix-ci[bot] 589553c0e3 feat(stage-pocket): request permissions onboarding (#1292)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-03-12 14:49:39 +08:00
dec2b04924 refactor: vrm performance tracing and better lifecycle management (#1194)
* refactor: vrm performance tracing and better lifecycle management

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Rename lag-visualizer.vue to performance-visualizer.vue

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @sumimakito

Co-authored-by: Makito <i@maki.to>

* Apply suggestion from @sumimakito

Co-authored-by: Makito <i@maki.to>

* Apply suggestion from @sumimakito

Co-authored-by: Makito <i@maki.to>

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* [autofix.ci] apply automated fixes

* Apply suggestion from @Lilia-Chen

* [autofix.ci] apply automated fixes

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* [autofix.ci] apply automated fixes

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* [autofix.ci] apply automated fixes

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* Apply suggestion from @Lilia-Chen

* fix: some tiny bugs and model URL lifecycle

* fix: TresCanvas size=0 bug

* Delete .claude/settings.json

* fix: some clean-up

* [autofix.ci] apply automated fixes

* fix: use screen to wrap up TresCanvas

* Delete .claude/settings.json

---------

Co-authored-by: Makito <i@maki.to>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Neko <neko@ayaka.moe>
2026-03-12 09:20:20 +08:00
Makito 87f43c7aa6 feat(stage-pocket,stage-web,stage-shared): add isEnvTruthy for safer env var checks 2026-03-05 03:03:57 +07:00
Makito 1035104b66 feat(stage-pocket,stage-web): allow skipping mkcert and correct env vars type 2026-03-05 03:03:57 +07:00
Makito 9d1eb7c7d6 chore(deps): bump unplugin-fetch to 0.2.2 2026-02-28 14:22:24 +07:00
Neko Ayaka 92d87833be chore(deps): bump dependencies 2026-02-26 18:33:52 +08:00
Neko Ayaka e8f6155ec6 feat(plugin-sdk,stage-tamagotchi): demo plugin, and plugin inspector 2026-02-16 16:06:28 +08:00
Sebastián c8f679e1e4 fix(stage-*): Kokoro TTS now works in production too (#1017) 2026-02-03 05:27:06 +08:00
RainbowBird a57b9e5519 refactor(stage-web): merge login redirect judgement statement 2026-01-27 15:53:02 +08:00
藍+85CD 09bdbf205a chore(deps): use vite v8 instead of rolldown-vite (#993) 2026-01-24 22:30:04 +08:00
藍+85CD 43fe9e89f2 perf: setup knip, remove unused dependencies (#992) 2026-01-24 15:08:08 +08:00