Skip to content

perf(onboard): cache WeChat plugin in sandbox base#3682

Merged
ericksoa merged 9 commits into
NVIDIA:mainfrom
sandl99:u/sdang/enhance-wechat-plugins-install
May 19, 2026
Merged

perf(onboard): cache WeChat plugin in sandbox base#3682
ericksoa merged 9 commits into
NVIDIA:mainfrom
sandl99:u/sdang/enhance-wechat-plugins-install

Conversation

@sandl99

@sandl99 sandl99 commented May 18, 2026

Copy link
Copy Markdown
Contributor

Summary

Caches the OpenClaw WeChat plugin in Dockerfile.base so per-sandbox onboard builds no longer reinstall it. The final image now preserves the base plugin install registry, seeds captured WeChat account state during config generation, and runs OpenClaw doctor to stage
bundled channel runtime deps before npm is locked offline.

Related Issue

Fixes #3677

Changes

  • Move @tencent-weixin/openclaw-weixin@2.4.2 installation into Dockerfile.base.
  • Preserve existing plugins.installs entries when generate-openclaw-config.py rewrites openclaw.json.
  • Call seed-wechat-accounts.py from config generation only when openclaw-weixin is already registered.
  • Replace the final-image WeChat npm install with openclaw doctor --fix --non-interactive.
  • Add config-generation tests for install-registry preservation and guarded WeChat seeding.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Verification

  • npx prek run --all-files passes
  • npm test passes
  • Tests added or updated for new or changed behavior
  • No secrets, API keys, or credentials committed
  • Docs updated for user-facing behavior changes
  • make docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: San Dang sdang@nvidia.com

Summary by CodeRabbit

  • Chores

    • Docker image build simplified and made non-interactive; WeChat plugin is installed and enabled during image builds.
    • Config generation now preserves existing plugin-install entries and will automatically seed WeChat accounts when that plugin is present.
    • Expanded parity inventories and maps to add many additional messaging-provider and proxy/regression assertions.
  • Tests

    • Added/updated tests covering plugin-preservation, enablement, automatic WeChat seeding, and extended messaging-provider/regression checks.

Review Change Stack

Fixes NVIDIA#3677

Signed-off-by: San Dang <sdang@nvidia.com>
@copy-pr-bot

copy-pr-bot Bot commented May 18, 2026

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

@coderabbitai

coderabbitai Bot commented May 18, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Moves the WeChat plugin installation into the cached base image, preserves any existing plugins.installs from the base image when generating ~/.openclaw/openclaw.json, conditionally runs account seeding only if openclaw-weixin is present, and replaces per-onboard installs with a single non-interactive openclaw doctor --fix.

Changes

WeChat Plugin Base Caching and Config Preservation

Layer / File(s) Summary
Base-image WeChat plugin installation
Dockerfile.base
Installs @tencent-weixin/openclaw-weixin@2.4.2 and enables it under the sandbox user during base-image build, producing a cached plugins.installs entry.
Config generation: preserve installs and conditional seeding
scripts/generate-openclaw-config.py, scripts/seed-wechat-accounts.py
generate-openclaw-config.py imports runpy, merges existing ~/.openclaw/openclaw.json plugins.installs into the generated config, and invokes seed-wechat-accounts.py via runpy only when openclaw-weixin is present; seed-wechat-accounts.py comment updated.
Onboard doctoring simplification
Dockerfile
Replaces the prior per-onboard RUN block (install + seed with suppressed output) with openclaw doctor --fix --non-interactive during image build.
Tests for preservation and seeding
test/generate-openclaw-config.test.ts
Adds tests that pre-populate .openclaw/openclaw.json with openclaw-weixin install entries and verify preserved installs, enabled account flags, absence of channels.wechat, and correct seeded account file contents.
Docs comment and generated inventory update
scripts/seed-wechat-accounts.py, test/e2e/docs/parity-inventory.generated.json, test/e2e/docs/parity-map.yaml
Updates seed script top-file comment and refreshes generated parity inventory and parity-map with expanded messaging-provider and WhatsApp assertions and updated totals.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested labels

Sandbox, Integration: OpenClaw

Suggested reviewers

  • ericksoa
  • cv

