fix(qa-lab): harden telegram qa artifacts

This commit is contained in:
Ayaan Zaidi
2026-04-10 21:33:47 +05:30
parent d69cc5da5c
commit ecb3e0a62d
5 changed files with 122 additions and 11 deletions

View File

@@ -22,6 +22,21 @@ type InterruptibleServer = {
stop(): Promise<void>;
};
function resolveRepoRelativeOutputDir(repoRoot: string, outputDir?: string) {
if (!outputDir) {
return undefined;
}
if (path.isAbsolute(outputDir)) {
throw new Error("--output-dir must be a relative path inside the repo root.");
}
const resolved = path.resolve(repoRoot, outputDir);
const relative = path.relative(repoRoot, resolved);
if (relative.startsWith("..") || path.isAbsolute(relative)) {
throw new Error("--output-dir must stay within the repo root.");
}
return resolved;
}
function resolveQaManualLaneModels(opts: {
providerMode: QaProviderMode;
primaryModel?: string;
@@ -242,7 +257,7 @@ export async function runQaSuiteCommand(opts: {
if (runner === "multipass") {
const result = await runQaMultipass({
repoRoot,
outputDir: opts.outputDir ? path.resolve(repoRoot, opts.outputDir) : undefined,
outputDir: resolveRepoRelativeOutputDir(repoRoot, opts.outputDir),
providerMode,
primaryModel: opts.primaryModel,
alternateModel: opts.alternateModel,
@@ -265,7 +280,7 @@ export async function runQaSuiteCommand(opts: {
}
const result = await runQaSuiteFromRuntime({
repoRoot,
outputDir: opts.outputDir ? path.resolve(repoRoot, opts.outputDir) : undefined,
outputDir: resolveRepoRelativeOutputDir(repoRoot, opts.outputDir),
providerMode,
primaryModel: opts.primaryModel,
alternateModel: opts.alternateModel,
@@ -296,7 +311,7 @@ export async function runQaTelegramCommand(opts: {
opts.providerMode === undefined ? "live-frontier" : normalizeQaProviderMode(opts.providerMode);
const result = await runTelegramQaLive({
repoRoot,
outputDir: opts.outputDir ? path.resolve(repoRoot, opts.outputDir) : undefined,
outputDir: resolveRepoRelativeOutputDir(repoRoot, opts.outputDir),
providerMode,
primaryModel: opts.primaryModel,
alternateModel: opts.alternateModel,
@@ -328,7 +343,7 @@ export async function runQaCharacterEvalCommand(opts: {
const judges = parseQaModelSpecs("--judge-model", opts.judgeModel);
const result = await runQaCharacterEval({
repoRoot,
outputDir: opts.outputDir ? path.resolve(repoRoot, opts.outputDir) : undefined,
outputDir: resolveRepoRelativeOutputDir(repoRoot, opts.outputDir),
models: candidates.models,
scenarioId: opts.scenario,
candidateFastMode: opts.fast,
@@ -420,7 +435,10 @@ export async function runQaDockerScaffoldCommand(opts: {
bindUiDist?: boolean;
}) {
const repoRoot = path.resolve(opts.repoRoot ?? process.cwd());
const outputDir = path.resolve(repoRoot, opts.outputDir);
const outputDir = resolveRepoRelativeOutputDir(repoRoot, opts.outputDir);
if (!outputDir) {
throw new Error("--output-dir is required.");
}
const result = await writeQaDockerHarnessFiles({
outputDir,
repoRoot,
@@ -457,7 +475,7 @@ export async function runQaDockerUpCommand(opts: {
const repoRoot = path.resolve(opts.repoRoot ?? process.cwd());
const result = await runQaDockerUp({
repoRoot,
outputDir: opts.outputDir ? path.resolve(repoRoot, opts.outputDir) : undefined,
outputDir: resolveRepoRelativeOutputDir(repoRoot, opts.outputDir),
gatewayPort: Number.isFinite(opts.gatewayPort) ? opts.gatewayPort : undefined,
qaLabPort: Number.isFinite(opts.qaLabPort) ? opts.qaLabPort : undefined,
providerBaseUrl: opts.providerBaseUrl,
@@ -479,3 +497,7 @@ export async function runQaMockOpenAiCommand(opts: { host?: string; port?: numbe
});
await runInterruptibleServer("QA mock OpenAI", server);
}
export const __testing = {
resolveRepoRelativeOutputDir,
};