mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-14 08:00:45 +00:00
* refactor(qa): add shared transport contract and suite migration * refactor(qa): harden worker gateway startup * fix(qa): scope waits and sanitize shutdown artifacts * fix(qa): confine artifacts and redact preserved logs * fix(qa): block symlink escapes in artifact paths * fix(gateway): clear shutdown race timers * fix(qa): harden shutdown cleanup paths * fix(qa): sanitize gateway logs in thrown errors * fix(qa): harden suite startup and artifact paths * fix(qa): stage bundled plugins from mutated config * fix(qa): broaden gateway log bearer redaction * fix(qa-channel): restore runtime export * fix(qa): stop failed gateway startups as a process tree * fix(qa-channel): load runtime hook from api surface
71 lines
1.5 KiB
TypeScript
71 lines
1.5 KiB
TypeScript
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
import type { QaTransportActionName, QaTransportState } from "./qa-transport.js";
|
|
|
|
export type QaScenarioStepContext = {
|
|
state: QaTransportState;
|
|
performAction?: (
|
|
action: QaTransportActionName,
|
|
args: Record<string, unknown>,
|
|
) => Promise<unknown>;
|
|
};
|
|
|
|
export type QaScenarioStep = {
|
|
name: string;
|
|
run: (ctx: QaScenarioStepContext) => Promise<string | void>;
|
|
};
|
|
|
|
export type QaScenarioDefinition = {
|
|
name: string;
|
|
steps: QaScenarioStep[];
|
|
};
|
|
|
|
export type QaScenarioStepResult = {
|
|
name: string;
|
|
status: "pass" | "fail";
|
|
details?: string;
|
|
};
|
|
|
|
export type QaScenarioResult = {
|
|
name: string;
|
|
status: "pass" | "fail";
|
|
steps: QaScenarioStepResult[];
|
|
details?: string;
|
|
};
|
|
|
|
export async function runQaScenario(
|
|
definition: QaScenarioDefinition,
|
|
ctx: QaScenarioStepContext,
|
|
): Promise<QaScenarioResult> {
|
|
const steps: QaScenarioStepResult[] = [];
|
|
|
|
for (const step of definition.steps) {
|
|
try {
|
|
const details = await step.run(ctx);
|
|
steps.push({
|
|
name: step.name,
|
|
status: "pass",
|
|
...(details ? { details } : {}),
|
|
});
|
|
} catch (error) {
|
|
const details = formatErrorMessage(error);
|
|
steps.push({
|
|
name: step.name,
|
|
status: "fail",
|
|
details,
|
|
});
|
|
return {
|
|
name: definition.name,
|
|
status: "fail",
|
|
steps,
|
|
details,
|
|
};
|
|
}
|
|
}
|
|
|
|
return {
|
|
name: definition.name,
|
|
status: "pass",
|
|
steps,
|
|
};
|
|
}
|