Poem

🐰 In base the WeChat plugin found its nest,
Config now keeps what earlier builds expressed,
Doctor runs simple, no installs in flight,
Seeds only when the plugin's in plain sight,
Hops, tests, and caches — onboarding feels light.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'perf(onboard): cache WeChat plugin in sandbox base' clearly and accurately reflects the primary change of moving the WeChat plugin install from per-sandbox Dockerfile to the base image for performance optimization.
Linked Issues check ✅ Passed The PR fully addresses issue #3677 by moving WeChat plugin installation to Dockerfile.base while preserving plugins.installs entries through config generation and guarded WeChat seeding.
Out of Scope Changes check ✅ Passed All changes are within scope of #3677: plugin caching in base image, config preservation logic, and WeChat seeding gating. Test updates for new behavior and parity inventory updates are appropriate supporting changes.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@sandl99 sandl99 marked this pull request as ready for review May 18, 2026 08:37

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
Dockerfile (1)

385-385: Run the container E2E subset for this onboard build-path simplification.

openclaw doctor --fix --non-interactive changes build-time runtime-dependency staging behavior; please validate with the recommended E2E jobs before merge.

As per coding guidelines: Dockerfile layer ordering and baked config changes are only testable with a real container build and the listed E2E workflows.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Dockerfile` at line 385, The Dockerfile addition RUN openclaw doctor --fix
--non-interactive alters build-time runtime-dependency staging and must be
validated by running the recommended E2E jobs; run the container build and
execute the prescribed E2E subset (the onboard build-path simplification E2E
workflows) against this image to verify layer ordering and baked config
behavior, capture any failures or differences in dependency staging, and report
back before merging so we can revert or adjust the RUN step if tests fail.
Dockerfile.base (1)

204-211: Run the container E2E suite for this base-layer bake change.

This change affects baked plugin state and permissions in the sandbox base image; please run the recommended nightly E2E subset before merge:
cloud-e2e,sandbox-survival-e2e,hermes-e2e,rebuild-openclaw-e2e.

As per coding guidelines: Dockerfile.base changes are only fully testable with a real container build and the listed E2E jobs.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Dockerfile.base` around lines 204 - 211, This change to Dockerfile.base
modifies baked plugin state and sandbox permissions (see the RUN line installing
'`@tencent-weixin/openclaw-weixin`@2.4.2' and the USER sandbox/USER root
switches), so before merging run the recommended nightly E2E subset against a
real container build: cloud-e2e, sandbox-survival-e2e, hermes-e2e and
rebuild-openclaw-e2e; rebuild the base image locally or via CI, execute those
jobs, and report any failing tests or permission/plugin issues back in the PR.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@Dockerfile`:
- Line 385: The Dockerfile addition RUN openclaw doctor --fix --non-interactive
alters build-time runtime-dependency staging and must be validated by running
the recommended E2E jobs; run the container build and execute the prescribed E2E
subset (the onboard build-path simplification E2E workflows) against this image
to verify layer ordering and baked config behavior, capture any failures or
differences in dependency staging, and report back before merging so we can
revert or adjust the RUN step if tests fail.

In `@Dockerfile.base`:
- Around line 204-211: This change to Dockerfile.base modifies baked plugin
state and sandbox permissions (see the RUN line installing
'`@tencent-weixin/openclaw-weixin`@2.4.2' and the USER sandbox/USER root
switches), so before merging run the recommended nightly E2E subset against a
real container build: cloud-e2e, sandbox-survival-e2e, hermes-e2e and
rebuild-openclaw-e2e; rebuild the base image locally or via CI, execute those
jobs, and report any failing tests or permission/plugin issues back in the PR.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: a305a709-ac3d-45d8-805a-74a1cd9557b6

📥 Commits

Reviewing files that changed from the base of the PR and between 32dbdc5 and 18154bb.

📒 Files selected for processing (5)
  • Dockerfile
  • Dockerfile.base
  • scripts/generate-openclaw-config.py
  • scripts/seed-wechat-accounts.py
  • test/generate-openclaw-config.test.ts

@sandl99 sandl99 added VRDC Issues and PRs submitted by NVIDIA VRDC test team. enhancement: messaging labels May 18, 2026
@sandl99 sandl99 requested a review from ericksoa May 18, 2026 09:02
@wscurran wscurran added v0.0.46 Release target enhancement: performance integration: wechat WeChat integration behavior and removed v0.0.45 labels May 18, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
test/e2e/docs/parity-inventory.generated.json (1)

1-3: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add SPDX license header metadata to this generated JSON file.

Line 1 starts directly with JSON content and does not include SPDX licensing information, which violates repository compliance requirements for source files.

As per coding guidelines, "Every source file must include an SPDX license header for copyright and Apache-2.0 license".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/e2e/docs/parity-inventory.generated.json` around lines 1 - 3, Prepend
SPDX metadata header lines to the top of the generated JSON (the file that
contains the "generated_by" and "entrypoints" fields) by adding comment lines
like "/* SPDX-FileCopyrightText: YEAR YourOrganization */" and "/*
SPDX-License-Identifier: Apache-2.0 */" immediately before the JSON opening
brace, and update the generator script extract-legacy-assertions.ts so it emits
those two SPDX comment lines when producing the JSON to ensure every regenerated
file includes the required license header.
test/e2e/docs/parity-map.yaml (1)

