2477 Commits
Author SHA1 Message Date
Neko 8406c9e15d feat(ui-timeline): add a headless timeline and the AIRI timeline (#3267) 2026-10-30 18:50:48 +08:00
Neko dc5865d1eb fix(stage-tamagotchi,stage-pages): bundle the voiceprint model, explain its download failures, and remove the dead resources store (#3268) 2026-10-30 18:34:16 +08:00
Neko e13f931efd fix(testing-audio): open the Apple Speech case in the settings window (#3266) 2026-10-30 17:57:31 +08:00
Neko 6d73d2c6af feat(timeline-canvas): add a canvas renderer for timeline rows (#3247) 2026-10-30 17:49:40 +08:00
github-actions[bot]andCrowdin Bot 1ff8dd6300 chore(i18n): update translations (#3261)
This PR contains updated translations from Crowdin. Created from [GitHub
Actions](https://github.com/moeru-ai/airi/blob/main/.github/workflows/crowdin-cron-sync.yml).

You can review the source of translations
[here](https://crowdin.com/project/proj-airi)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2026-10-30 17:45:46 +08:00
Neko 8f18f3cd39 fix(stage-shared,stage-ui,stage-tamagotchi): explain model download failures and add retry (#3260) 2026-10-30 17:45:13 +08:00
Neko 7c61353f79 feat(ui-panes): add a docking workbench package (#3249) 2026-10-30 17:43:37 +08:00
Neko cb5e30c280 fix(stage-ui): wait for the permission query before the mobile picker requests access (#3265) 2026-10-30 17:40:54 +08:00
Neko 5c75a5822c feat(trace-kit): add the trace event stream package (#3236) 2026-10-30 17:39:52 +08:00
Neko be1f92f2df fix(testing-audio): lower Live2D settings in audio cases (#3264) 2026-10-30 17:36:36 +08:00
Neko 75e9846166 feat(ui): add UtilityButton and CopyableLabel (#3248) 2026-10-30 16:51:38 +08:00
Neko 158d8afff4 feat(stage-layouts): make the idle mobile composer narrower (#3258) 2026-10-30 16:00:08 +08:00
Neko 8bf31e0f7e refactor(testing-audio): remove the vadReady probe (#3252) 2026-10-30 15:54:02 +08:00
Neko 147ce7fe57 fix(stage-ui): request microphone access when the picker opens in the mobile app (#3259) 2026-10-30 15:53:41 +08:00
Neko 2b57efcf90 fix(stage-layouts): remove the hearing status from the mobile stage (#3257) 2026-10-30 15:53:05 +08:00
mullung 08d0f01a01 fix(i18n): unify Korean terms and fill missing Korean strings (#3253) 2026-10-30 08:53:39 +08:00
Neko f5365de1c4 refactor(ui): match select and combobox borders to input (#3256) 2026-10-30 08:47:29 +08:00
Neko 3a425f50d1 refactor(stage-ui): remove decorative borders (#3255) 2026-10-30 08:38:19 +08:00
Neko aea0d8a461 refactor(stage-ui): show selection with fills instead of border colors (#3254) 2026-10-30 08:25:48 +08:00
Neko ec867821d3 fix(testing-audio): turn on Web listening through the Hearing settings (#3250) 2026-10-30 06:50:04 +08:00
Neko 84f2e3bd26 fix(testing-audio): count each span one time when two Electron windows hold it (#3246) 2026-10-30 06:31:40 +08:00
Neko 409f542cf0 feat(stage-ui): show voice draft problems as a count with a hover list (#3245) 2026-10-30 06:17:28 +08:00
Neko Ayaka c32506cd2b release: v0.14.0 2026-10-30 02:27:22 +08:00
Neko 1cb2a87d21 fix(audio): share the capture AudioContext between microphone connections (#3242) 2026-10-30 02:12:15 +08:00
蓝莓🫐 2c4d66c6bb refactor(stage-ui,stage-pages): keep long-term memory in IndexedDB (#3241) 2026-10-30 02:11:18 +08:00
Neko 6599f9c21a fix(stream-kit): remove a catch-up subscriber whose listener throws (#3240) 2026-10-30 02:06:13 +08:00
Neko d98a8d435d feat(stream-kit): add buffers, trackers, and a catch-up feed for event streams (#3239) 2026-10-30 01:45:50 +08:00
Neko 96a71be5f8 refactor(stage-ui,stage-tamagotchi): declare backdrop surfaces and let components own their fill (#3238) 2026-10-30 01:45:24 +08:00
蓝莓🫐 ae9dfe5ec9 refactor(stage-ui): keep recipes in IndexedDB (#3235)
## Summary

Recipes (skills) were in `localStorage` under `recipes/custom`, as one
list. `localStorage` holds a few megabytes, and each change wrote the
whole list. This PR moves the recipes to IndexedDB, one record for each
recipe.

The data model ADR lists `Recipe` as a Document entity. Each record has
the fields that a later sync needs: the recipe id, the time of addition,
the time of the last change, and a tombstone for a removal.

## Changes

- `recipes.repo.ts` keeps the recipes in the `airi-recipes` database.
The list keeps the order of addition.
- A removal leaves a tombstone. Deleting all data clears the database.
- After a change, the other windows read the recipes again through a
`BroadcastChannel`.
- The store moves the recipes from `recipes/custom` once, with their ids
and order. The ids stay, because sessions and runs refer to a recipe by
its id. The move has a `// NOTICE:` and a removal condition.
- Adding, proposing, editing, and removing a recipe are async. The
proposal tool and the Settings page wait for them. Reads stay
synchronous, from the recipes that the window read last.
- The `Proposals` switch is a setting, so it stays in `localStorage`.
- The store tests run in the browser project with real IndexedDB. Node
tests use an in-memory repo mock.

The ADR `docs/ai/adr/2026-10-10-skills-automations-and-memory.md`
describes the storage.

## Verification

- `pnpm -F @proj-airi/core-agent build`, then `pnpm -F
@proj-airi/stage-ui typecheck` and `pnpm -F @proj-airi/stage-pages
typecheck`: pass.
- The commit hook ran `moeru-lint --fix`.
- Tests did not run locally. CI runs them.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-10-29 22:38:22 +07:00
Neko 6399a0f158 fix(ui): keep Alert readable on translucent surfaces (#3232) 2026-10-29 21:12:22 +08:00
Neko 8bad1dfcb3 feat(stage-tamagotchi): add APP_IGNORE_FOCUS to open windows without focus (#3231) 2026-10-29 21:10:33 +08:00
蓝莓🫐 d086e9e16a fix(stage-ui-live2d): draw the presence bubble in front of the model (#3225) 2026-10-29 20:09:22 +08:00
Neko c49201fd9b feat(stage-ui,stage-layouts,stage-tamagotchi): redesign the web voice composer and add voice calls (#3223) 2026-10-29 19:54:55 +08:00
Neko e8dc7b84ca fix(stage-ui): follow the Histoire dark mode in stories (#3222) 2026-10-29 17:23:10 +08:00
Neko a62f1cbea9 refactor: migrate status banners to Alert (#3224) 2026-10-29 16:58:46 +08:00
Neko 0367c4001f feat(ui): add Alert for status messages (#3221) 2026-10-29 16:44:00 +08:00
Neko e1df804cf3 feat(stage-ui,stage-tamagotchi,stage-layouts): add a microphone switch that closes the microphone for every feature (#3210) 2026-10-29 15:15:23 +08:00
mullungandClaude Opus 5.5 0157be3a94 fix(i18n): correct outdated and wrong Korean strings (#3216)
## Summary

Some Korean strings were wrong or out of date. This PR corrects 14
values in 3 files under `packages/i18n/src/locales/ko/`.

- `tamagotchi.stage.controls-island.login`: the Controls Island sign-in
button said 가입하기, which means "sign up". It now says 로그인, as the other
Korean sign-in strings do.
- `settings.pages.connection.*` and
`settings.websocket-secure-enabled.*`: 2770267dc rewrote 12 English
strings on the connection settings page. The Korean values kept the
older text. Eight of them were still English, for example "Connect from
Stage Pocket" for the current "Pairing". They now follow the current
English text.
- The glossary says the mobile edition reads as "Mobile ver." to end
users. The Korean text now says 모바일 버전 and does not use "Stage Pocket"
or "pocket".
- `stage.chat.sessions.new`: the new-conversation button said "+ New"
next to its own plus icon. It now says 새 대화.

This PR is independent. It changes only the `ko` locale. Other locales
still have the same older English in `pages.connection`, but Crowdin
owns them, so this PR does not touch them.

`tamagotchi.stage.about.links.github` keeps `Github`. `GitHub` equals
the English text, and deleting the key fails the locale check.

## Verification

```text
node .github/scripts/check-locales.ts --root packages/i18n/src/locales --base <upstream/main locales> --source-changes warning   # passed
pnpm exec eslint packages/i18n/src/locales/ko/settings.yaml packages/i18n/src/locales/ko/stage.yaml packages/i18n/src/locales/ko/tamagotchi/stage.yaml   # passed
```

- The pre-commit hook (`moeru-lint --fix`) passed.
- No ko value in the 3 files is equal to its English value.

## Visual changes

| Before | After |
| --- | --- |
|
![](https://github.com/user-attachments/assets/a9851e38-4b99-4ddf-95a1-b48c96f18a1b)
|
![](https://github.com/user-attachments/assets/5932a58e-1de5-4be8-88f1-7b88ca4e573d)
|
| Main window / Controls Island menu, signed out, `ko` | Main window /
Controls Island menu, signed out, `ko` |
|
![](https://github.com/user-attachments/assets/108c1128-2fc0-4887-9a7c-5ec0cd49280c)
|
![](https://github.com/user-attachments/assets/ba348e4d-2809-4af9-9e68-a206e57218f3)
|
| Settings / Connection, `ko` | Settings / Connection, `ko` |
|
![](https://github.com/user-attachments/assets/c25912d4-7378-48f6-9075-c094197aad31)
|
![](https://github.com/user-attachments/assets/5e25ee3e-4aa4-4f06-800c-6d99a3b28435)
|
| Floating chat / Conversations drawer, `ko` | Floating chat /
Conversations drawer, `ko` |

How I took the captures:

- I built stage-tamagotchi with `pnpm -F @proj-airi/stage-tamagotchi
build` on Windows 11 and captured it with `vishot capture --target
electron`.
- Each run used a new empty profile (`APP_USER_DATA_PATH`) with
`settings/language` set to `ko` and onboarding marked as done.
- The "Before" build used the same commit with the 3 `ko` files restored
from the merge base (`71b3c178e`). The merge base and this branch differ
only in these files.
- The `qr.token-hint` and `qr.image-alt` values are not in the captures.
They show only when the Pairing panel is open, and that panel shows a
live pairing QR code.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 06:16:31 +00:00
Neko Ayaka 5d97ac41b7 release: v0.13.1 2026-10-29 07:19:40 +08:00
Neko 0fa5e9bb1f refactor(stage-ui): remove the voice draft card from web and mobile (#3207) 2026-10-29 06:53:09 +08:00
Neko 440d867f11 feat(stage-tamagotchi): add an option to turn off automatic update downloads (#3206) 2026-10-29 06:28:19 +08:00
Neko f815c3c072 feat(ui): redesign the error panel and use Maple Mono (#3203) 2026-10-29 02:13:00 +08:00
Neko 927d1facc1 fix(stage-ui): keep stores off disposed Pinias (#3201) 2026-10-28 23:50:24 +08:00
Neko 48a8b0b7dc test(stage-ui): load the UnoCSS preflight in the motion workbench test (#3199) 2026-10-28 23:07:21 +08:00
Neko 6886904208 fix(ui): keep range thumbs buildable without the chromatic preset (#3194) 2026-10-28 21:50:13 +08:00
Neko 3a6c65b798 refactor: move hand-made tints to chromatic colours (#3191) 2026-10-28 21:36:29 +08:00
CyberSprout a2bef067be fix(stage-ui): keep wake word preparation when an equal catalog arrives during load (#3104) 2026-10-28 21:12:16 +08:00
jim139129 32054c07cf fix(security): update runtimes for CVE-2026-111497 (#3184) 2026-10-28 20:45:56 +08:00
Neko 61bda9be55 chore(deps): bump chromatic to v2 (#3181) 2026-10-28 17:42:57 +08:00
github-actions[bot]andCrowdin Bot 89b84c51bf chore(i18n): update translations (#3168)
This PR contains updated translations from Crowdin. Created from [GitHub
Actions](https://github.com/moeru-ai/airi/blob/main/.github/workflows/crowdin-cron-sync.yml).

You can review the source of translations
[here](https://crowdin.com/project/proj-airi)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2026-10-28 17:38:18 +08:00