feat(vela): support end-to-end mocked turn cancelation

This commit is contained in:
2026-04-08 19:49:31 +02:00
parent ff78fc4c8f
commit 0d5b53be00
7 changed files with 197 additions and 9 deletions

View File

@@ -22,7 +22,8 @@ function createSessionRecord() {
audioChunkCount: 0,
started: false,
mockedTurnInFlight: false,
mockedTurnTimers: []
mockedTurnTimers: [],
activeMockedTurnId: null
};
}
@@ -33,11 +34,17 @@ function clearMockedTurn(session) {
session.mockedTurnTimers = [];
session.mockedTurnInFlight = false;
session.activeMockedTurnId = null;
}
function scheduleMockedTurnStep(session, delay, callback) {
function scheduleMockedTurnStep(session, turnId, delay, callback) {
const timer = setTimeout(() => {
session.mockedTurnTimers = session.mockedTurnTimers.filter((activeTimer) => activeTimer !== timer);
if (!session.mockedTurnInFlight || session.activeMockedTurnId !== turnId) {
return;
}
callback();
}, delay);
@@ -53,23 +60,25 @@ function startMockedTurn(socket, session) {
clearMockedTurn(session);
session.audioChunkCount = 0;
session.mockedTurnInFlight = true;
const turnId = crypto.randomUUID();
session.activeMockedTurnId = turnId;
updateSessionState(socket, session, 'listening');
scheduleMockedTurnStep(session, 75, () => {
scheduleMockedTurnStep(session, turnId, 75, () => {
sendSocketMessage(socket, 'transcript.final', { text: MOCKED_USER_TRANSCRIPT });
updateSessionState(socket, session, 'thinking');
});
scheduleMockedTurnStep(session, 150, () => {
scheduleMockedTurnStep(session, turnId, 150, () => {
updateSessionState(socket, session, 'speaking');
sendSocketMessage(socket, 'response.text.delta', { text: '[mocked assistant] ' });
});
scheduleMockedTurnStep(session, 225, () => {
scheduleMockedTurnStep(session, turnId, 225, () => {
sendSocketMessage(socket, 'response.text.delta', { text: MOCKED_ASSISTANT_RESPONSE.replace('[mocked assistant] ', '') });
});
scheduleMockedTurnStep(session, 300, () => {
scheduleMockedTurnStep(session, turnId, 300, () => {
sendSocketMessage(socket, 'response.completed', {});
clearMockedTurn(session);
updateSessionState(socket, session, 'idle');