Vendor OpenClaw source as Adolf fork baseline
Some checks failed
ClawSweeper Dispatch / dispatch (push) Has been cancelled
CodeQL / Security High (actions) (push) Has been cancelled
CodeQL / Security High (channel-runtime-boundary) (push) Has been cancelled
CodeQL / Security High (core-auth-secrets) (push) Has been cancelled
CodeQL / Security High (mcp-process-tool-boundary) (push) Has been cancelled
CodeQL / Security High (network-ssrf-boundary) (push) Has been cancelled
CodeQL / Security High (plugin-trust-boundary) (push) Has been cancelled
CodeQL / Security High (process-exec-boundary) (push) Has been cancelled
Docs Sync Publish Repo / sync-publish-repo (push) Has been cancelled
Docs / docs (push) Has been cancelled
OpenClaw Stable Main Closeout / Resolve stable release closeout inputs (push) Has been cancelled
OpenClaw Stable Main Closeout / Verify stable main closeout (push) Has been cancelled
Workflow Sanity / no-tabs (push) Has been cancelled
Workflow Sanity / actionlint (push) Has been cancelled
Workflow Sanity / generated-doc-baselines (push) Has been cancelled
CI / runner-admission (push) Has been cancelled
CI / preflight (push) Has been cancelled
CI / security-fast (push) Has been cancelled
CI / pnpm-store-warmup (push) Has been cancelled
CI / build-artifacts (push) Has been cancelled
CI / native-i18n (push) Has been cancelled
CI / ${{ matrix.check_name }} (push) Has been cancelled
CI / ${{ matrix.checkName }} (push) Has been cancelled
CI / checks-node-compat-node22 (push) Has been cancelled
CI / check-bundled-channel-config-metadata (push) Has been cancelled
CI / check-dependencies (push) Has been cancelled
CI / check-guards (push) Has been cancelled
CI / check-lint (push) Has been cancelled
CI / check-prod-types (push) Has been cancelled
CI / check-shrinkwrap (push) Has been cancelled
CI / check-test-types (push) Has been cancelled
CI / check-additional-boundaries-a (push) Has been cancelled
CI / check-additional-boundaries-bcd (push) Has been cancelled
CI / check-additional-extension-bundled (push) Has been cancelled
CI / check-additional-extension-channels (push) Has been cancelled
CI / check-additional-extension-package-boundary (push) Has been cancelled
CI / check-additional-runtime-topology-architecture (push) Has been cancelled
CI / check-session-accessor-boundary (push) Has been cancelled
CI / check-session-transcript-reader-boundary (push) Has been cancelled
CI / check-docs (push) Has been cancelled
CI / skills-python (push) Has been cancelled
CI / macos-swift (push) Has been cancelled
CI / ios-build (push) Has been cancelled
CI / ci-timings-summary (push) Has been cancelled
Native App Locale Refresh / Refresh native fa (push) Has been cancelled
Native App Locale Refresh / Refresh native fr (push) Has been cancelled
Native App Locale Refresh / Refresh native hi (push) Has been cancelled
Native App Locale Refresh / Refresh native id (push) Has been cancelled
Native App Locale Refresh / Refresh native it (push) Has been cancelled
Native App Locale Refresh / Refresh native ja-JP (push) Has been cancelled
Control UI Locale Refresh / plan (push) Has been cancelled
Control UI Locale Refresh / Refresh ${{ matrix.locale }} (push) Has been cancelled
Control UI Locale Refresh / Commit control UI locale refresh (push) Has been cancelled
Live Media Runner Image / Build live media runner image (push) Has been cancelled
Native App Locale Refresh / Refresh native ar (push) Has been cancelled
Native App Locale Refresh / Refresh native de (push) Has been cancelled
Native App Locale Refresh / Refresh native es (push) Has been cancelled
Native App Locale Refresh / Refresh native ko (push) Has been cancelled
Native App Locale Refresh / Refresh native nl (push) Has been cancelled
Native App Locale Refresh / Refresh native pl (push) Has been cancelled
Native App Locale Refresh / Refresh native pt-BR (push) Has been cancelled
Native App Locale Refresh / Refresh native ru (push) Has been cancelled
Native App Locale Refresh / Refresh native sv (push) Has been cancelled
Native App Locale Refresh / Refresh native th (push) Has been cancelled
Native App Locale Refresh / Refresh native tr (push) Has been cancelled
Native App Locale Refresh / Refresh native uk (push) Has been cancelled
Native App Locale Refresh / Refresh native vi (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-CN (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-TW (push) Has been cancelled
Native App Locale Refresh / Commit native locale refresh (push) Has been cancelled
Plugin Init Scaffold Validation / Validate provider scaffold (push) Has been cancelled
Plugin NPM Release / preview_plugins_npm (push) Has been cancelled
Plugin NPM Release / Validate release publish approval (push) Has been cancelled
Plugin NPM Release / preview_plugin_pack (push) Has been cancelled
Plugin NPM Release / publish_plugins_npm (push) Has been cancelled
Sandbox Common Smoke / sandbox-common-smoke (push) Has been cancelled
Website Installer Sync / static (push) Has been cancelled
Website Installer Sync / linux-docker (push) Has been cancelled
Website Installer Sync / macos-installer (push) Has been cancelled
Website Installer Sync / windows-installer (push) Has been cancelled
Website Installer Sync / sync-website (push) Has been cancelled
Some checks failed
ClawSweeper Dispatch / dispatch (push) Has been cancelled
CodeQL / Security High (actions) (push) Has been cancelled
CodeQL / Security High (channel-runtime-boundary) (push) Has been cancelled
CodeQL / Security High (core-auth-secrets) (push) Has been cancelled
CodeQL / Security High (mcp-process-tool-boundary) (push) Has been cancelled
CodeQL / Security High (network-ssrf-boundary) (push) Has been cancelled
CodeQL / Security High (plugin-trust-boundary) (push) Has been cancelled
CodeQL / Security High (process-exec-boundary) (push) Has been cancelled
Docs Sync Publish Repo / sync-publish-repo (push) Has been cancelled
Docs / docs (push) Has been cancelled
OpenClaw Stable Main Closeout / Resolve stable release closeout inputs (push) Has been cancelled
OpenClaw Stable Main Closeout / Verify stable main closeout (push) Has been cancelled
Workflow Sanity / no-tabs (push) Has been cancelled
Workflow Sanity / actionlint (push) Has been cancelled
Workflow Sanity / generated-doc-baselines (push) Has been cancelled
CI / runner-admission (push) Has been cancelled
CI / preflight (push) Has been cancelled
CI / security-fast (push) Has been cancelled
CI / pnpm-store-warmup (push) Has been cancelled
CI / build-artifacts (push) Has been cancelled
CI / native-i18n (push) Has been cancelled
CI / ${{ matrix.check_name }} (push) Has been cancelled
CI / ${{ matrix.checkName }} (push) Has been cancelled
CI / checks-node-compat-node22 (push) Has been cancelled
CI / check-bundled-channel-config-metadata (push) Has been cancelled
CI / check-dependencies (push) Has been cancelled
CI / check-guards (push) Has been cancelled
CI / check-lint (push) Has been cancelled
CI / check-prod-types (push) Has been cancelled
CI / check-shrinkwrap (push) Has been cancelled
CI / check-test-types (push) Has been cancelled
CI / check-additional-boundaries-a (push) Has been cancelled
CI / check-additional-boundaries-bcd (push) Has been cancelled
CI / check-additional-extension-bundled (push) Has been cancelled
CI / check-additional-extension-channels (push) Has been cancelled
CI / check-additional-extension-package-boundary (push) Has been cancelled
CI / check-additional-runtime-topology-architecture (push) Has been cancelled
CI / check-session-accessor-boundary (push) Has been cancelled
CI / check-session-transcript-reader-boundary (push) Has been cancelled
CI / check-docs (push) Has been cancelled
CI / skills-python (push) Has been cancelled
CI / macos-swift (push) Has been cancelled
CI / ios-build (push) Has been cancelled
CI / ci-timings-summary (push) Has been cancelled
Native App Locale Refresh / Refresh native fa (push) Has been cancelled
Native App Locale Refresh / Refresh native fr (push) Has been cancelled
Native App Locale Refresh / Refresh native hi (push) Has been cancelled
Native App Locale Refresh / Refresh native id (push) Has been cancelled
Native App Locale Refresh / Refresh native it (push) Has been cancelled
Native App Locale Refresh / Refresh native ja-JP (push) Has been cancelled
Control UI Locale Refresh / plan (push) Has been cancelled
Control UI Locale Refresh / Refresh ${{ matrix.locale }} (push) Has been cancelled
Control UI Locale Refresh / Commit control UI locale refresh (push) Has been cancelled
Live Media Runner Image / Build live media runner image (push) Has been cancelled
Native App Locale Refresh / Refresh native ar (push) Has been cancelled
Native App Locale Refresh / Refresh native de (push) Has been cancelled
Native App Locale Refresh / Refresh native es (push) Has been cancelled
Native App Locale Refresh / Refresh native ko (push) Has been cancelled
Native App Locale Refresh / Refresh native nl (push) Has been cancelled
Native App Locale Refresh / Refresh native pl (push) Has been cancelled
Native App Locale Refresh / Refresh native pt-BR (push) Has been cancelled
Native App Locale Refresh / Refresh native ru (push) Has been cancelled
Native App Locale Refresh / Refresh native sv (push) Has been cancelled
Native App Locale Refresh / Refresh native th (push) Has been cancelled
Native App Locale Refresh / Refresh native tr (push) Has been cancelled
Native App Locale Refresh / Refresh native uk (push) Has been cancelled
Native App Locale Refresh / Refresh native vi (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-CN (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-TW (push) Has been cancelled
Native App Locale Refresh / Commit native locale refresh (push) Has been cancelled
Plugin Init Scaffold Validation / Validate provider scaffold (push) Has been cancelled
Plugin NPM Release / preview_plugins_npm (push) Has been cancelled
Plugin NPM Release / Validate release publish approval (push) Has been cancelled
Plugin NPM Release / preview_plugin_pack (push) Has been cancelled
Plugin NPM Release / publish_plugins_npm (push) Has been cancelled
Sandbox Common Smoke / sandbox-common-smoke (push) Has been cancelled
Website Installer Sync / static (push) Has been cancelled
Website Installer Sync / linux-docker (push) Has been cancelled
Website Installer Sync / macos-installer (push) Has been cancelled
Website Installer Sync / windows-installer (push) Has been cancelled
Website Installer Sync / sync-website (push) Has been cancelled
Adolf is a fork/vendored clone of github.com/openclaw/openclaw (v2026.6.11), free to diverge. Tree copied sans upstream .git; upstream remote added for future syncs. Node pinned to 24 (.nvmrc); engines already require >=22.19. Preserves docs/ARCHITECTURE.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LeqyaxJF2nbRXJtae2kNB2
This commit is contained in:
226
extensions/qa-lab/src/scenario-runtime-api.test.ts
Normal file
226
extensions/qa-lab/src/scenario-runtime-api.test.ts
Normal file
@@ -0,0 +1,226 @@
|
||||
// Qa Lab tests cover scenario runtime api plugin behavior.
|
||||
import { randomUUID } from "node:crypto";
|
||||
import * as fs from "node:fs/promises";
|
||||
import path from "node:path";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import { createQaBusState } from "./bus-state.js";
|
||||
import type { QaTransportAdapter } from "./qa-transport.js";
|
||||
import {
|
||||
createQaScenarioRuntimeApi,
|
||||
type QaScenarioRuntimeConstants,
|
||||
type QaScenarioRuntimeDeps,
|
||||
} from "./scenario-runtime-api.js";
|
||||
|
||||
function createDeps(overrides?: Partial<QaScenarioRuntimeDeps>): QaScenarioRuntimeDeps {
|
||||
const fn = vi.fn();
|
||||
return {
|
||||
fs,
|
||||
path,
|
||||
sleep: vi.fn(async () => undefined),
|
||||
randomUUID,
|
||||
runScenario: fn,
|
||||
waitForOutboundMessage: fn,
|
||||
waitForTransportOutboundMessage: fn,
|
||||
waitForChannelOutboundMessage: fn,
|
||||
waitForNoOutbound: fn,
|
||||
waitForNoTransportOutbound: fn,
|
||||
recentOutboundSummary: fn,
|
||||
formatConversationTranscript: fn,
|
||||
readTransportTranscript: fn,
|
||||
formatTransportTranscript: fn,
|
||||
fetchJson: fn,
|
||||
waitForGatewayHealthy: fn,
|
||||
waitForTransportReady: fn,
|
||||
waitForQaChannelReady: fn,
|
||||
browserRequest: fn,
|
||||
waitForBrowserReady: fn,
|
||||
browserOpenTab: fn,
|
||||
browserSnapshot: fn,
|
||||
browserAct: fn,
|
||||
webOpenPage: fn,
|
||||
webWait: fn,
|
||||
webType: fn,
|
||||
webSnapshot: fn,
|
||||
webEvaluate: fn,
|
||||
waitForConfigRestartSettle: fn,
|
||||
patchConfig: fn,
|
||||
applyConfig: fn,
|
||||
readConfigSnapshot: fn,
|
||||
createSession: fn,
|
||||
readEffectiveTools: fn,
|
||||
readSkillStatus: fn,
|
||||
readRawQaSessionStore: fn,
|
||||
readGatewayLogs: fn,
|
||||
markGatewayLogCursor: fn,
|
||||
scanGatewayLogSentinels: fn,
|
||||
assertNoGatewayLogSentinels: fn,
|
||||
readSessionTranscriptSummary: fn,
|
||||
runQaCli: fn,
|
||||
extractMediaPathFromText: fn,
|
||||
resolveGeneratedImagePath: fn,
|
||||
startAgentRun: fn,
|
||||
waitForAgentRun: fn,
|
||||
waitForAgentHistoryReply: fn,
|
||||
listCronJobs: fn,
|
||||
waitForCronRunCompletion: fn,
|
||||
findManagedDreamingCronJob: fn,
|
||||
readDoctorMemoryStatus: fn,
|
||||
forceMemoryIndex: fn,
|
||||
findSkill: fn,
|
||||
writeWorkspaceSkill: fn,
|
||||
callPluginToolsMcp: fn,
|
||||
runAgentPrompt: fn,
|
||||
ensureImageGenerationConfigured: fn,
|
||||
handleQaAction: fn,
|
||||
runRuntimeToolFixture: fn,
|
||||
extractQaToolPayload: fn,
|
||||
formatMemoryDreamingDay: fn,
|
||||
resolveSessionTranscriptsDirForAgent: fn,
|
||||
activeMemoryToggleKey: fn,
|
||||
setActiveMemorySessionDisabled: fn,
|
||||
buildAgentSessionKey: fn,
|
||||
normalizeLowercaseStringOrEmpty: fn,
|
||||
formatErrorMessage: fn,
|
||||
liveTurnTimeoutMs: fn,
|
||||
resolveQaLiveTurnTimeoutMs: fn,
|
||||
splitModelRef: fn,
|
||||
qaChannelPlugin: { id: "qa-channel" },
|
||||
hasDiscoveryLabels: fn,
|
||||
reportsDiscoveryScopeLeak: fn,
|
||||
reportsMissingDiscoveryFiles: fn,
|
||||
hasModelSwitchContinuitySignal: fn,
|
||||
...overrides,
|
||||
};
|
||||
}
|
||||
|
||||
const constants: QaScenarioRuntimeConstants = {
|
||||
imageUnderstandingPngBase64: "png-small",
|
||||
imageUnderstandingLargePngBase64: "png-large",
|
||||
imageUnderstandingValidPngBase64: "png-valid",
|
||||
};
|
||||
|
||||
const browserAndWebRuntimeTools = [
|
||||
"browserRequest",
|
||||
"waitForBrowserReady",
|
||||
"browserOpenTab",
|
||||
"browserSnapshot",
|
||||
"browserAct",
|
||||
"webOpenPage",
|
||||
"webWait",
|
||||
"webType",
|
||||
"webSnapshot",
|
||||
"webEvaluate",
|
||||
] as const;
|
||||
|
||||
describe("createQaScenarioRuntimeApi", () => {
|
||||
it("builds a markdown-flow runtime surface from the transport adapter", async () => {
|
||||
const state = createQaBusState();
|
||||
const resetSpy = vi.spyOn(state, "reset");
|
||||
const inboundSpy = vi.spyOn(state, "addInboundMessage");
|
||||
const outboundSpy = vi.spyOn(state, "addOutboundMessage");
|
||||
const readSpy = vi.spyOn(state, "readMessage");
|
||||
const waitForCondition: QaTransportAdapter["waitForCondition"] = async <T>(
|
||||
check: () => T | Promise<T | null | undefined> | null | undefined,
|
||||
): Promise<T> => {
|
||||
const value = await check();
|
||||
if (value === null || value === undefined) {
|
||||
throw new Error("waitForCondition test check did not return a value");
|
||||
}
|
||||
return value;
|
||||
};
|
||||
const sleep = vi.fn(async () => undefined);
|
||||
const env = {
|
||||
lab: { baseUrl: "http://127.0.0.1:1234" },
|
||||
transport: {
|
||||
state,
|
||||
reset: async () => {
|
||||
state.reset();
|
||||
},
|
||||
sendInbound: async (input: Parameters<typeof state.addInboundMessage>[0]) =>
|
||||
state.addInboundMessage(input),
|
||||
sendNativeCommand: async (
|
||||
input: Omit<Parameters<typeof state.addInboundMessage>[0], "nativeCommand" | "text"> & {
|
||||
command: string;
|
||||
},
|
||||
) => {
|
||||
const { command, ...message } = input;
|
||||
state.addInboundMessage({
|
||||
...message,
|
||||
text: `/${command}`,
|
||||
nativeCommand: { name: command },
|
||||
});
|
||||
},
|
||||
waitForNoOutbound: vi.fn(async () => undefined),
|
||||
waitForOutbound: vi.fn(async () => {
|
||||
throw new Error("not used");
|
||||
}),
|
||||
waitForOutboundSequence: vi.fn(async () => {
|
||||
throw new Error("not used");
|
||||
}),
|
||||
waitForCondition,
|
||||
},
|
||||
};
|
||||
const scenario = {
|
||||
id: "generic-flow",
|
||||
title: "Generic Flow",
|
||||
surface: "test",
|
||||
objective: "test",
|
||||
successCriteria: ["works"],
|
||||
sourcePath: "qa/scenarios/generic-flow.yaml",
|
||||
execution: {
|
||||
kind: "flow" as const,
|
||||
config: { expected: "value" },
|
||||
flow: {
|
||||
steps: [{ name: "noop", actions: [{ assert: "true" }] }],
|
||||
},
|
||||
},
|
||||
};
|
||||
const deps = createDeps({ sleep });
|
||||
|
||||
const api = createQaScenarioRuntimeApi({
|
||||
env,
|
||||
scenario,
|
||||
deps,
|
||||
constants,
|
||||
});
|
||||
|
||||
expect(api.lab).toBe(env.lab);
|
||||
expect(api.state).toBe(state);
|
||||
expect(api.config).toEqual({ expected: "value" });
|
||||
expect(api.waitForCondition).toBe(waitForCondition);
|
||||
expect(api.waitForChannelReady).toBe(api.waitForTransportReady);
|
||||
expect(api.waitForAgentHistoryReply).toBe(deps.waitForAgentHistoryReply);
|
||||
expect(api.markGatewayLogCursor).toBe(deps.markGatewayLogCursor);
|
||||
expect(api.assertNoGatewayLogSentinels).toBe(deps.assertNoGatewayLogSentinels);
|
||||
expect(api.readSessionTranscriptSummary).toBe(deps.readSessionTranscriptSummary);
|
||||
for (const toolName of browserAndWebRuntimeTools) {
|
||||
expect(api[toolName]).toBe(deps[toolName]);
|
||||
}
|
||||
expect(api.getTransportSnapshot()).toEqual(state.getSnapshot());
|
||||
expect(api.imageUnderstandingPngBase64).toBe("png-small");
|
||||
|
||||
const inbound = api.injectInboundMessage({
|
||||
accountId: "qa-channel",
|
||||
conversation: { id: "qa-operator", kind: "direct" },
|
||||
senderId: "qa-operator",
|
||||
text: "hello",
|
||||
});
|
||||
const outbound = api.injectOutboundMessage({
|
||||
accountId: "qa-channel",
|
||||
to: "dm:qa-operator",
|
||||
text: "hi",
|
||||
});
|
||||
expect(inbound.id.trim()).not.toBe("");
|
||||
expect(outbound.id.trim()).not.toBe("");
|
||||
api.readTransportMessage({ accountId: "qa-channel", messageId: outbound.id });
|
||||
await api.reset();
|
||||
await api.resetBus();
|
||||
await api.resetTransport();
|
||||
|
||||
expect(inboundSpy).toHaveBeenCalledTimes(1);
|
||||
expect(outboundSpy).toHaveBeenCalledTimes(1);
|
||||
expect(readSpy).toHaveBeenCalledTimes(1);
|
||||
expect(resetSpy).toHaveBeenCalledTimes(3);
|
||||
expect(sleep).toHaveBeenCalledTimes(3);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user