fix(messaging): resolve the Discord per-account proxy so the gateway WebSocket connects#5248
Conversation
📝 WalkthroughWalkthroughThis PR makes discordProxyUrl resolve to an HTTP proxy URL derived from environment variables (NEMOCLAW_PROXY_HOST / NEMOCLAW_PROXY_PORT) with default host/port fallbacks, and updates tests and config-generator expectations to assert the Discord account-level proxy is populated. ChangesDiscord Proxy URL Implementation
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
…connects
channels.discord.accounts.default.proxy is rendered from {{discordProxyUrl}},
but the Discord template-resolver resolved that reference to undefined, so the
Discord account was emitted with no proxy. The Discord gateway client honors
only the per-account proxy (it ignores the managed env proxy), so the gateway
WebSocket could not egress the deny-by-default sandbox network namespace: the
bot sent via the Discord REST API but never established the gateway socket and
received zero inbound events.
Resolve discordProxyUrl to the sandbox proxy URL (NEMOCLAW_PROXY_HOST/PORT,
default http://10.200.0.1:3128), mirroring how the telegram resolver resolves
its proxyUrl. Telegram already routed its per-account proxy this way; Discord
was the lone gap.
Closes NVIDIA#5075
Signed-off-by: latenighthackathon <latenighthackathon@users.noreply.github.com>
54265be to
0b51186
Compare
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
test/generate-openclaw-config.test.ts (1)
661-671:⚠️ Potential issue | 🟡 MinorRemove/rename
NEMOCLAW_DISCORD_PROXY_PORTin the OpenShell loopback proxy test
NEMOCLAW_DISCORD_PROXY_PORTis only set intest/generate-openclaw-config.test.tsand is not read by the Discord proxy resolver (src/lib/messaging/channels/discord/template-resolver.tsuses onlyNEMOCLAW_PROXY_HOST/NEMOCLAW_PROXY_PORT).- If the intent is to ensure
OPENSHELL_LOOPBACK_PROXY_URLdoesn’t affect the managed proxy, dropNEMOCLAW_DISCORD_PROXY_PORTor replace it withNEMOCLAW_PROXY_PORT(orNEMOCLAW_PROXY_HOST) as the negative control.🤖 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/generate-openclaw-config.test.ts` around lines 661 - 671, The test sets NEMOCLAW_DISCORD_PROXY_PORT which is not used by the Discord proxy resolver; update the test (the runConfigScript call in the spec) to remove NEMOCLAW_DISCORD_PROXY_PORT or replace it with the real control env var NEMOCLAW_PROXY_PORT (and/or NEMOCLAW_PROXY_HOST) so the negative-control assertion verifies that OPENSHELL_LOOPBACK_PROXY_URL is ignored; ensure the test still asserts config.proxy.proxyUrl and config.channels.discord.accounts.default.proxy remain the managed proxy value and reference the resolver logic in src/lib/messaging/channels/discord/template-resolver.ts to match expected env names.
🤖 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/generate-openclaw-config.test.ts`:
- Around line 661-671: The test sets NEMOCLAW_DISCORD_PROXY_PORT which is not
used by the Discord proxy resolver; update the test (the runConfigScript call in
the spec) to remove NEMOCLAW_DISCORD_PROXY_PORT or replace it with the real
control env var NEMOCLAW_PROXY_PORT (and/or NEMOCLAW_PROXY_HOST) so the
negative-control assertion verifies that OPENSHELL_LOOPBACK_PROXY_URL is
ignored; ensure the test still asserts config.proxy.proxyUrl and
config.channels.discord.accounts.default.proxy remain the managed proxy value
and reference the resolver logic in
src/lib/messaging/channels/discord/template-resolver.ts to match expected env
names.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 299d4b31-65ac-4b6f-b762-31fd09da5735
📒 Files selected for processing (3)
src/lib/messaging/channels/discord/template-resolver.tstest/discord-template-resolver-proxy.test.tstest/generate-openclaw-config.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
- src/lib/messaging/channels/discord/template-resolver.ts
|
✨ Related open issues: |
## Summary Updates the messaging providers E2E M9b assertion so Discord now expects `channels.discord.accounts.default.proxy` to match the sandbox proxy while the top-level managed proxy remains configured. This aligns the test with the Discord proxy behavior restored by PR #5248 for issue #5075. ## Changes - Updated `test/e2e/test-messaging-providers.sh` M9b comments and pass/fail messages to describe per-account Discord proxy routing. - Changed the M9b assertion to require both `account.proxy` and `proxy.proxyUrl` to equal the expected sandbox proxy URL. - Reviewed `docs/` and found no user-facing docs update needed because this is a stale E2E expectation change with no product behavior change. ## 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) ## Verification - [ ] `npx prek run --all-files` passes - [ ] `npm test` passes - [x] Tests added or updated for new or changed behavior - [x] No secrets, API keys, or credentials committed - [ ] Docs updated for user-facing behavior changes - [ ] `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) Additional verification: - `bash -n test/e2e/test-messaging-providers.sh` passed. - `shellcheck test/e2e/test-messaging-providers.sh` passed. - `npx prek run --files test/e2e/test-messaging-providers.sh` passed. - `npx vitest run --project cli test/discord-template-resolver-proxy.test.ts test/generate-openclaw-config.test.ts` passed. - Docs review completed: no docs changes needed. - Full `npx prek run --all-files` and `npm test` were attempted and fail in unrelated existing suites outside this change. --- Signed-off-by: San Dang <sdang@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Tests** * Updated Discord proxy configuration validation in end-to-end tests to reflect current proxy-wiring expectations during configuration patching. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Signed-off-by: San Dang <sdang@nvidia.com>
Summary
A sandbox with the Discord channel comes up degraded: the bot sends via the Discord REST API but never establishes the gateway WebSocket, so it receives zero inbound events. This is the regression tracked in #5075 (originally #3894).
channels.discord.accounts.default.proxyis rendered from the{{discordProxyUrl}}template, butsrc/lib/messaging/channels/discord/template-resolver.tsresolved that reference toundefined, so the Discord account was emitted with no proxy. The Discord gateway client honors only the per-account proxy (it ignores the managed env proxy), so the gateway WebSocket cannot egress the deny-by-default sandbox network namespace.Telegram's resolver already resolves its
proxyUrlto the sandbox proxy; Discord was the lone gap.Related Issue
Closes #5075.
Changes
src/lib/messaging/channels/discord/template-resolver.ts: resolvediscordProxyUrlto the sandbox proxy URL (NEMOCLAW_PROXY_HOST/NEMOCLAW_PROXY_PORT, defaulthttp://10.200.0.1:3128) instead ofundefined, mirroring the telegram resolver.test/discord-template-resolver-proxy.test.ts: assertdiscordProxyUrlresolves to the default proxy and honors host/port overrides.Type of Change
Verification
npx vitest run --project cli test/discord-template-resolver-proxy.test.ts test/messaging-build-applier.test.ts— 18/18 passnpm run typecheck:cliandnpm run build:cli— cleanSigned-off-by: latenighthackathon latenighthackathon@users.noreply.github.com
Summary by CodeRabbit
New Features
Bug Fixes
Tests