KeiSeiKit-1.0/_ts_packages/packages/cortex-ui/patches
Parfii-bot dc196dc325
Some checks failed
Release / Build aarch64-apple-darwin (push) Has been cancelled
Release / Build x86_64-apple-darwin (push) Has been cancelled
Release / Build aarch64-unknown-linux-gnu (push) Has been cancelled
Release / Build x86_64-unknown-linux-gnu (push) Has been cancelled
Release / Build mcp-server darwin-arm64 (push) Has been cancelled
Release / Build mcp-server linux-arm64 (push) Has been cancelled
Release / Build mcp-server darwin-x64 (push) Has been cancelled
Release / Build mcp-server linux-x64 (push) Has been cancelled
Release / Build mcp-server windows-x64 (push) Has been cancelled
Release / Publish GitHub Release (push) Has been cancelled
Release / Publish npm packages (optional) (push) Has been cancelled
feat(wave21): Live2D renderer ported from AIRI — Haru model bundled
cortex-ui gains a Live2D anime-character renderer alongside existing
32px pixel sprites. User chooses via Setup; switch stored in localStorage
(pet.toml `meta.renderer` field will be wired to daemon in Wave 22).

## Ports from AIRI (MIT, attribution in each file header)

- `src/lib/live2d/emotions.ts` (72 LOC) — 9-value Emotion enum + motion
  name + VRM expression maps. Copy-verbatim + CortexMood→Emotion adapter.
- `src/lib/live2d/motion-manager.ts` (194 LOC) — motion state machine
  (Vue composable → Svelte 5 factory). Named-group preference, fallback
  on throw, replay, reset.
- `src/lib/live2d/expression-controller.ts` (180 LOC) — expression blend
  math + transition reset.
- `src/lib/live2d/beat-sync.ts` (63 LOC) — audio-reactive STUB; full
  port deferred to Wave 22.
- `src/lib/live2d/types.ts` (62 LOC) — shared interfaces.

## New component

- `src/components/Live2DPet.svelte` (169 LOC) — wraps pixi-live2d-display.
  Props `{ modelPath, mood, width, height }`. Fallback message in jsdom
  (no WebGL) — tests mount without throwing.

## PetEditor + Setup integration

- `PetEditor.svelte` reads `pet.toml` `meta.renderer` → localStorage
  fallback → defaults `sprite32`. Toggle button swaps renderer mid-session.
- `Setup.svelte` adds Renderer radio (sprite32 / live2d), persists to
  localStorage.

## Model bundled

Haru (`haru_greeter_t03`), Live2D Cubism official sample, free sample
data license with attribution. 3.4 MB on disk (384 KB moc3 + 2.7 MB
textures + 8 expressions + 5 motions). Served at
`./live2d-models/haru/haru_greeter_t03.model3.json`.

## Deps

- Added `pixi.js ^7.4.0` + `pixi-live2d-display ^0.4.0` to
  _ts_packages/packages/cortex-ui/package.json
- AIRI's `pixi-live2d-display.patch` copied to patches/ with README
  (manual apply, not needed for default model path)
- **Known risk**: pixi 7 vs library peer-dep 6 mismatch — silent at
  install time, untested at runtime. Fallback path: downgrade to pixi ^6
  OR swap to `pixi-live2d-display-lipsyncpatch`. Will validate during
  live browser test; fix in Wave 22 if breaks.

## Tests

30 pass / 0 fail (was 10):
- live2d-emotions.test.ts (6 new)
- live2d-motion-manager.test.ts (6 new)
- live2d-expression-controller.test.ts (5 new)
- live2d-pet-mount.test.ts (3 new)
- pre-existing api + config tests unchanged (10)

## Bundle size

- Main JS: 56 KB (22 KB gzip) — SPA shell unchanged
- pixi.js: 428 KB (129 KB gzip) — code-split, lazy-loaded on `live2d` pick
- pixi-live2d-display + Cubism4: 308 KB (82 KB gzip) — code-split too
- Haru model assets: 3.4 MB public/, served on-demand
- dist total: 7.5 MB with sourcemaps

## Constructor Pattern

All source files ≤194 LOC (motion-manager largest). All leaf fns ≤18
LOC. Factory-composer pattern avoids Vue's Composition API wrapping
(no mixins, no DI).

## Svelte 5 config touch

- `vite.config.ts` adds `resolve.conditions: ['browser']` +
  `server.deps.inline` for vitest — Svelte 5 runes resolve to client
  entry under jsdom correctly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 04:05:47 +08:00
..
pixi-live2d-display.patch feat(wave21): Live2D renderer ported from AIRI — Haru model bundled 2026-04-24 04:05:47 +08:00
README.md feat(wave21): Live2D renderer ported from AIRI — Haru model bundled 2026-04-24 04:05:47 +08:00

patches/

pixi-live2d-display.patch

Copied verbatim from AIRI (https://github.com/moeru-ai/airi), MIT License.

What it does

Both FileLoader and ZipLoader in pixi-live2d-display@0.4.0 pick the first settings file ending in model.json / model3.json. Newer Live2D authoring tools emit items_pinned_to_model.json as a side-car, which accidentally matches the suffix and derails the loader. The patch filters it out.

Is it applied?

Not automatically. This project uses vanilla npm install, so we cannot pre-apply patches the way pnpm + patchedDependencies or patch-package would. Two options if you need it:

  1. Manual, once per clone, from _ts_packages/:
    patch -p1 -d node_modules/pixi-live2d-display < packages/cortex-ui/patches/pixi-live2d-display.patch
    
  2. Automated, wire up patch-package:
    npm i -D patch-package
    # add "postinstall": "patch-package" to root package.json
    
    (This would touch _ts_packages/package.json which is out of scope for the current wave; leaving as a follow-up.)

Do we need it here?

Not for the bundled Haru model — Live2DPet.svelte loads the explicit model3.json URL straight from /public/live2d-models/…, bypassing the filename-scanning code paths the patch touches. The patch becomes relevant only when (a) user-uploaded ZIPs are supported or (b) a model folder contains an items_pinned_to_model.json sidecar.