feat(app): Sprachnachricht zu Anhaengen + Zwischenruf per Sprache
Bisher war die Eingabeleiste ein Entweder-oder: sobald Text im Feld stand oder ein Anhang dranhing, verschwand das Mikro. Damit ging genau das nicht, was man eigentlich will — ein Bild anhaengen und den Auftrag dazu SPRECHEN. Und ein Zwischenruf ging nur getippt. Das Mikro ist jetzt immer da; Senden-Pfeil und Mund-/Ohr-Knoepfe weichen je nach Lage, damit die Zeile nicht ueberlaeuft. Anhang + Sprachnachricht: - Mikro antippen mit wartenden Anhaengen laedt sie SOFORT hoch (parallel zum Reden) und markiert sie mit awaitVoice + clientMsgId. - Die Bridge schickt solche Anhaenge nicht nach 0.8s alleine ans Brain, sondern wartet auf den stt_endpoint und fuehrt Anhang + gesprochenen Satz zu EINEM Turn zusammen. Ohne das sah ARIA ein Bild ohne Auftrag und danach einen Satz ohne Bild. - Der Merge ist strikt an die clientMsgId gebunden (require_match): eine Sprachnachricht, die zufaellig waehrend eines fremden Uploads fertig wird, reisst dessen Anhaenge nicht an sich. Der Text-Pfad behaelt seinen Fallback. - Bild und gesprochener Text landen in EINER Bubble (gemeinsame audioRequestId). - Klappt das Mikro nicht, bleibt die Bubble mit den Bildern stehen statt zu verschwinden — die Dateien sind ja schon auf dem Server. - Das Notfall-Fenster (420s) liegt ueber dem Aufnahme-Hard-Cap von 5 Minuten, sonst waeren die Anhaenge bei einer langen Aufnahme vorher alleine raus. Zwischenruf per Sprache: - Der 📣-Knopf erscheint jetzt immer, wenn ARIA im Kontext arbeitet. Mit Text schickt er sofort (wie bisher), ohne Text schaltet er die naechste Aufnahme scharf (sichtbar hervorgehoben, gilt fuer genau eine Aufnahme). - Eine so markierte Aufnahme geht per stt_stream_start als interject raus; die Bridge schiebt sie in den laufenden Turn statt sie anzustellen. - Dabei wird der laufende Turn NICHT abgebrochen (das war der Sinn) — nur die Wiedergabe stoppt, damit ARIA nicht ins offene Mikro redet. - Die Bubble zeigt 📣 Zwischenruf statt 🎤, damit man nicht auf eine eigene Antwort wartet. Merge-Logik gegen den echten Bridge-Code getestet (6 Faelle), tsc sauber. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1141,6 +1141,13 @@ class AudioService {
|
||||
* Leer = Hauptchat. Ohne Prefix / Sticky landet die STT-Nachricht damit
|
||||
* automatisch in dem Kontext den Stefan gerade sieht. */
|
||||
projectId?: string;
|
||||
/** clientMsgId wartender Anhaenge: diese Aufnahme ist ihre Beschreibung.
|
||||
* Die Bridge fuehrt Anhang + gesprochenen Satz darueber zu EINEM Turn
|
||||
* zusammen, statt das Bild ohne Auftrag und den Satz ohne Bild zu sehen. */
|
||||
clientMsgId?: string;
|
||||
/** Zwischenruf: der Text geht in den LAUFENDEN Turn, nicht als neue
|
||||
* Anfrage in die Warteschlange (Sprach-Gegenstueck zum 📣-Knopf). */
|
||||
interject?: boolean;
|
||||
}): Promise<{ requestId: string; ok: boolean; error?: string }> {
|
||||
if (this.recordingState !== 'idle') {
|
||||
console.warn('[Audio] startStreamingRecording: bereits aktiv (state=%s)', this.recordingState);
|
||||
@@ -1245,6 +1252,8 @@ class AudioService {
|
||||
sampleRate: 16000,
|
||||
projectId: opts.projectId || '',
|
||||
targetInstance: this.streamTargetInstance,
|
||||
...(opts.clientMsgId ? { clientMsgId: opts.clientMsgId } : {}),
|
||||
...(opts.interject ? { interject: true } : {}),
|
||||
});
|
||||
|
||||
const started = await PcmStreamRecorder.start();
|
||||
|
||||
Reference in New Issue
Block a user