diff --git a/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml b/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml index 702f2bdb036..75ba4cf51ff 100644 --- a/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml +++ b/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml @@ -421,6 +421,9 @@ jobs: add_profile_suite live-gateway-google-docker "stable full" add_profile_suite live-gateway-minimax-docker "stable full" add_profile_suite live-gateway-advisory-docker "full" + add_profile_suite live-gateway-advisory-docker-deepseek-fireworks "full" + add_profile_suite live-gateway-advisory-docker-opencode-openrouter "full" + add_profile_suite live-gateway-advisory-docker-xai-zai "full" add_profile_suite live-cli-backend-docker "stable full" add_profile_suite live-acp-bind-docker "stable full" add_profile_suite live-codex-harness-docker "stable full" @@ -2200,10 +2203,25 @@ jobs: timeout_minutes: 30 profile_env_only: false profiles: stable full - - suite_id: live-gateway-advisory-docker - label: Docker live gateway advisory providers - command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=deepseek,fireworks,opencode-go,openrouter,xai,zai OPENCLAW_LIVE_GATEWAY_MAX_MODELS=6 OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=30000 OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=60000 OPENCLAW_LIVE_DOCKER_REPO_ROOT="$GITHUB_WORKSPACE" timeout --foreground --kill-after=30s 35m bash .release-harness/scripts/test-live-gateway-models-docker.sh - timeout_minutes: 40 + - suite_id: live-gateway-advisory-docker-deepseek-fireworks + suite_group: live-gateway-advisory-docker + label: Docker live gateway advisory DeepSeek/Fireworks + command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=deepseek,fireworks OPENCLAW_LIVE_GATEWAY_MAX_MODELS=2 OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=30000 OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=60000 OPENCLAW_LIVE_DOCKER_REPO_ROOT="$GITHUB_WORKSPACE" timeout --foreground --kill-after=30s 25m bash .release-harness/scripts/test-live-gateway-models-docker.sh + timeout_minutes: 30 + profile_env_only: false + profiles: full + - suite_id: live-gateway-advisory-docker-opencode-openrouter + suite_group: live-gateway-advisory-docker + label: Docker live gateway advisory OpenCode/OpenRouter + command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=opencode-go,openrouter OPENCLAW_LIVE_GATEWAY_MAX_MODELS=2 OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=30000 OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=60000 OPENCLAW_LIVE_DOCKER_REPO_ROOT="$GITHUB_WORKSPACE" timeout --foreground --kill-after=30s 25m bash .release-harness/scripts/test-live-gateway-models-docker.sh + timeout_minutes: 30 + profile_env_only: false + profiles: full + - suite_id: live-gateway-advisory-docker-xai-zai + suite_group: live-gateway-advisory-docker + label: Docker live gateway advisory xAI/Z.ai + command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=xai,zai OPENCLAW_LIVE_GATEWAY_MAX_MODELS=2 OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=30000 OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=60000 OPENCLAW_LIVE_DOCKER_REPO_ROOT="$GITHUB_WORKSPACE" timeout --foreground --kill-after=30s 25m bash .release-harness/scripts/test-live-gateway-models-docker.sh + timeout_minutes: 30 profile_env_only: false profiles: full - suite_id: live-cli-backend-docker @@ -2277,14 +2295,14 @@ jobs: OPENCLAW_VITEST_MAX_WORKERS: "2" steps: - name: Checkout selected ref - if: contains(matrix.profiles, inputs.release_test_profile) && (inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id) + if: contains(matrix.profiles, inputs.release_test_profile) && (inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id || (inputs.live_suite_filter == 'live-gateway-advisory-docker' && startsWith(matrix.suite_id, 'live-gateway-advisory-docker-'))) uses: actions/checkout@v6 with: ref: ${{ needs.validate_selected_ref.outputs.selected_sha }} fetch-depth: 1 - name: Checkout trusted live shard harness - if: contains(matrix.profiles, inputs.release_test_profile) && (inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id) + if: contains(matrix.profiles, inputs.release_test_profile) && (inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id || (inputs.live_suite_filter == 'live-gateway-advisory-docker' && startsWith(matrix.suite_id, 'live-gateway-advisory-docker-'))) uses: actions/checkout@v6 with: ref: ${{ github.sha }} @@ -2292,7 +2310,7 @@ jobs: path: .release-harness - name: Setup Node environment - if: contains(matrix.profiles, inputs.release_test_profile) && (inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id) + if: contains(matrix.profiles, inputs.release_test_profile) && (inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id || (inputs.live_suite_filter == 'live-gateway-advisory-docker' && startsWith(matrix.suite_id, 'live-gateway-advisory-docker-'))) uses: ./.github/actions/setup-node-env with: node-version: ${{ env.NODE_VERSION }} @@ -2300,11 +2318,11 @@ jobs: install-bun: "true" - name: Hydrate live auth/profile inputs - if: contains(matrix.profiles, inputs.release_test_profile) && (inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id) + if: contains(matrix.profiles, inputs.release_test_profile) && (inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id || (inputs.live_suite_filter == 'live-gateway-advisory-docker' && startsWith(matrix.suite_id, 'live-gateway-advisory-docker-'))) run: bash scripts/ci-hydrate-live-auth.sh - name: Log in to GHCR - if: contains(matrix.profiles, inputs.release_test_profile) && (inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id) + if: contains(matrix.profiles, inputs.release_test_profile) && (inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id || (inputs.live_suite_filter == 'live-gateway-advisory-docker' && startsWith(matrix.suite_id, 'live-gateway-advisory-docker-'))) uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4 with: registry: ghcr.io @@ -2312,7 +2330,7 @@ jobs: password: ${{ github.token }} - name: Configure suite-specific env - if: contains(matrix.profiles, inputs.release_test_profile) && (inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id) + if: contains(matrix.profiles, inputs.release_test_profile) && (inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id || (inputs.live_suite_filter == 'live-gateway-advisory-docker' && startsWith(matrix.suite_id, 'live-gateway-advisory-docker-'))) shell: bash run: | set -euo pipefail @@ -2346,7 +2364,7 @@ jobs: esac - name: Run ${{ matrix.label }} - if: contains(matrix.profiles, inputs.release_test_profile) && (inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id) + if: contains(matrix.profiles, inputs.release_test_profile) && (inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id || (inputs.live_suite_filter == 'live-gateway-advisory-docker' && startsWith(matrix.suite_id, 'live-gateway-advisory-docker-'))) env: OPENCLAW_LIVE_COMMAND: ${{ matrix.command }} run: bash .release-harness/scripts/ci-live-command-retry.sh diff --git a/docs/reference/full-release-validation.md b/docs/reference/full-release-validation.md index df12c70afb5..c44c0ee5cc9 100644 --- a/docs/reference/full-release-validation.md +++ b/docs/reference/full-release-validation.md @@ -111,7 +111,7 @@ These suites are skipped by `stable` and included by `full`: | Area | Full-only coverage | | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | | Docker live models | OpenCode Go, OpenRouter, xAI, Z.ai, and Fireworks. | -| Docker live gateway | Advisory shard for DeepSeek, Fireworks, OpenCode Go, OpenRouter, xAI, and Z.ai. | +| Docker live gateway | Advisory providers split into DeepSeek/Fireworks, OpenCode Go/OpenRouter, and xAI/Z.ai shards. | | Native gateway provider profiles | Full Anthropic Opus and Sonnet/Haiku shards, Fireworks, DeepSeek, full OpenCode Go model shards, OpenRouter, xAI, and Z.ai. | | Native plugin live shards | Plugins A-K, L-N, O-Z other, Moonshot, and xAI. | | Native media live shards | Audio, Google music, MiniMax music, and video groups A-D. | @@ -149,6 +149,9 @@ Valid filter ids are defined in the reusable live/E2E workflow, including `live-cli-backend-docker`, `live-acp-bind-docker`, and `live-codex-harness-docker`. +The `live-gateway-advisory-docker` handle is an aggregate rerun handle for its +three provider shards, so it still fans out to all advisory Docker gateway jobs. + ## Evidence to keep Keep the `Full Release Validation` summary as the release-level index. It links diff --git a/test/scripts/package-acceptance-workflow.test.ts b/test/scripts/package-acceptance-workflow.test.ts index db7103e2f7d..3dc80851d14 100644 --- a/test/scripts/package-acceptance-workflow.test.ts +++ b/test/scripts/package-acceptance-workflow.test.ts @@ -312,10 +312,25 @@ describe("package artifact reuse", () => { expect(workflow).toContain('add_profile_suite live-gateway-docker "minimum stable full"'); expect(workflow).toContain('add_profile_suite live-gateway-anthropic-docker "stable full"'); expect(workflow).toContain('add_profile_suite live-gateway-advisory-docker "full"'); + expect(workflow).toContain( + 'add_profile_suite live-gateway-advisory-docker-deepseek-fireworks "full"', + ); + expect(workflow).toContain( + 'add_profile_suite live-gateway-advisory-docker-opencode-openrouter "full"', + ); + expect(workflow).toContain('add_profile_suite live-gateway-advisory-docker-xai-zai "full"'); expect(workflow).toContain('add_profile_suite live-cli-backend-docker "stable full"'); expect(workflow).toContain( "inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id", ); + expect(workflow).toContain("suite_id: live-gateway-advisory-docker-deepseek-fireworks"); + expect(workflow).toContain("suite_id: live-gateway-advisory-docker-opencode-openrouter"); + expect(workflow).toContain("suite_id: live-gateway-advisory-docker-xai-zai"); + expect(workflow).toContain("suite_group: live-gateway-advisory-docker"); + expect(workflow).toContain("OPENCLAW_LIVE_GATEWAY_PROVIDERS=deepseek,fireworks"); + expect(workflow).toContain("OPENCLAW_LIVE_GATEWAY_PROVIDERS=opencode-go,openrouter"); + expect(workflow).toContain("OPENCLAW_LIVE_GATEWAY_PROVIDERS=xai,zai"); + expect(workflow).toContain("inputs.live_suite_filter == 'live-gateway-advisory-docker'"); expect(workflow).toContain("OPENCLAW_LIVE_CLI_BACKEND_MODEL=codex-cli/gpt-5.4"); expect(workflow).toContain("OPENCLAW_LIVE_CLI_BACKEND_AUTH=api-key"); expect(workflow).toContain("OPENCLAW_LIVE_CLI_BACKEND_USE_CI_SAFE_CODEX_CONFIG=1"); diff --git a/ui/src/i18n/.i18n/raw-copy-baseline.json b/ui/src/i18n/.i18n/raw-copy-baseline.json index 2041f05fa34..a82968c13ac 100644 --- a/ui/src/i18n/.i18n/raw-copy-baseline.json +++ b/ui/src/i18n/.i18n/raw-copy-baseline.json @@ -85,12 +85,26 @@ "path": "ui/src/ui/app-settings.ts", "text": "Skills with missing dependencies" }, + { + "count": 1, + "kind": "object-property", + "name": "description", + "path": "ui/src/ui/chat/build-chat-items.ts", + "text": "Earlier turns are preserved in a compaction checkpoint. Open session checkpoints to branch or restore that pre-compaction view." + }, { "count": 1, "kind": "object-property", "name": "label", "path": "ui/src/ui/chat/build-chat-items.ts", - "text": "Compaction" + "text": "Compacted history" + }, + { + "count": 1, + "kind": "object-property", + "name": "label", + "path": "ui/src/ui/chat/build-chat-items.ts", + "text": "Open checkpoints" }, { "count": 1,