1-1: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add the required SPDX license header to this YAML file.

test/e2e/docs/parity-map.yaml is missing the SPDX header required for YAML source files.

As per coding guidelines, **/*.{js,ts,tsx,jsx,sh,yaml,yml,json,md,mdx}: Every source file must include an SPDX license header for copyright and Apache-2.0 license.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/e2e/docs/parity-map.yaml` at line 1, Prepend the required SPDX license
header to the top of the YAML file by adding comment lines before the existing
"scripts:" key — e.g. add lines starting with "# SPDX-FileCopyrightText: © YEAR
YourCopyrightHolder" and "# SPDX-License-Identifier: Apache-2.0" (replace
YEAR/holder as appropriate) so the SPDX header appears above the "scripts:"
top-level key.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@test/e2e/docs/parity-inventory.generated.json`:
- Around line 1-3: Prepend SPDX metadata header lines to the top of the
generated JSON (the file that contains the "generated_by" and "entrypoints"
fields) by adding comment lines like "/* SPDX-FileCopyrightText: YEAR
YourOrganization */" and "/* SPDX-License-Identifier: Apache-2.0 */" immediately
before the JSON opening brace, and update the generator script
extract-legacy-assertions.ts so it emits those two SPDX comment lines when
producing the JSON to ensure every regenerated file includes the required
license header.

In `@test/e2e/docs/parity-map.yaml`:
- Line 1: Prepend the required SPDX license header to the top of the YAML file
by adding comment lines before the existing "scripts:" key — e.g. add lines
starting with "# SPDX-FileCopyrightText: © YEAR YourCopyrightHolder" and "#
SPDX-License-Identifier: Apache-2.0" (replace YEAR/holder as appropriate) so the
SPDX header appears above the "scripts:" top-level key.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 59ecc062-fafe-4c7d-ae18-afde014a5e1a

📥 Commits

Reviewing files that changed from the base of the PR and between bb561cb and 7e1c073.

📒 Files selected for processing (2)
  • test/e2e/docs/parity-inventory.generated.json
  • test/e2e/docs/parity-map.yaml

@ericksoa ericksoa left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved after maintainer follow-ups on the stale sandbox-base fallback and rebuild credential-scan false positive. Current head 45d8df0 is mergeable, required CI is green, and the recommended nightly E2E set completed successfully.

latenighthackathon added a commit to latenighthackathon/NemoClaw that referenced this pull request May 20, 2026
…#3913)

The brew policy preset advertises "Homebrew (Linuxbrew) package manager
access" and whitelists the linuxbrew binary paths, but the sandbox
cannot actually install Homebrew at runtime:

  1. nemoclaw-blueprint/policies/openclaw-sandbox.yaml does not list
     /home/linuxbrew under filesystem_policy.read_write, so Landlock
     denies writes there.
  2. The sandbox runs as the unprivileged `sandbox` user with no sudo
     (Dockerfile.base creates `sandbox` with HOME=/sandbox). Homebrew's
     install script's first step is `sudo` to create + chown
     /home/linuxbrew/.linuxbrew, which the sandbox cannot grant.

