fix(whatsapp): make in-sandbox pairing QR scannable - #6396
Conversation
The bundled OpenClaw renders the WhatsApp pairing QR with a 1-module quiet zone, below the 4 modules QR readers need to lock on, so the terminal code cannot be scanned even from a screenshot. Patch the compiled compact renderer to use a 4-module quiet zone and emit a data:image/png fallback so pairing works regardless of terminal. Fixes #6386 Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in the Show a code coverage summary of the most covered files.
TypeScript / code-coverage/cliThe overall coverage in the Show a code coverage summary of the most covered files.
Updated |
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds runtime detection and patching for the OpenClaw WhatsApp QR terminal renderer to widen the compact quiet-zone margin and inject a data:image/png fallback for unscannable QR codes, installs the patch via an ESM ChangesOpenClaw QR renderer runtime patch
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant HookInstaller
participant Module
participant ESMLoader
participant OpenClawRenderer
HookInstaller->>Module: installOpenClawQrTerminalSourceLoader(Module)
Module->>ESMLoader: register(base64 data:text/javascript loader URL)
ESMLoader->>OpenClawRenderer: load() intercepts module source
ESMLoader->>ESMLoader: isOpenClawQrTerminalRendererSource(source)
ESMLoader->>OpenClawRenderer: return patched source (compact margin + PNG fallback)
OpenClawRenderer->>OpenClawRenderer: renderQrTerminal(payload, opts.small)
OpenClawRenderer-->>HookInstaller: compact QR plus data:image/png fallback message
Related issues: Suggested labels: bug, whatsapp, testing Suggested reviewers: 🐰 A rabbit taps the QR code twice, 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
PR Review Advisor (Nemotron Ultra) — Changes requestedMerge posture: Do not merge yet Action checklist
Findings index
🚨 Required before mergeAddress these before merging unless a maintainer explicitly overrides the advisor with rationale.
|
E2E Advisor RecommendationRequired E2E: Dispatch hint: Full advisor summaryE2E Recommendation AdvisorBase: Required E2E
Optional E2E
New E2E recommendations
Dispatch hint
|
E2E Target RecommendationRequired E2E targets: None Full E2E target advisor summaryE2E Target AdvisorBase: Required E2E targets
Optional E2E targets
Relevant changed files
|
PR Review Advisor — No blocking findingsMerge posture: No blocking advisor findings Action checklist
Test follow-ups to resolve or justifyIf these cover changed behavior, prefer adding them in this PR; otherwise state why existing coverage is enough or link the follow-up.
This is an automated, non-binding review; it still expects maintainers and agents to respond to each required or warning item. Treat suggestions as current-PR improvements when they touch changed code; defer only with maintainer rationale or a linked follow-up. A human maintainer must make the final merge decision. |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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.
Inline comments:
In `@scripts/patch-openclaw-whatsapp-qr.js`:
- Around line 1-236: The new patch script is blocked because it adds a
JavaScript source file; convert `patch-openclaw-whatsapp-qr` to TypeScript like
the other OpenClaw patch scripts. Rename the entrypoint to
`scripts/patch-openclaw-whatsapp-qr.ts`, add the needed type annotations around
the top-level helpers such as `listJsFiles`, `resolveFile`, and `processFile`,
and keep the same `AUDIT_FLAG`/`FILES` behavior. Update the Dockerfile or
invocation that launches this patcher to use `node --experimental-strip-types`
so the `.ts` script runs without introducing a new `.js` file.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 9a2d5724-4f76-44cf-9ef0-60869f4db29d
📒 Files selected for processing (3)
Dockerfilescripts/patch-openclaw-whatsapp-qr.jstest/openclaw-whatsapp-qr-patch.test.ts
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
There was a problem hiding this comment.
🧹 Nitpick comments (1)
scripts/patch-openclaw-whatsapp-qr.ts (1)
28-37: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueConsider using
fs.Direntinstead of a customDirentLiketype.
fs.readdirSync(dir, { withFileTypes: true })already returnsfs.Dirent[], which hasisFile()/name. The customDirentLikecast is redundant type duplication.♻️ Proposed simplification
-type DirentLike = { - isFile(): boolean; - name: string; -}; - function listJsFiles(dir: string): string[] { - return (fs.readdirSync(dir, { withFileTypes: true }) as DirentLike[]) + return fs + .readdirSync(dir, { withFileTypes: true }) .filter((entry) => entry.isFile() && entry.name.endsWith(".js")) .map((entry) => path.join(dir, entry.name)); }🤖 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 `@scripts/patch-openclaw-whatsapp-qr.ts` around lines 28 - 37, The listJsFiles helper uses a redundant custom DirentLike type even though fs.readdirSync(dir, { withFileTypes: true }) already returns fs.Dirent values with isFile() and name. Remove the DirentLike definition and the cast in listJsFiles, and rely on the built-in fs.Dirent type directly to simplify the code while keeping the same filtering and path.join behavior.
🤖 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 `@scripts/patch-openclaw-whatsapp-qr.ts`:
- Around line 28-37: The listJsFiles helper uses a redundant custom DirentLike
type even though fs.readdirSync(dir, { withFileTypes: true }) already returns
fs.Dirent values with isFile() and name. Remove the DirentLike definition and
the cast in listJsFiles, and rely on the built-in fs.Dirent type directly to
simplify the code while keeping the same filtering and path.join behavior.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 875e882c-bd8e-4972-a19e-0711801e7d7e
📒 Files selected for processing (5)
Dockerfilescripts/patch-openclaw-whatsapp-qr.tssrc/lib/sandbox/build-context.tstest/openclaw-whatsapp-qr-patch.test.tstest/sandbox-build-context.test.ts
🚧 Files skipped from review as they are similar to previous changes (2)
- Dockerfile
- test/openclaw-whatsapp-qr-patch.test.ts
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
There was a problem hiding this comment.
Messaging model already provides decoupled monkey-patch style in messaging package. Please move your patch into src/lib/messaging/channels/whatsapp/runtime and update whatsapp manifest to use runtime.openclaw.nodePreloads.
That would keep the monkey-patch away from core-buildcontext and Dockerfile
cv
left a comment
There was a problem hiding this comment.
Maintainer re-review: the exact-head advisor blocker is valid and the current patch does not yet make the QR scannable on all four edges. Compiling this preload and probing the integrity-pinned openclaw@2026.6.10 renderer produced a minimum left quiet zone of 1 module versus 4 on the right: changing COMPACT_MARGIN_MODULES from 1 to 4 leaves the upstream x=-1/y=-1 loop starts unchanged. Please fix all four quiet-zone edges and add a regression against the real pinned renderer's { small: true } call path, using compiled production output and either decode proof or explicit four-edge matrix assertions; the current generated 2x2 fixture/marker checks and default-call dimension test do not cover that path. Then run the required whatsapp-qr-compact regression E2E. Also resolve the advisor's loader-shape/integrity diagnostics and explicitly remove, opt-in gate, or justify printing the pairing-credential-derived data:image/png fallback to terminal/log output before rereview.
cv
left a comment
There was a problem hiding this comment.
Current-head rereview on d218867f3: the new hash gate, four-edge rewrite for the explicit { small: true } renderer, compiled-production E2E, and removal of the credential-derived data:image/png fallback are good improvements, but the reported WhatsApp login path is still not fixed.
I ran the pinned OpenClaw live E2E and added only the advisor-requested four-edge assertions for the real no-options renderQrTerminal(qr) call. The current head produced loginDefault = { rows: 29, cols: 55, left: 0, right: 0, top: 0, bottom: 2 }; the same run produced explicitSmall = { rows: 31, cols: 61, left: 4, right: 4, top: 4, bottom: 4 }. The login-default assertions therefore fail (0 < 4). The existing test passes because it checks only row count for loginDefault, so it masks the acceptance failure while proving the separate explicit-small path.
Please make the actual no-options login render scanner-safe (at minimum a four-module quiet zone on all four edges, or prove decoding to the original payload), keep that assertion in the compiled pinned-renderer E2E, and rerun whatsapp-qr-compact-e2e. Also finish the prior diagnostics request: loader registration/hash/preimage failure must emit a non-secret warning rather than silently skipping the patch, with a regression. Update the PR description to remove its now-stale data:image/png fallback claim.
cv
left a comment
There was a problem hiding this comment.
Approved exact head a03d53b205 after the remaining blockers were resolved. The real no-options login path now renders from qrcode.create(...).modules with 4/4/4/4 quiet zones; the compiled pinned-renderer E2E and required whatsapp-qr-compact-e2e run 28885897565 pass. Independent raster/decode validation recovered the exact 180-character payload, and qrcode version/ECL/mask options, Promise errors, and callback behavior are preserved. Loader registration/integrity/preimage failures now emit non-secret diagnostics, the data-URL fallback remains absent, the PR body is current, all 9 commits are Verified, CI is fully green, and the primary exact-head advisor is merge_as_is. Nemotron’s pre-existing @ts-nocheck, source-loaded unit seam, and hard-fail recommendation are nonblocking here: production uses compiled output, the exact compiled E2E covers the path, and a loader failure degrades only the explicit-small rewrite while the real login CJS renderer remains active and warns.
|
@laitingsheng The QR data:png file was pushed back by advisor due to security, we should have a opt-in gate if we want to keep.
|
<!-- markdownlint-disable MD041 --> ## Summary Prepares the user-facing documentation for NemoClaw v0.0.76 and closes the release-prep documentation gate. It adds the release highlights, documents the arm64 Local NIM warning and expanded image cleanup behavior, and fixes agent-specific command headings in generated guides. ## Changes - Add the v0.0.76 release-notes section and move the shared-gateway route containment entry out of the v0.0.74 history where it was incorrectly placed. - Document the advisory Linux arm64 Local NIM manifest warning in the canonical platform matrix and local-inference guidance. - Document that `gc` scans both gateway-built and locally prebuilt sandbox image repositories. - Keep OpenClaw and Hermes session headings out of the generated Deep Agents command guide. - Add a focused variant regression test for the agent-specific session headings. ### Source summary | Merged sources | Documentation coverage | | --- | --- | | [#6414](#6414), [#6418](#6418), [#6416](#6416), [#6344](#6344) | v0.0.76 release notes and the Deep Agents quickstart/inference routes | | [#6340](#6340) | v0.0.76 release notes and existing Deep Agents observability guidance | | [#6338](#6338), [#6378](#6378), [#6297](#6297) | v0.0.76 release notes and existing inference/troubleshooting guidance | | [#6362](#6362) | v0.0.76 release notes and existing lifecycle, command, and credential guidance | | [#6330](#6330), [#6307](#6307), [#6008](#6008) | v0.0.76 release notes and existing security, troubleshooting, and command guidance | | [#6382](#6382) | v0.0.76 release notes and existing MCP/command guidance | | [#6326](#6326), [#5868](#5868), [#5539](#5539) | v0.0.76 release notes, platform matrix, inference options, and local-inference guidance | | [#6396](#6396), [#6390](#6390), [#6007](#6007) | v0.0.76 release notes and existing messaging guidance | | [#5388](#5388), [#6249](#6249), [#6303](#6303), [#6306](#6306) | v0.0.76 release notes and command/lifecycle guidance | ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [x] Code change with doc updates - [ ] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates - [x] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [ ] Tests not applicable — justification: - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [ ] Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging) - [ ] Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Verification - [x] PR description includes the DCO sign-off declaration and every commit appears as `Verified` in GitHub - [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or `npm run check:diff` passed when hooks were skipped or unavailable - [x] Targeted behavior tests pass for the current change set, or tests are marked not applicable above — `npx vitest run --project integration test/generate-platform-docs.test.ts test/agent-variant-docs.test.ts test/sync-agent-variant-docs.test.ts` (3 files, 29 tests passed) - [ ] Applicable broad gate passed — `npm test` for broad runtime/test-harness changes; `npm run check` for repo-wide validation/coverage changes — command/result: - [x] Quality Gates section completed with required justifications or waivers - [x] No secrets, API keys, or credentials committed - [ ] `npm run docs` builds without warnings (doc changes only) — completed with 0 errors and 2 pre-existing Fern warnings - [x] Doc pages follow the [style guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md) (doc changes only) - [ ] New doc pages include SPDX header and frontmatter (new pages only) --- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Added v0.0.76 release notes content, and removed an older conflicting bullet from the surrounding release history. * Expanded Local NVIDIA NIM guidance across inference/provider docs, including an advisory for Linux arm64 DGX Spark/DGX Station hosts when a matching `linux/arm64` image manifest is unavailable. * Updated the command reference for correct session-section rendering and clarified `gc` image cleanup sources. * **Tests** * Added coverage ensuring Deep Agents omits sessions headings while Hermes includes them. * **CI** * Refreshed Local NVIDIA NIM provider notes used in the platform matrix. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
## Summary
The bundled OpenClaw/WhatsApp login path renders `openclaw channels
login --channel whatsapp` through `renderQrTerminal(qr)` with no `{
small }` option. The previous compacting path made the QR fit in the
terminal, but the real no-options login render still used `qrcode`'s
built-in compact terminal output with too little quiet zone for reliable
scanning.
This PR installs a WhatsApp runtime preload that renders terminal QR
output from `qrcode.create(...).modules` with a four-module quiet zone
on all edges, and also hash-gates the pinned OpenClaw 2026.6.10 explicit
`{ small: true }` compact renderer rewrite. The preload does not print a
credential-derived `data:image/png` fallback URL.
## Related Issue
Fixes NVIDIA#6386
## Changes
- Move the WhatsApp QR fix into
`src/lib/messaging/channels/whatsapp/runtime/whatsapp-qr-compact.ts` and
wire it through the manifest runtime preload path.
- Render the real no-options WhatsApp login QR path with NemoClaw's
four-module compact terminal renderer instead of `qrcode`'s built-in
small terminal renderer.
- Keep the explicit OpenClaw `{ small: true }` compact renderer source
rewrite for the pinned reviewed renderer, including all four quiet-zone
edges.
- Emit non-secret warnings when the ESM source-loader registration,
integrity check, or preimage match fails instead of silently skipping
the source rewrite.
- Keep non-terminal QR outputs unchanged and do not print raw
`data:image/png` fallback data to terminal/log output.
## Type of Change
- [x] 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)
## Quality Gates
- [x] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [ ] Tests not applicable — justification:
- [ ] Docs updated for user-facing behavior changes
- [x] Docs not applicable — justification: no new command, flag, or
config surface; the change restores the already-documented in-sandbox
WhatsApp pairing flow to a scannable terminal QR.
- [x] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [ ] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification: awaiting maintainer
review (messaging pairing flow + runtime preload).
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:
## Verification
- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [ ] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or
`npm run check:diff` passed when hooks were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — command/result or justification:
- `./node_modules/.bin/vitest run --project cli
src/lib/messaging/channels/whatsapp/runtime/whatsapp-qr-compact.test.ts`
-> 23/23 passed
- `./node_modules/.bin/vitest run --project integration
test/whatsapp-qr-compact.test.ts` -> 23/23 passed
- `NEMOCLAW_RUN_LIVE_E2E=1 ./node_modules/.bin/vitest run --project
e2e-live test/e2e/live/whatsapp-qr-compact.test.ts --silent=false
--reporter=default` -> 1/1 passed
- `npm run test-conditionals:scan -- --top 25` -> passed
- `npm run typecheck:cli` -> passed
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result:
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only)
- [ ] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)
---
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
---------
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
Co-authored-by: San Dang <sdang@nvidia.com>
<!-- markdownlint-disable MD041 --> ## Summary Prepares the user-facing documentation for NemoClaw v0.0.76 and closes the release-prep documentation gate. It adds the release highlights, documents the arm64 Local NIM warning and expanded image cleanup behavior, and fixes agent-specific command headings in generated guides. ## Changes - Add the v0.0.76 release-notes section and move the shared-gateway route containment entry out of the v0.0.74 history where it was incorrectly placed. - Document the advisory Linux arm64 Local NIM manifest warning in the canonical platform matrix and local-inference guidance. - Document that `gc` scans both gateway-built and locally prebuilt sandbox image repositories. - Keep OpenClaw and Hermes session headings out of the generated Deep Agents command guide. - Add a focused variant regression test for the agent-specific session headings. ### Source summary | Merged sources | Documentation coverage | | --- | --- | | [NVIDIA#6414](NVIDIA#6414), [NVIDIA#6418](NVIDIA#6418), [NVIDIA#6416](NVIDIA#6416), [NVIDIA#6344](NVIDIA#6344) | v0.0.76 release notes and the Deep Agents quickstart/inference routes | | [NVIDIA#6340](NVIDIA#6340) | v0.0.76 release notes and existing Deep Agents observability guidance | | [NVIDIA#6338](NVIDIA#6338), [NVIDIA#6378](NVIDIA#6378), [NVIDIA#6297](NVIDIA#6297) | v0.0.76 release notes and existing inference/troubleshooting guidance | | [NVIDIA#6362](NVIDIA#6362) | v0.0.76 release notes and existing lifecycle, command, and credential guidance | | [NVIDIA#6330](NVIDIA#6330), [NVIDIA#6307](NVIDIA#6307), [NVIDIA#6008](NVIDIA#6008) | v0.0.76 release notes and existing security, troubleshooting, and command guidance | | [NVIDIA#6382](NVIDIA#6382) | v0.0.76 release notes and existing MCP/command guidance | | [NVIDIA#6326](NVIDIA#6326), [NVIDIA#5868](NVIDIA#5868), [NVIDIA#5539](NVIDIA#5539) | v0.0.76 release notes, platform matrix, inference options, and local-inference guidance | | [NVIDIA#6396](NVIDIA#6396), [NVIDIA#6390](NVIDIA#6390), [NVIDIA#6007](NVIDIA#6007) | v0.0.76 release notes and existing messaging guidance | | [NVIDIA#5388](NVIDIA#5388), [NVIDIA#6249](NVIDIA#6249), [NVIDIA#6303](NVIDIA#6303), [NVIDIA#6306](NVIDIA#6306) | v0.0.76 release notes and command/lifecycle guidance | ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [x] Code change with doc updates - [ ] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates - [x] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [ ] Tests not applicable — justification: - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [ ] Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging) - [ ] Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Verification - [x] PR description includes the DCO sign-off declaration and every commit appears as `Verified` in GitHub - [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or `npm run check:diff` passed when hooks were skipped or unavailable - [x] Targeted behavior tests pass for the current change set, or tests are marked not applicable above — `npx vitest run --project integration test/generate-platform-docs.test.ts test/agent-variant-docs.test.ts test/sync-agent-variant-docs.test.ts` (3 files, 29 tests passed) - [ ] Applicable broad gate passed — `npm test` for broad runtime/test-harness changes; `npm run check` for repo-wide validation/coverage changes — command/result: - [x] Quality Gates section completed with required justifications or waivers - [x] No secrets, API keys, or credentials committed - [ ] `npm run docs` builds without warnings (doc changes only) — completed with 0 errors and 2 pre-existing Fern warnings - [x] Doc pages follow the [style guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md) (doc changes only) - [ ] New doc pages include SPDX header and frontmatter (new pages only) --- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Added v0.0.76 release notes content, and removed an older conflicting bullet from the surrounding release history. * Expanded Local NVIDIA NIM guidance across inference/provider docs, including an advisory for Linux arm64 DGX Spark/DGX Station hosts when a matching `linux/arm64` image manifest is unavailable. * Updated the command reference for correct session-section rendering and clarified `gc` image cleanup sources. * **Tests** * Added coverage ensuring Deep Agents omits sessions headings while Hermes includes them. * **CI** * Refreshed Local NVIDIA NIM provider notes used in the platform matrix. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Summary
The bundled OpenClaw/WhatsApp login path renders
openclaw channels login --channel whatsappthroughrenderQrTerminal(qr)with no{ small }option. The previous compacting path made the QR fit in the terminal, but the real no-options login render still usedqrcode's built-in compact terminal output with too little quiet zone for reliable scanning.This PR installs a WhatsApp runtime preload that renders terminal QR output from
qrcode.create(...).moduleswith a four-module quiet zone on all edges, and also hash-gates the pinned OpenClaw 2026.6.10 explicit{ small: true }compact renderer rewrite. The preload does not print a credential-deriveddata:image/pngfallback URL.Related Issue
Fixes #6386
Changes
src/lib/messaging/channels/whatsapp/runtime/whatsapp-qr-compact.tsand wire it through the manifest runtime preload path.qrcode's built-in small terminal renderer.{ small: true }compact renderer source rewrite for the pinned reviewed renderer, including all four quiet-zone edges.data:image/pngfallback data to terminal/log output.Type of Change
Quality Gates
Verification
Verifiedin GitHubpre-commit,commit-msg, andpre-pushhooks passed, ornpm run check:diffpassed when hooks were skipped or unavailable./node_modules/.bin/vitest run --project cli src/lib/messaging/channels/whatsapp/runtime/whatsapp-qr-compact.test.ts-> 23/23 passed./node_modules/.bin/vitest run --project integration test/whatsapp-qr-compact.test.ts-> 23/23 passedNEMOCLAW_RUN_LIVE_E2E=1 ./node_modules/.bin/vitest run --project e2e-live test/e2e/live/whatsapp-qr-compact.test.ts --silent=false --reporter=default-> 1/1 passednpm run test-conditionals:scan -- --top 25-> passednpm run typecheck:cli-> passednpm testfor broad runtime/test-harness changes;npm run checkfor repo-wide validation/coverage changes — command/result:npm run docsbuilds without warnings (doc changes only)Signed-off-by: Tinson Lai tinsonl@nvidia.com