Files
moeka-project/packages
Zhou fanqi 39b68ddf12 fix(stage-ui): robust spark:command result + TTS session isolation (#1949)
## Summary

Two small, generic robustness fixes, split out of the Minecraft desktop
integration (#1916) so they can land independently of that rework — as
suggested in @shinohara-rin's review:

> The generic fixes in this PR, like the TTS session cleanup and
`spark:command` result handling, seem separable and worth keeping in a
smaller PR.

Both are in shared `stage-ui` runtime code and contain **no
Minecraft-specific logic**.

## What's included

- **`spark:command` result handling**
(`tools/character/orchestrator/spark-command.ts`):
`command.destinations` may be `undefined` — the channel sender
(`stores/llm.ts` `sendSparkCommand`) deletes it to broadcast to all
authenticated peers. The success message's `.join()` therefore surfaced
`Cannot read properties of undefined (reading 'join')` back to the LLM
even though the send had already succeeded. Guard it and report a
broadcast instead.
- **TTS session isolation** (`components/scenes/Stage.vue`
`openTtsSession`): a completing/erroring session now only clears the
module-level `currentSession` if it **is** that session. The previous
code cleared it whenever any `stream-` session completed, which becomes
unsafe once sessions exist that are not assigned to `currentSession`
(e.g. one-off read-aloud sessions) — one of those finishing would null a
still-active chat session and drop the rest of the reply.

## How tested

```bash
pnpm -F @proj-airi/stage-ui exec vitest run src/tools/character/orchestrator/spark-command.test.ts  # 9 passed (+1 new)
pnpm -F @proj-airi/stage-ui typecheck   # 0 errors
pnpm exec eslint <changed files>        # 0 problems
```

- Regression test for the broadcast-destinations result message.

## Context

This is the first, low-risk slice of reworking the Minecraft↔desktop
integration around the neutral Context Flow architecture (per the #1916
review). The Minecraft relay/read-aloud behavior will be reintroduced
through a Minecraft-owned adapter in a follow-up.

---------
2026-06-10 14:47:25 +08:00
..
2026-05-07 19:36:33 +08:00
2026-06-07 20:31:22 +08:00
2026-06-07 20:31:22 +08:00
2026-06-07 20:31:22 +08:00
2026-05-07 19:36:33 +08:00
2026-05-07 19:36:33 +08:00
2026-05-07 19:36:33 +08:00
2026-05-07 19:36:33 +08:00
2026-05-07 19:36:33 +08:00
2026-06-07 20:31:22 +08:00
2026-05-07 19:36:33 +08:00
2026-05-07 19:36:33 +08:00
2026-06-07 20:31:22 +08:00
2026-05-07 19:36:33 +08:00