From ca92b4fda440ff06545ae1babdd44aaf59e59918 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 20 Jul 2026 15:38:21 +0200 Subject: [PATCH] fix: keep workbench submit available during SSE replay --- web/hwlab-cloud-web/src/stores/workbench-session.test.ts | 6 +++--- web/hwlab-cloud-web/src/stores/workbench-session.ts | 3 --- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/web/hwlab-cloud-web/src/stores/workbench-session.test.ts b/web/hwlab-cloud-web/src/stores/workbench-session.test.ts index 0c1c4cc9..e4dff3ce 100644 --- a/web/hwlab-cloud-web/src/stores/workbench-session.test.ts +++ b/web/hwlab-cloud-web/src/stores/workbench-session.test.ts @@ -65,13 +65,13 @@ test("composer treats failed message with terminal body as sealed terminal turn" assert.equal(composer.targetTraceId, null); }); -test("composer blocks turn submission until the live session stream is connected", () => { +test("composer keeps turn submission available while Kafka replay connects", () => { const sessionId = "ses_realtime_connecting"; const connecting = resolveComposerState({ messages: [], activeSessionId: sessionId, chatPending: false, realtimeReady: false }); const connected = resolveComposerState({ messages: [], activeSessionId: sessionId, chatPending: false, realtimeReady: true }); - assert.equal(connecting.disabled, true); - assert.equal(connecting.disabledReason, "realtime_connecting"); + assert.equal(connecting.disabled, false); + assert.equal(connecting.disabledReason, null); assert.equal(connecting.sessionId, sessionId); assert.equal(connected.disabled, false); }); diff --git a/web/hwlab-cloud-web/src/stores/workbench-session.ts b/web/hwlab-cloud-web/src/stores/workbench-session.ts index 40f0d381..8199544f 100644 --- a/web/hwlab-cloud-web/src/stores/workbench-session.ts +++ b/web/hwlab-cloud-web/src/stores/workbench-session.ts @@ -95,9 +95,6 @@ export function resolveComposerState(input: { messages: ChatMessage[]; sessions? const effectiveSessionId = firstNonEmptyString(turn?.sessionId, currentRequest?.sessionId, active?.sessionId, sessionId); const threadId = firstNonEmptyString(turn?.threadId, currentRequest?.threadId, active?.threadId); const canSteer = Boolean(effectiveSessionId && activeTraceId && activeByStatus && !terminal); - if (effectiveSessionId && input.realtimeReady === false) { - return { disabled: true, disabledReason: "realtime_connecting", submitMode: canSteer ? "steer" : "turn", route: canSteer ? "/v1/agent/chat/steer" : "/v1/agent/chat", targetTraceId: canSteer ? activeTraceId : null, sessionId: effectiveSessionId, threadId }; - } if (canSteer) return { disabled: false, disabledReason: null, submitMode: "steer", route: "/v1/agent/chat/steer", targetTraceId: activeTraceId, sessionId: effectiveSessionId, threadId }; if (!effectiveSessionId) return { disabled: true, disabledReason: "session_required", submitMode: "turn", route: "/v1/agent/chat", targetTraceId: null, sessionId: null, threadId }; return { disabled: false, disabledReason: null, submitMode: "turn", route: "/v1/agent/chat", targetTraceId: null, sessionId: effectiveSessionId, threadId };