From 0882b85d5a178af99e24e6b77d3dc0eee36b1351 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 20 Apr 2026 20:58:21 +0100 Subject: [PATCH] refactor: share qa runtime helpers --- extensions/qa-lab/src/suite-runtime-flow.ts | 36 ++++++++----------- .../qa-lab/src/suite-runtime-transport.ts | 19 ++-------- 2 files changed, 16 insertions(+), 39 deletions(-) diff --git a/extensions/qa-lab/src/suite-runtime-flow.ts b/extensions/qa-lab/src/suite-runtime-flow.ts index c87af1617d9..32185af2517 100644 --- a/extensions/qa-lab/src/suite-runtime-flow.ts +++ b/extensions/qa-lab/src/suite-runtime-flow.ts @@ -98,7 +98,7 @@ type QaSuiteScenarioResult = { details?: string; }; -function createQaSuiteScenarioDeps(params: { +type QaSuiteScenarioDepsParams = { env: QaSuiteScenarioFlowEnv; runScenario: (name: string, steps: QaSuiteStep[]) => Promise; splitModelRef: (ref: string) => { provider: string; model: string } | null; @@ -111,7 +111,18 @@ function createQaSuiteScenarioDeps(params: { env: Pick, fallbackMs: number, ) => number; -}) { +}; + +type QaSuiteScenarioFlowApiParams = QaSuiteScenarioDepsParams & { + scenario: QaSeedScenarioWithSource; + constants: { + imageUnderstandingPngBase64: string; + imageUnderstandingLargePngBase64: string; + imageUnderstandingValidPngBase64: string; + }; +}; + +function createQaSuiteScenarioDeps(params: QaSuiteScenarioDepsParams) { return { fs, path, @@ -185,26 +196,7 @@ function createQaSuiteScenarioDeps(params: { }; } -export function createQaSuiteScenarioFlowApi(params: { - env: QaSuiteScenarioFlowEnv; - scenario: QaSeedScenarioWithSource; - runScenario: (name: string, steps: QaSuiteStep[]) => Promise; - splitModelRef: (ref: string) => { provider: string; model: string } | null; - formatErrorMessage: (error: unknown) => string; - liveTurnTimeoutMs: ( - env: Pick, - fallbackMs: number, - ) => number; - resolveQaLiveTurnTimeoutMs: ( - env: Pick, - fallbackMs: number, - ) => number; - constants: { - imageUnderstandingPngBase64: string; - imageUnderstandingLargePngBase64: string; - imageUnderstandingValidPngBase64: string; - }; -}) { +export function createQaSuiteScenarioFlowApi(params: QaSuiteScenarioFlowApiParams) { return createQaScenarioRuntimeApi({ env: params.env, scenario: params.scenario, diff --git a/extensions/qa-lab/src/suite-runtime-transport.ts b/extensions/qa-lab/src/suite-runtime-transport.ts index e1f805591f1..0739d3fdbb2 100644 --- a/extensions/qa-lab/src/suite-runtime-transport.ts +++ b/extensions/qa-lab/src/suite-runtime-transport.ts @@ -2,27 +2,12 @@ import { setTimeout as sleep } from "node:timers/promises"; import { createFailureAwareTransportWaitForCondition, findFailureOutboundMessage as findTransportFailureOutboundMessage, + waitForQaTransportCondition, type QaTransportState, } from "./qa-transport.js"; import { extractQaFailureReplyText } from "./reply-failure.js"; import type { QaBusMessage } from "./runtime-api.js"; -async function waitForCondition( - check: () => T | Promise | null | undefined, - timeoutMs = 15_000, - intervalMs = 100, -): Promise { - const startedAt = Date.now(); - while (Date.now() - startedAt < timeoutMs) { - const value = await check(); - if (value !== null && value !== undefined) { - return value; - } - await sleep(intervalMs); - } - throw new Error(`timed out after ${timeoutMs}ms`); -} - function findFailureOutboundMessage( state: QaTransportState, options?: { sinceIndex?: number; cursorSpace?: "all" | "outbound" }, @@ -40,7 +25,7 @@ async function waitForOutboundMessage( timeoutMs = 15_000, options?: { sinceIndex?: number }, ) { - return await waitForCondition(() => { + return await waitForQaTransportCondition(() => { const failureMessage = findFailureOutboundMessage(state, options); if (failureMessage) { throw new Error(extractQaFailureReplyText(failureMessage.text) ?? failureMessage.text);