
























@@ -39,6 +39,32 @@ import { runSmokeLane, type SmokeLane, type SmokeLaneStatus } from "./lane-runne
3939import { resolveUbuntuVmName, waitForVmStatus } from "./parallels-vm.ts";
4040import { PhaseRunner } from "./phase-runner.ts";
414142+// Older published baselines predate this warning, but still need update coverage.
43+const BAD_PLUGIN_DIAGNOSTIC_MIN_VERSION = "2026.5.7";
44+45+function parseOpenClawPackageVersion(value: string): string | null {
46+return value.match(/\b(\d{4}\.\d{1,2}\.\d{1,2}(?:-[A-Za-z0-9.]+)?)\b/u)?.[1] ?? null;
47+}
48+49+function compareOpenClawPackageVersions(left: string, right: string): number {
50+const parse = (value: string): [number, number, number] => {
51+const match = parseOpenClawPackageVersion(value)?.match(/^(\d{4})\.(\d+)\.(\d+)/u);
52+if (!match) {
53+return [0, 0, 0];
54+}
55+return [Number(match[1]), Number(match[2]), Number(match[3])];
56+};
57+const leftParts = parse(left);
58+const rightParts = parse(right);
59+for (let index = 0; index < leftParts.length; index++) {
60+const delta = leftParts[index] - rightParts[index];
61+if (delta !== 0) {
62+return delta;
63+}
64+}
65+return 0;
66+}
67+4268interface LinuxOptions {
4369vmName: string;
4470vmNameExplicit: boolean;
@@ -337,10 +363,12 @@ class LinuxSmoke {
337363this.status.freshVersion = await this.extractLastVersion("fresh.install-main");
338364await this.phase("fresh.verify-main-version", 90, () => this.verifyTargetVersion());
339365await this.phase("fresh.onboard-ref", 180, () => this.runRefOnboard());
340-await this.phase("fresh.inject-bad-plugin", 90, () => this.injectBadPluginFixture());
366+await this.phase("fresh.inject-bad-plugin", 90, () =>
367+this.maybeInjectBadPluginFixture("fresh"),
368+);
341369await this.phase("fresh.gateway-start", 240, () => this.startGatewayBackground());
342370await this.phase("fresh.bad-plugin-diagnostic", 90, () =>
343-this.verifyBadPluginDiagnostic("fresh"),
371+this.maybeVerifyBadPluginDiagnostic("fresh"),
344372);
345373await this.phase("fresh.gateway-status", 240, () => this.verifyGatewayStatus());
346374this.status.freshGateway = "pass";
@@ -366,11 +394,13 @@ class LinuxSmoke {
366394);
367395this.status.upgradeVersion = await this.extractLastVersion("upgrade.install-main");
368396await this.phase("upgrade.verify-main-version", 90, () => this.verifyTargetVersion());
369-await this.phase("upgrade.inject-bad-plugin", 90, () => this.injectBadPluginFixture());
397+await this.phase("upgrade.inject-bad-plugin", 90, () =>
398+this.maybeInjectBadPluginFixture("upgrade"),
399+);
370400await this.phase("upgrade.onboard-ref", 180, () => this.runRefOnboard());
371401await this.phase("upgrade.gateway-start", 240, () => this.startGatewayBackground());
372402await this.phase("upgrade.bad-plugin-diagnostic", 90, () =>
373-this.verifyBadPluginDiagnostic("upgrade"),
403+this.maybeVerifyBadPluginDiagnostic("upgrade"),
374404);
375405await this.phase("upgrade.gateway-status", 240, () => this.verifyGatewayStatus());
376406this.status.upgradeGateway = "pass";
@@ -592,6 +622,28 @@ config_path.write_text(json.dumps(config, indent=2) + "\n")
592622PY`);
593623}
594624625+private versionForLane(lane: "fresh" | "upgrade"): string {
626+return lane === "fresh" ? this.status.freshVersion : this.status.upgradeVersion;
627+}
628+629+private shouldExpectBadPluginDiagnostic(lane: "fresh" | "upgrade"): boolean {
630+const version = parseOpenClawPackageVersion(this.versionForLane(lane));
631+if (!version) {
632+return true;
633+}
634+return compareOpenClawPackageVersions(version, BAD_PLUGIN_DIAGNOSTIC_MIN_VERSION) >= 0;
635+}
636+637+private maybeInjectBadPluginFixture(lane: "fresh" | "upgrade"): void {
638+if (!this.shouldExpectBadPluginDiagnostic(lane)) {
639+this.log(
640+`Skipping bad plugin diagnostic fixture for ${lane}: installed ${this.versionForLane(lane)} predates ${BAD_PLUGIN_DIAGNOSTIC_MIN_VERSION}\n`,
641+);
642+return;
643+}
644+this.injectBadPluginFixture();
645+}
646+595647private startGatewayBackground(): void {
596648const bonjourEnv = this.disableBonjour ? " OPENCLAW_DISABLE_BONJOUR=1" : "";
597649this.guestBash(
@@ -670,7 +722,13 @@ setsid sh -lc ` +
670722throw new Error("gateway status did not become RPC-ready");
671723}
672724673-private async verifyBadPluginDiagnostic(lane: "fresh" | "upgrade"): Promise<void> {
725+private async maybeVerifyBadPluginDiagnostic(lane: "fresh" | "upgrade"): Promise<void> {
726+if (!this.shouldExpectBadPluginDiagnostic(lane)) {
727+this.log(
728+`Skipping bad plugin diagnostic assertion for ${lane}: installed ${this.versionForLane(lane)} predates ${BAD_PLUGIN_DIAGNOSTIC_MIN_VERSION}\n`,
729+);
730+return;
731+}
674732const warning =
675733"channel plugin manifest declares test-bad-plugin without channelConfigs metadata";
676734const gatewayStartLog = await readFile(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。