Applying the brew preset and running the documented bootstrap line in
the sandbox fails immediately with "Insufficient permissions to install
Homebrew to /home/linuxbrew/.linuxbrew". The preset's binary whitelist
for /home/linuxbrew/.linuxbrew/bin/* becomes dead code.

This change bakes Homebrew core into the sandbox base image during
build (running as root, then dropping to sandbox via gosu for the
clone). The companion baseline-policy change adds /home/linuxbrew to
filesystem_policy.read_write so brew can extract bottles and manage
Cellar/opt symlinks at runtime.

After the next base-image rebuild, every sandbox starts with a working
brew at /home/linuxbrew/.linuxbrew/bin/brew. Applying the brew preset
plus running `brew install <formula>` works end-to-end with no
bootstrap required.

Precedent: NVIDIA#3682 (in v0.0.46, closes NVIDIA#3677) baked the WeChat plugin
into the sandbox base image for the same reason.

Files:

- Dockerfile.base: add the brew install step at the end, after the
  WeChat plugin block. Image-build cost is ~80 to 150 MB for Homebrew
  core (formulae download on demand).
- nemoclaw-blueprint/policies/openclaw-sandbox.yaml: add /home/linuxbrew
  to filesystem_policy.read_write with an inline comment explaining
  the link to the Dockerfile.base step.
- test/policies.test.ts: add a behavior-style assertion that the
  baseline read_write list includes the Homebrew prefix, so a future
  removal of this entry trips CI.

Out of scope for this PR:

- agents/hermes/Dockerfile.base. Hermes does not currently get the
  WeChat plugin baking either; same scoping rationale.
- Adding /home/linuxbrew/.linuxbrew/bin to the system PATH. Users can
  run `brew` via the full path or via `eval "$(brew shellenv)"`. PR
  NVIDIA#3846 documents the latter.

Closes NVIDIA#3913
Refs NVIDIA#1767, NVIDIA#3757

Signed-off-by: latenighthackathon <support@latenighthackathon.com>
ericksoa added a commit that referenced this pull request May 21, 2026
…#3916)

## Summary

Closes #3913. Bakes Homebrew core into the sandbox base image so the
`brew` policy preset actually works end-to-end. Without this, applying
the preset and running `brew install <formula>` inside the sandbox fails
with `Insufficient permissions to install Homebrew to
"/home/linuxbrew/.linuxbrew"` because the sandbox lacks filesystem write
to `/home/linuxbrew/` AND runs as an unprivileged user with no sudo.

## Problem

Two filesystem constraints block runtime Homebrew installation today:

1. `nemoclaw-blueprint/policies/openclaw-sandbox.yaml` lists only
`[/tmp, /dev/null, /sandbox/.openclaw, /sandbox/.nemoclaw]` plus the
workdir under `filesystem_policy.read_write`. Landlock denies writes to
`/home/linuxbrew/`.
2. `Dockerfile.base` runs the sandbox as `useradd -r -g sandbox -d
/sandbox -s /bin/bash sandbox` (no sudo). Homebrew's install script's
first step is `sudo` to create + chown `/home/linuxbrew/.linuxbrew`,
which the sandbox cannot grant.

Result: the `brew` preset's binary whitelist for
`/home/linuxbrew/.linuxbrew/bin/*` is dead code. Two QA reports already
documented the symptom:
[#1767](#1767) (filed
2026-04-10) and [#3757](#3757)
(filed 2026-05-18).
[#3846](#3846) was an interim
docs-only attempt that we closed in favor of this PR; documenting a
bootstrap that cannot actually succeed in the default sandbox would have
set wrong expectations.

## Approach

Follow the [#3682](#3682)
precedent (WeChat plugin baked into the base image in v0.0.46):
provision the tool at image-build time, when the build runs as root and
can create + chown the prefix.

- `Dockerfile.base`: after the existing WeChat plugin install block, add
a step that creates `/home/linuxbrew/.linuxbrew/bin`, chowns to
`sandbox:sandbox`, clones Homebrew core as the sandbox user via `gosu`
at the pinned `ARG HOMEBREW_VERSION=5.1.12` tag, symlinks the `brew`
entry point, and asserts `brew --version` succeeds. The `ARG` keeps the
base-image layer reproducible across rebuilds and can be bumped by
editing the default or passing `--build-arg`.
- `nemoclaw-blueprint/policies/openclaw-sandbox.yaml`: add
`/home/linuxbrew` to `filesystem_policy.read_write` so runtime `brew
install <formula>` can extract bottles and manage Cellar/opt symlinks.
- `test/policies.test.ts`: behavior-style assertion that the baseline
`read_write` list includes the Homebrew prefix. Trips CI if a future
change drops the entry.

## Cost

Approximately 80 to 150 MB on the base image (Homebrew core only;
formulae download on demand). Acceptable relative to the existing ~2.4
GB sandbox image and consistent with the trade-off the project already
accepted for the WeChat plugin baking.

## Follow-up docs PR planned

Once this merges and the base image rebuilds, a small docs PR will land
covering the new flow on the matching MDX pages: apply the `brew`
preset, run `brew install <formula>`. The previous attempt at
documenting a runtime bootstrap (closed
[#3846](#3846)) becomes obsolete
and the new docs will reflect that `brew` is included by default.

## Out of scope

- **`agents/hermes/Dockerfile.base`** — Hermes does not currently get
the WeChat plugin baking either; same scoping rationale. Can extend in a
follow-up if maintainers want Homebrew under Hermes.
- **System `PATH`** — users can run `brew` via the full path
`/home/linuxbrew/.linuxbrew/bin/brew` or via `eval
"$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"`. A separate PR could
add the prefix to `/etc/bash.bashrc` if a cleaner default UX is wanted.
- **Option B (drop the brew preset entirely)** — discussed in
[#3913](#3913); rejected
because removing a Balanced-tier preset is a user-visible regression.

## Test plan

- [x] `prek run --files` clean on all changed files
- [x] New `test/policies.test.ts` assertion passes (`Homebrew prefix`
test)
- [x] Behavior-style test (parses YAML and checks the structured
`read_write` array); satisfies the source-shape budget
- [x] Verified the pinned `HOMEBREW_VERSION=5.1.12` tag exists upstream
(`gh api repos/Homebrew/brew/releases` + direct
`https://github.com/Homebrew/brew/releases/tag/5.1.12` returns 200)
- [ ] **CI to verify:** sandbox base image rebuilds successfully with
the new step
- [ ] **CI to verify:** `brew --version` runs inside a freshly-created
sandbox (covered by the build-time `gosu sandbox
/home/linuxbrew/.linuxbrew/bin/brew --version` assertion in
`Dockerfile.base`)
- [ ] **Manual smoke after base-image publish:** `nemoclaw onboard` ->
`<name> policy-add brew --yes` -> `<name> connect` -> `brew install
hello` -> succeeds

Signed-off-by: latenighthackathon
<latenighthackathon@users.noreply.github.com>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Homebrew package manager is now pre-installed and available in the
sandbox environment, enabling users to install and manage software
packages using standard Homebrew commands.

* **Tests**
* Added validation tests for Homebrew policy configuration and binary
permissions.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/NVIDIA/NemoClaw/pull/3916?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: latenighthackathon <support@latenighthackathon.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Co-authored-by: latenighthackathon <latenighthackathon@users.noreply.github.com>
Co-authored-by: Aaron Erickson <aerickson@nvidia.com>
@cv cv added the integration: whatsapp WhatsApp integration or channel behavior label May 30, 2026
@wscurran wscurran added area: messaging Messaging channels, bridges, manifests, or channel lifecycle feature PR adds or expands user-visible functionality area: performance Latency, throughput, resource use, benchmarks, or scaling and removed enhancement: performance labels Jun 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: messaging Messaging channels, bridges, manifests, or channel lifecycle area: performance Latency, throughput, resource use, benchmarks, or scaling feature PR adds or expands user-visible functionality integration: wechat WeChat integration behavior integration: whatsapp WhatsApp integration or channel behavior v0.0.46 Release target VRDC Issues and PRs submitted by NVIDIA VRDC test team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

perf(onboard): move WeChat plugin install from Dockerfile to Dockerfile.base

4 participants