diff --git a/extensions/qa-lab/src/live-transports/matrix/legacy-scenario-parity.test.ts b/extensions/qa-lab/src/live-transports/matrix/legacy-scenario-parity.test.ts deleted file mode 100644 index eca06d619cc7..000000000000 --- a/extensions/qa-lab/src/live-transports/matrix/legacy-scenario-parity.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { readQaBootstrapScenarioCatalog, readQaScenarioById } from "../../scenario-catalog.js"; - -const RENAMED_MATRIX_SCENARIOS = { - "matrix-thread-follow-up": "thread-follow-up", - "matrix-thread-isolation": "thread-isolation", - "matrix-subagent-thread-spawn": "subagent-thread-spawn", - "matrix-top-level-reply-shape": "channel-top-level-reply-shape", - "matrix-room-thread-reply-override": "thread-reply-override", - "matrix-dm-reply-shape": "dm-chat-baseline", - "matrix-dm-shared-session-notice": "dm-shared-session", - "matrix-dm-per-room-session-override": "dm-per-room-session", - "matrix-secondary-room-reply": "channel-secondary-conversation-isolation", - "matrix-mention-gating": "channel-mention-gating", - "matrix-observer-allowlist-override": "matrix-allowlist-hot-reload", - "matrix-allowlist-block": "channel-sender-allowlist", - "matrix-multi-actor-ordering": "channel-multi-actor-ordering", -} as const; - -function isMatrixModuleScenario( - scenario: ReturnType["scenarios"][number], -) { - if (scenario.execution.kind !== "flow" || scenario.id === "matrix-allowlist-hot-reload") { - return false; - } - return scenario.execution.flow?.steps.some((step) => - step.actions.some( - (action) => - typeof action === "object" && - action !== null && - "value" in action && - typeof action.value === "object" && - action.value !== null && - "expr" in action.value && - typeof action.value.expr === "string" && - action.value.expr.includes("./live-transports/matrix/scenarios/scenario-runtime-"), - ), - ); -} - -describe("legacy Matrix scenario migration", () => { - const moduleScenarioIds = readQaBootstrapScenarioCatalog() - .scenarios.filter(isMatrixModuleScenario) - .map((scenario) => scenario.id); - - it("maps all 94 former scenario ids to QA Lab scenarios", () => { - const legacyIds = [...moduleScenarioIds, ...Object.keys(RENAMED_MATRIX_SCENARIOS)]; - expect(legacyIds).toHaveLength(94); - expect(new Set(legacyIds).size).toBe(94); - - for (const scenarioId of moduleScenarioIds) { - expect(readQaScenarioById(scenarioId).id).toBe(scenarioId); - } - for (const [legacyId, targetId] of Object.entries(RENAMED_MATRIX_SCENARIOS)) { - expect(readQaScenarioById(targetId).id, legacyId).toBe(targetId); - } - }); -}); diff --git a/extensions/qa-lab/src/live-transports/telegram/legacy-scenario-parity.test.ts b/extensions/qa-lab/src/live-transports/telegram/legacy-scenario-parity.test.ts deleted file mode 100644 index 315e23a5660c..000000000000 --- a/extensions/qa-lab/src/live-transports/telegram/legacy-scenario-parity.test.ts +++ /dev/null @@ -1,93 +0,0 @@ -import fs from "node:fs"; -import { describe, expect, it } from "vitest"; -import { readQaScenarioById } from "../../scenario-catalog.js"; - -const LEGACY_TELEGRAM_BEHAVIOR_LEDGER = [ - { - id: "telegram-other-bot-command-gating", - owner: "qa/scenarios/channels/telegram-other-bot-command-gating.yaml", - scenarioId: "telegram-other-bot-command-gating", - }, - { - id: "telegram-mentioned-message-reply", - owner: "qa/scenarios/channels/channel-canary.yaml", - scenarioId: "channel-canary", - }, - { - id: "telegram-stream-final-single-message", - owner: "qa/scenarios/channels/telegram-stream-final-single-message.yaml", - scenarioId: "telegram-stream-final-single-message", - }, - { - id: "telegram-long-final-reuses-preview", - owner: "qa/scenarios/channels/telegram-long-final-reuses-preview.yaml", - scenarioId: "telegram-long-final-reuses-preview", - }, - { - id: "telegram-long-final-three-chunks", - owner: "qa/scenarios/channels/telegram-long-final-three-chunks.yaml", - scenarioId: "telegram-long-final-three-chunks", - }, - { - id: "telegram-mention-gating", - owner: "qa/scenarios/channels/channel-mention-gating.yaml", - scenarioId: "channel-mention-gating", - }, -] as const; - -const LEGACY_TELEGRAM_CAPABILITY_LEDGER = [ - { - id: "credentials-and-lease-cleanup", - owner: "extensions/qa-lab/src/live-transports/telegram/adapter.runtime.ts", - proof: "acquireQaCredentialLease", - }, - { - id: "bot-api-and-rich-message-observation", - owner: "extensions/qa-lab/src/live-transports/telegram/telegram-api.runtime.ts", - proof: "normalizeTelegramObservedMessage", - }, - { - id: "native-send-reply-edit-mapping", - owner: "extensions/qa-lab/src/live-transports/telegram/adapter.runtime.ts", - proof: "reply_parameters", - }, - { - id: "gateway-readiness-and-config", - owner: "extensions/qa-lab/src/live-transports/telegram/telegram-api.runtime.ts", - proof: "waitForTelegramChannelRunning", - }, - { - id: "selection-and-standard-artifacts", - owner: "extensions/qa-lab/src/live-transports/telegram/cli.runtime.ts", - proof: "runQaFlowSuiteFromRuntime", - }, - { - id: "package-rtt-sampling", - owner: "scripts/e2e/npm-telegram-live-runner.ts", - proof: "createRoundTripProbe", - }, -] as const; - -describe("legacy Telegram runner parity", () => { - it("maps every retired scenario to one maintained YAML owner", () => { - expect(LEGACY_TELEGRAM_BEHAVIOR_LEDGER).toHaveLength(6); - expect(new Set(LEGACY_TELEGRAM_BEHAVIOR_LEDGER.map(({ id }) => id)).size).toBe(6); - - for (const entry of LEGACY_TELEGRAM_BEHAVIOR_LEDGER) { - const scenario = readQaScenarioById(entry.scenarioId); - expect(scenario.sourcePath, entry.id).toBe(entry.owner); - } - }); - - it("keeps every runner capability at its intended owner boundary", () => { - for (const entry of LEGACY_TELEGRAM_CAPABILITY_LEDGER) { - expect(fs.readFileSync(entry.owner, "utf8"), entry.id).toContain(entry.proof); - } - }); - - it("has no unresolved legacy runner owner", () => { - expect( - fs.existsSync("extensions/qa-lab/src/live-transports/telegram/telegram-live.runtime.ts"), - ).toBe(false); - }); -}); diff --git a/extensions/qa-lab/src/live-transports/telegram/profiles.test.ts b/extensions/qa-lab/src/live-transports/telegram/profiles.test.ts index 700b3a6c07ff..8e3b3cef26bf 100644 --- a/extensions/qa-lab/src/live-transports/telegram/profiles.test.ts +++ b/extensions/qa-lab/src/live-transports/telegram/profiles.test.ts @@ -24,7 +24,6 @@ describe("Telegram QA profiles", () => { const live = resolveTelegramQaScenarioIds({ providerMode: "live-frontier" }); const mock = resolveTelegramQaScenarioIds({ providerMode: "mock-openai" }); - expect(mock).toHaveLength(19); expect(live).not.toContain("telegram-long-final-reuses-preview"); expect(mock).toContain("telegram-long-final-reuses-preview"); expect(mock).not.toContain("telegram-assistant-transcript-role-boundary"); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2c81f8a31895..c2d2938acd3e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2408,7 +2408,7 @@ importers: specifier: 3.1.0 version: 3.1.0 '@novnc/novnc': - specifier: ^1.7.0 + specifier: 1.7.0 version: 1.7.0 '@openclaw/gateway-client': specifier: workspace:* diff --git a/ui/package.json b/ui/package.json index 6fe13757c756..a9d1fe7b7532 100644 --- a/ui/package.json +++ b/ui/package.json @@ -21,7 +21,7 @@ "@modelcontextprotocol/ext-apps": "1.7.5", "@modelcontextprotocol/sdk": "1.30.0", "@noble/ed25519": "3.1.0", - "@novnc/novnc": "^1.7.0", + "@novnc/novnc": "1.7.0", "@openclaw/gateway-client": "workspace:*", "@openclaw/gateway-protocol": "workspace:*", "@openclaw/libterminal": "0.3.2",