diff --git a/CHANGELOG.md b/CHANGELOG.md index 50679d405ca..1708ce4b12f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Docs: https://docs.openclaw.ai - Control UI/Talk: fix Talk (OpenAI Realtime WebRTC) CORS failure by stripping server-side-only attribution headers (`originator`, `version`, `User-Agent`) from browser offer headers; `api.openai.com/v1/realtime/calls` only allows `authorization` and `content-type` in its CORS preflight, so forwarding these headers caused the browser SDP exchange to fail. Fixes #76435. Thanks @hclsys. - Plugins/onboarding: trust optional official plugin and web-search installs selected from the official catalog so npm security scanning treats them like other source-linked official install paths. Thanks @vincentkoc. +- Tests/plugins: expose the Discord npm onboarding Docker lane as a package script and assert planned Docker lanes point at real scripts, so external-channel onboarding coverage can actually run. Thanks @vincentkoc. - Microsoft Teams: persist sent-message markers across Gateway restarts so follow-up replies to recent bot messages keep resolving the original conversation instead of dropping out after restart, with marker TTLs preserved on best-effort recovery. (#75585) Thanks @amknight. - Matrix: persist pending approval reaction targets across Gateway restarts so room approvers can still approve or deny outstanding prompts after OpenClaw comes back online. (#75586) Thanks @amknight. - Channels/onboarding: map third-party official WeCom and Yuanbao catalog entries to their published plugin ids so npm installs pass expected-plugin validation. Thanks @vincentkoc. diff --git a/package.json b/package.json index e152a29a564..092c65fa7f5 100644 --- a/package.json +++ b/package.json @@ -1551,6 +1551,7 @@ "test:docker:local:all": "OPENCLAW_DOCKER_ALL_LIVE_MODE=skip node scripts/test-docker-all.mjs", "test:docker:mcp-channels": "bash scripts/e2e/mcp-channels-docker.sh", "test:docker:npm-onboard-channel-agent": "bash scripts/e2e/npm-onboard-channel-agent-docker.sh", + "test:docker:npm-onboard-discord-channel-agent": "OPENCLAW_NPM_ONBOARD_CHANNEL=discord bash scripts/e2e/npm-onboard-channel-agent-docker.sh", "test:docker:npm-telegram-live": "bash scripts/e2e/npm-telegram-live-docker.sh", "test:docker:onboard": "bash scripts/e2e/onboard-docker.sh", "test:docker:openai-image-auth": "bash scripts/e2e/openai-image-auth-docker.sh", diff --git a/test/scripts/docker-e2e-plan.test.ts b/test/scripts/docker-e2e-plan.test.ts index de2bc129b45..e2be4377779 100644 --- a/test/scripts/docker-e2e-plan.test.ts +++ b/test/scripts/docker-e2e-plan.test.ts @@ -1,3 +1,4 @@ +import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; import { DEFAULT_LIVE_RETRIES, @@ -8,6 +9,9 @@ import { import { BUNDLED_PLUGIN_INSTALL_UNINSTALL_SHARDS } from "../../scripts/lib/docker-e2e-scenarios.mjs"; const orderLanes = (lanes: T[]) => lanes; +const packageJson = JSON.parse(readFileSync("package.json", "utf8")) as { + scripts?: Record; +}; function planFor( overrides: Partial[0]> = {}, @@ -240,6 +244,25 @@ describe("scripts/lib/docker-e2e-plan", () => { ]); }); + it("keeps planned pnpm docker lanes backed by package scripts", () => { + const plan = planFor({ + includeOpenWebUI: true, + planReleaseAll: true, + profile: RELEASE_PATH_PROFILE, + }); + const scripts = packageJson.scripts ?? {}; + const missing = plan.lanes + .flatMap((lane) => + Array.from(lane.command.matchAll(/\bpnpm\s+(test:docker:[\w:-]+)/gu), (match) => ({ + lane: lane.name, + script: match[1], + })), + ) + .filter(({ script }) => !scripts[script]); + + expect(missing).toEqual([]); + }); + it("keeps legacy release chunk names as aggregate aliases", () => { const packageUpdate = planFor({ includeOpenWebUI: true,