Skip to content

feat(messaging): rebuild new manifest-style messaging architecture#4050

Merged
cv merged 38 commits into
mainfrom
u/sdang/messaging-hooks-channels-3993-3994
Jun 1, 2026
Merged

feat(messaging): rebuild new manifest-style messaging architecture#4050
cv merged 38 commits into
mainfrom
u/sdang/messaging-hooks-channels-3993-3994

Conversation

@sandl99
Copy link
Copy Markdown
Contributor

@sandl99 sandl99 commented May 22, 2026

Summary

Adds the phase-1 manifest-first messaging architecture foundation. This PR now folds the channel manifest/hook work together with the manifest compiler/planner engines and the serializable setup-applier boundary, while keeping the new path isolated from production workflows.

The current user-facing channel lifecycle is unchanged. The new module gives us typed, serializable planning pieces that can be migrated into onboarding, rebuild, and channel commands in later PRs.

Related Issue

Fixes #3993
Fixes #3994
Fixes #3995
Fixes #3996
Part of #3896

Changes

  • Add built-in ChannelManifest declarations for Telegram, Discord, Slack, WeChat, and WhatsApp with current env keys, provider placeholders, policy presets, supported agents, render intent, persisted state fields, and rebuild hydration rules.
  • Add manifest-scoped hook declarations and hook registry/runner contracts, including token-paste enrollment, Telegram reachability, WeChat host-QR enrollment, and WeChat OpenClaw account seeding boundaries.
  • Add fake hook registrations and tests for common token paste, Telegram reachability, and WeChat enrollment/seeding so phase-1 shapes are testable without real credentials, QR login, or sandbox file writes.
  • Add ManifestCompiler and MessagingWorkflowPlanner to compile selected/configured channels into a serializable SandboxMessagingPlan.
  • Add pure planning engines for credential bindings, network policy, agent render fragments, build steps, state updates, health checks, and template handling.
  • Add MessagingSetupApplier scaffolding for plan serialization, OpenShell provider upsert planning/application, policy preset application, agent config writes, build-file hook output application, and hook request listing.
  • Keep the new messaging module isolated from production onboarding/channel-command flows so this PR should not change current runtime behavior.

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

  • 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)

Additional verification:

  • npm test -- --project cli src/lib/messaging passes on the synced branch.
  • npm run typecheck:cli was attempted on the synced branch but currently fails in broader branch/dist-generated test imports and non-messaging type drift, including missing dist/commands/resources.js, missing generated dist/lib/inference/ollama-model-registry, and unrelated onboard/inference test type mismatches.

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

Summary by CodeRabbit

  • New Features
    • Added support for Discord, Slack, Telegram, WeChat, and WhatsApp messaging integrations
    • Introduced messaging workflow planning and configuration system for managing messaging channels

Signed-off-by: San Dang <sdang@nvidia.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 22, 2026

📝 Walkthrough

Walkthrough

Adds a messaging hook subsystem (types, registry, runner, fakes, tests), complete channel manifests (Telegram, Slack, Discord, WeChat, WhatsApp) with built-in registry, a ManifestCompiler and workflow planner with engine modules, and a MessagingSetupApplier (plus comprehensive tests and package export wiring).

Changes

Messaging hooks and built-in channel manifests

Layer / File(s) Summary
Hook system type contracts
src/lib/messaging/hooks/types.ts
Type declarations for handler IDs, input/output maps, run context, handler signature, registration metadata, and run result shape.
Hook handler registry
src/lib/messaging/hooks/registry.ts
In-memory registry with registration (reject duplicates), optional/required handler lookup, id listing, and factory to seed registrations.
Hook execution and output validation
src/lib/messaging/hooks/hook-runner.ts
Resolves and invokes handlers with channel/hook/phase/inputs, normalizes missing outputs, enforces declared required outputs and kind matching, and validates messaging-serializability (plain objects/arrays/primitives, circular detection).
Hook registry & runner tests
src/lib/messaging/hooks/hook-runner.test.ts
Tests for handler registration/execution, duplicate/missing handler errors, required-output enforcement, preserved shared non-cyclic references, and rejection cases for kind mismatch, undeclared outputs, and circular values.
Common token-paste hook & tests
src/lib/messaging/hooks/common/token-paste.ts, src/lib/messaging/hooks/common/token-paste.test.ts, src/lib/messaging/hooks/common/index.ts
Shared fake token-paste hook implementation and tests used by Slack/Telegram/Discord manifests; re-export through common hooks barrel.
Telegram manifest & hooks
src/lib/messaging/channels/telegram/manifest.ts, src/lib/messaging/channels/telegram/hooks/*
Telegram manifest with botToken input, credential mapping, renders for OpenClaw/Hermes, persisted state/hydration, enroll token-paste hook and reachability-check hook; fake reachability hook tests.
Slack manifest
src/lib/messaging/channels/slack/manifest.ts
Slack manifest with bot/app token secret inputs, credential placeholders, allowed-user state, OpenClaw/Hermes renders, and token-paste enroll hook.
Discord manifest
src/lib/messaging/channels/discord/manifest.ts
Discord manifest with bot token input, optional guild/flags/allowlist, credential mapping, policy preset, OpenClaw/Hermes render fragments, persisted guild state, and enroll hook.
WeChat fakes & manifest
src/lib/messaging/channels/wechat/hooks/fakes.ts, src/lib/messaging/channels/wechat/manifest.ts, src/lib/messaging/channels/wechat/hooks/fakes.test.ts
Deterministic WeChat fake hooks producing token/config and build-file outputs; WeChat manifest declares host-QR enroll, inputs, credential provider template, Hermes env rendering, persisted state/hydration, and post-install seed hook.
WhatsApp manifest
src/lib/messaging/channels/whatsapp/manifest.ts
WhatsApp manifest with in-sandbox-qr auth mode, OpenClaw JSON fragment and Hermes env-lines render outputs, and whatsapp policy preset.
Channels index & built-in registry
src/lib/messaging/channels/index.ts
Exports per-platform manifests, defines BUILT_IN_CHANNEL_MANIFESTS (includes WeChat), and provides createBuiltInChannelManifestRegistry() factory.
Manifest validation tests
src/lib/messaging/channels/manifests.test.ts
Validates built-in manifests against sandbox KNOWN_CHANNELS: metadata, auth modes, envKey/credential mappings, render specs, Hermes env-lines, hydration rules, and hook wiring (including WhatsApp QR behavior).
Template & agent render engines
src/lib/messaging/compiler/engines/template.ts, src/lib/messaging/compiler/engines/agent-render-engine.ts
Utilities to resolve {sandboxName} and {{ credential.* }} placeholders, collect template refs, and emit agent-scoped render plans (json-fragment vs env-lines) with resolved credential placeholders.
Build-step, credential-binding, state-update, health-check, policy engines
src/lib/messaging/compiler/engines/*
Engines to plan build steps from hooks, credential bindings/provider name templates, state persist/hydration plans, health-check entries, and network policy preset/entry resolution.
Manifest types reshaping
src/lib/messaging/manifest/types.ts
Expanded/reshaped plan contract: new hook phases, channel-scoped input references with credentialAvailable/value, credential binding plans, agent render plans with templateRefs, build-step plans, state-update plans, and health-checks.
ManifestCompiler & tests
src/lib/messaging/compiler/manifest-compiler.ts, src/lib/messaging/compiler/manifest-compiler.test.ts
Compiles ChannelManifests into a serializable SandboxMessagingPlan: resolves inputs from env/state, applies enrollment/reachability hooks (with onFailure semantics), computes credentialBindings, networkPolicy, agentRender, buildSteps, stateUpdates, and healthChecks; tests for determinism, interactivity, and non-secret serialization.
MessagingWorkflowPlanner & tests
src/lib/messaging/compiler/workflow-planner.ts, src/lib/messaging/compiler/workflow-planner.test.ts
Planner methods for onboard/add/remove/start/stop/rebuild workflows that build ManifestCompilerContext and invoke ManifestCompiler; tests verify workflow semantics and serialization.
MessagingSetupApplier, types & tests
src/lib/messaging/applier/setup-applier.ts, src/lib/messaging/applier/types.ts, src/lib/messaging/applier/setup-applier.test.ts
Applier encodes/decodes plans to env, validates JSON-serializability, lists/runs hook requests, applies agent config files (json/yaml/env-lines), applies credentials via provider commands (create/update), and applies policy presets; tests cover IO, provider arg sequences, redaction, and hook build-file outputs.
Package barrels & minor test tweaks
src/lib/messaging/index.ts, src/lib/messaging/hooks/index.ts, test import reorder/type fixture updates
Messaging package entrypoint re-exports channels/compiler/hooks/applier; hooks barrel aggregates common/token-paste, registry, and runner; tests adjusted for new plan shapes and minor import reorder.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related issues

Possibly related PRs

Suggested reviewers

  • cv
  • ericksoa

Poem

🐰 Manifests and hooks hop into place with glee,
Tokens and envs drawn out for all to see.
Registry holds handlers, runner checks each line,
Compiler plans and applier write files just fine.
A rabbit cheers: phase one is ready to be!

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch u/sdang/messaging-hooks-channels-3993-3994

@sandl99 sandl99 added VRDC Issues and PRs submitted by NVIDIA VRDC test team. refactor PR restructures code without intended behavior change labels May 22, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 22, 2026

E2E Advisor Recommendation

Required E2E: messaging-providers-e2e, channels-stop-start-e2e, token-rotation-e2e, network-policy-e2e
Optional E2E: channels-add-remove-e2e, hermes-discord-e2e, hermes-slack-e2e, messaging-compatible-endpoint-e2e

Dispatch hint: messaging-providers-e2e,channels-stop-start-e2e,token-rotation-e2e,network-policy-e2e

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • messaging-providers-e2e (high (~75 min timeout)): Primary existing coverage for the provider/placeholder/L7-proxy chain, credential isolation, OpenClaw config patching, messaging API reachability, WeChat provider binding, and WhatsApp no-provider policy/config path affected by the new manifests, compiler, and applier.
  • channels-stop-start-e2e (very high (~120 min timeout)): Exercises stop/start and rebuild persistence across Telegram, Discord, WeChat, Slack, and WhatsApp for both OpenClaw and Hermes, matching the PR's changes to all built-in channel manifests, agent render outputs, disabled-channel filtering, and Hermes env/config rendering.
  • token-rotation-e2e (medium-high (~45 min timeout)): Credential applier changes include OpenShell provider update/create/reuse behavior; this E2E validates that rerunning onboarding after messaging token rotation propagates updated Telegram, Discord, and Slack credentials without cross-talk.
  • network-policy-e2e (medium): The PR adds messaging policy preset resolution/application and channel policy key compilation. This existing E2E should run to catch regressions in sandbox network-policy application and egress boundaries.

Optional E2E

  • channels-add-remove-e2e (high (~75 min timeout)): Useful adjacent coverage for channel add/remove policy preset application, provider detach, and rebuild behavior. Required coverage already includes the broader stop/start matrix, but this gives focused add/remove confidence.
  • hermes-discord-e2e (medium-high (~60 min timeout)): Optional Hermes-specific validation for Discord schema, placeholder/token isolation, and Hermes config rendering touched by the new Discord manifest and compiler render engines.
  • hermes-slack-e2e (medium-high (~60 min timeout)): Optional Hermes-specific validation for Slack policy, providers, and credential rewrite path touched by the new Slack manifest and credential/render compiler logic.
  • messaging-compatible-endpoint-e2e (medium): Optional real assistant-flow confidence for Telegram messaging plus OpenAI-compatible inference routing through inference.local. Useful because the PR changes Telegram manifest/render/reachability behavior but not strictly required if provider and lifecycle E2Es pass.

New E2E recommendations

  • manifest-driven messaging setup applier (high): Existing E2Es validate current user flows, but there is no clearly named E2E that specifically round-trips the new serializable SandboxMessagingPlan through MessagingSetupApplier in a live OpenShell sandbox, including env-plan handoff, hook execution, config file writes, credential provider application, and policy application.
    • Suggested test: Add a manifest-plan-applier E2E that builds a plan for Telegram + WeChat, writes NEMOCLAW_MESSAGING_PLAN_B64, applies credentials/policy/config through OpenShell, and asserts sandbox files/providers contain placeholders but no raw secrets.
  • WeChat host-QR hook integration (medium): Unit tests cover injected WeChat hook implementations, but existing E2Es appear to use fake WeChat env values rather than exercising a host-QR enrollment hook handoff into post-agent-install build-file outputs in a live sandbox.
    • Suggested test: Add a hermetic WeChat host-QR hook E2E with a fake iLink login provider that returns token/account metadata, then verifies seeded openclaw-weixin account files and merged openclaw.json inside the sandbox.
  • unsafe manifest/hook output sandbox boundary (medium): The applier adds critical path, mode, and prototype-pollution validation for rendered targets and hook build-file outputs. Unit tests cover this, but a live OpenShell regression would catch shell quoting or path-root bypasses at the sandbox write boundary.
    • Suggested test: Add a security E2E that attempts unsafe messaging hook build-file outputs and render targets against a disposable sandbox and verifies no files are written outside the agent config root.

Dispatch hint

  • Workflow: nightly-e2e.yaml
  • jobs input: messaging-providers-e2e,channels-stop-start-e2e,token-rotation-e2e,network-policy-e2e

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

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 `@src/lib/messaging/hooks/hook-runner.ts`:
- Around line 82-105: The function isMessagingSerializableValue currently treats
any repeated object as a cycle by using a single WeakSet; change it to track the
current recursion path (visiting) so shared references like [sameObj, sameObj]
are allowed while real reference cycles still fail. In
isMessagingSerializableValue, rename the second parameter to something like
visiting (WeakSet<object>), replace the early "if (seen.has(objectValue)) return
false" with "if (visiting.has(objectValue)) return false" to detect cycles only
on the current stack, add the object to visiting before recursing into arrays or
object values, and remove it from visiting after recursion returns; do not
reject objects just because they were seen earlier in a different branch. Keep
all other logic (primitive checks, prototype check using Object.getPrototypeOf)
the same and ensure recursive calls pass the visiting set.
🪄 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: f26d3f6a-bab2-4b28-aa67-eb5273dd95be

📥 Commits

Reviewing files that changed from the base of the PR and between 6431f33 and bb83755.

📒 Files selected for processing (14)
  • src/lib/messaging/channels/discord/manifest.ts
  • src/lib/messaging/channels/index.ts
  • src/lib/messaging/channels/manifests.test.ts
  • src/lib/messaging/channels/slack/manifest.ts
  • src/lib/messaging/channels/telegram/manifest.ts
  • src/lib/messaging/channels/whatsapp/manifest.ts
  • src/lib/messaging/hooks/hook-runner.test.ts
  • src/lib/messaging/hooks/hook-runner.ts
  • src/lib/messaging/hooks/index.ts
  • src/lib/messaging/hooks/registry.ts
  • src/lib/messaging/hooks/types.ts
  • src/lib/messaging/index.ts
  • src/lib/messaging/manifest/registry.test.ts
  • src/lib/messaging/manifest/types.test.ts

Comment thread src/lib/messaging/hooks/hook-runner.ts
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 22, 2026

PR Review Advisor

Findings: 4 needs attention, 8 worth checking, 0 nice ideas
Since last review: 0 prior items resolved, 10 still apply, 2 new items found

Review findings

🛠️ Needs attention

  • Deep-validate decoded messaging plans before OpenShell side effects (src/lib/messaging/applier/setup-applier.ts:106): The applier still treats NEMOCLAW_MESSAGING_PLAN_B64 as valid after only top-level shape checks, then consumes nested provider names, env keys, policy presets/keys, render entries, hook references, and channel IDs. Because this serialized plan crosses a trusted-code boundary and drives OpenShell provider updates, policy application, hook execution, and sandbox writes, tampering with nested fields can bypass manifest constraints before path-specific guards run.
    • Recommendation: Add a runtime schema/deep validator for SandboxMessagingPlan before any applier side effect. Constrain agent/workflow enums, sandbox/channel/provider/env-key formats, policy preset/key names, hook phases/handlers/output declarations, credential binding structure, render targets/paths, and build-file shapes. Add negative tests for tampered provider, policy, render, and hook entries that assert no OpenShell call occurs.
    • Evidence: assertSandboxMessagingPlan() checks schemaVersion, sandboxName, agent, workflow, and that top-level collections are arrays/objects; applyCredentialsAtOpenShell() and applyPolicyAtOpenShell() then consume binding.providerName, binding.providerEnvKey, entry.presetName, and entry.policyKeys directly from the plan.
  • Validate applier hook outputs against declared outputs before applying build files (src/lib/messaging/applier/agent-config.ts:177): runMessagingHook() enforces that hook outputs are declared, have the expected kind, and are serializable, but applyAgentConfigAtOpenShell() accepts the injected runHook result directly and applies any build-file outputs it receives. A raw or buggy applier hook runner can therefore return undeclared build-file outputs that write or merge sandbox agent config files within the allowed roots.
    • Recommendation: Route applier hook execution through the same output-declaration validation used by runMessagingHook(), or add an equivalent validator in runApplyHook() using request.outputs before applyHookBuildFileOutputs(). Add tests for undeclared outputs, kind mismatches, non-serializable values, and required-output failures.
    • Evidence: runApplyHook() awaits runner(request), then calls applyHookBuildFileOutputs(plan, result.outputs, runOpenshell) when outputs exist. The validation in hooks/hook-runner.ts is not invoked on this path.
  • remove-channel plans still keep the removed channel configured and disabled (src/lib/messaging/compiler/workflow-planner.test.ts:292): The linked [Messaging] Add workflow planner for onboard and channel lifecycle #3995 acceptance criterion says remove-channel plans remove the channel from configured and disabled state, but the current planner contract/test still models the removed WeChat channel as configured, disabled, and present in the plan.
    • Recommendation: Change the planner API/tests so remove-channel receives enough pre-state plus the removed channel and emits the post-removal configured/disabled state, or explicitly revise the issue scope if callers are intentionally responsible for pre-filtering before invoking this planner.
    • Evidence: The test named builds remove-channel plans from the post-removal configured state passes configuredChannels: ["wechat", "slack"] and disabledChannels: ["wechat"], then expects disabledChannels to equal ["wechat"], channels to include wechat, and WeChat to match configured: true, disabled: true, active: false.
  • Messaging foundation adds several monolith hotspots (src/lib/messaging/applier/agent-config.ts:1): This PR adds multiple large new files in current hotspot areas, including a 605-line applier implementation and several large test files. The deterministic drift policy flagged these as monolith growth needing extraction or an explicit offset before merge.
    • Recommendation: Split the largest files by responsibility before merging: separate agent-config path validation, structured merge, env-line rendering, hook-output handling, and OpenShell I/O; split large tests by feature area. If an exception is intentional, document why the growth is temporary and what follow-up removes it.
    • Evidence: Monolith deltas flagged setup-applier.test.ts (+765), manifest-compiler.test.ts (+637), agent-config.ts (+605), and channels/manifests.test.ts (+423).

🔎 Worth checking

  • Source-of-truth review needed: src/lib/messaging/applier/agent-config.ts runApplyHook onFailure skip-channel: The advisor marked localized patch analysis as needs_followup.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: runApplyHook() catches errors and returns when request.onFailure === "skip-channel".
  • Source-of-truth review needed: src/lib/messaging/channels/telegram/hooks/get-me-reachability.ts network and JSON tolerance: The advisor marked localized patch analysis as needs_followup.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: fetchTelegramGetMe(...).catch() throws a generic error and readTelegramJson() catches parse errors and returns {}.
  • Source-of-truth review needed: src/lib/messaging/applier/agent-config.ts unresolved template handling: The advisor marked localized patch analysis as missing.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: applyAgentConfigAtOpenShell() writes files before returning unresolvedTemplateRefs.
  • Unresolved authorization templates can be written into agent configs (src/lib/messaging/applier/agent-config.ts:75): The applier writes rendered OpenClaw/Hermes config contents and only reports unresolvedTemplateRefs afterward. Several unresolved references control authorization or exposure behavior, such as allowed users, Discord guilds, Slack channel/user policy, and Telegram mention behavior. If a later resolver is skipped or incomplete, agents may receive literal placeholders or fall back to insecure defaults.
    • Recommendation: Fail closed on unresolved security-sensitive template refs before writing config, or add a required resolver stage before applyAgentConfigAtOpenShell(). At minimum classify refs and reject unresolved allowlist/auth/mention templates in apply paths, with negative tests.
    • Evidence: applyAgentConfigAtOpenShell() writes contents with writeSandboxFile() before returning unresolvedTemplateRefs. Tests assert the written OpenClaw config still contains {{telegramConfig.requireMention}}, and manifests contain refs such as {{allowedIds.*}}, {{discord.guilds}}, and {{discord.allowedUsers.*}}.
  • Telegram reachability puts the bot token in the request URL path without full redaction coverage (src/lib/messaging/channels/telegram/hooks/get-me-reachability.ts:70): The Telegram Bot API URL embeds the bot token in the path. Although the hook throws generic errors for fetch failures, tokenized URLs are commonly captured by fetch instrumentation, proxies, traces, or request metadata. The partial redaction helper used elsewhere does not apply the /bot<REDACTED>/ path rule used by full redaction.
    • Recommendation: Ensure every error/log path that can include Telegram request URLs uses redactFull() or an equivalent /bot.../ path redaction. Add a negative test where a failed fetch/error includes the Telegram URL and assert the token is not exposed.
    • Evidence: fetchTelegramGetMe() calls fetchImpl(`${baseUrl}/bot${token}/getMe`). redactFull() has a /bot<REDACTED>/ rule, while redact() only performs URL query/userinfo redaction and token-pattern partial redaction.
  • WeChat plugin installation is version-pinned but not integrity-verified (src/lib/messaging/channels/wechat/hooks/seed-openclaw-account.ts:16): The WeChat seed hook writes an OpenClaw plugin install entry from an npm package spec pinned to a version, but without integrity, lockfile, trusted registry, or artifact verification metadata. This introduces installer/supply-chain trust into sandbox configuration.
    • Recommendation: Add integrity verification or a trusted artifact mechanism before wiring this path into production. If OpenClaw supports lockfile or integrity fields, include them in the generated patch and test that unverified plugin specs are rejected.
    • Evidence: WECHAT_PLUGIN_SPEC is @tencent-weixin/openclaw-weixin@2.4.3; buildWechatSeedOpenClawAccountOutputs() emits plugins.installs.openclaw-weixin with source: "npm", spec, and installPath.
  • Localized tolerant paths need source-of-truth decisions before production use (src/lib/messaging/applier/agent-config.ts:181): Several new tolerance paths handle invalid states locally without documenting the source boundary, why the source cannot be fixed here, the regression test proving the source cannot regress, or when the workaround can be removed. This includes silently skipping apply hooks on onFailure: skip-channel, converting Telegram network failures to generic errors, and treating malformed Telegram JSON as {}.
    • Recommendation: For each tolerant behavior, either make the invalid state impossible at the producer or document and test the boundary explicitly. Add negative tests for apply-hook skip behavior and malformed/network-failed Telegram reachability, including expected channel state and cleanup behavior.
    • Evidence: runApplyHook() catches errors and returns when request.onFailure === "skip-channel"; fetchTelegramGetMe(...).catch() throws a generic error; readTelegramJson() catches parse errors and returns {}.
  • OpenShell and sandbox applier behavior is covered only by mocks (src/lib/messaging/applier/setup-applier.test.ts:185): The tests have useful unit coverage for command shapes, path guards, prototype-pollution defenses, and disabled-channel filtering, but the changed surfaces perform OpenShell provider mutations, policy application, sandbox file writes, chmod/mode application, and config merging through shell commands. Those runtime/infrastructure paths need targeted validation before production wiring.
    • Recommendation: Add or identify targeted runtime/integration validation for provider create/update env passing, policy preset application, sandbox file writes, mode application, and config merge behavior. Keep external E2E status separate from this review.
    • Evidence: setup-applier tests use mock MessagingOpenShellRunner callbacks and in-memory files maps. Deterministic test-depth context marked the applier/runtime paths as runtime_validation_recommended.

🌱 Nice ideas

  • None.
Since last review details

Current findings:

  • Source-of-truth review needed: src/lib/messaging/applier/agent-config.ts runApplyHook onFailure skip-channel: The advisor marked localized patch analysis as needs_followup.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: runApplyHook() catches errors and returns when request.onFailure === "skip-channel".
  • Source-of-truth review needed: src/lib/messaging/channels/telegram/hooks/get-me-reachability.ts network and JSON tolerance: The advisor marked localized patch analysis as needs_followup.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: fetchTelegramGetMe(...).catch() throws a generic error and readTelegramJson() catches parse errors and returns {}.
  • Source-of-truth review needed: src/lib/messaging/applier/agent-config.ts unresolved template handling: The advisor marked localized patch analysis as missing.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: applyAgentConfigAtOpenShell() writes files before returning unresolvedTemplateRefs.
  • Deep-validate decoded messaging plans before OpenShell side effects (src/lib/messaging/applier/setup-applier.ts:106): The applier still treats NEMOCLAW_MESSAGING_PLAN_B64 as valid after only top-level shape checks, then consumes nested provider names, env keys, policy presets/keys, render entries, hook references, and channel IDs. Because this serialized plan crosses a trusted-code boundary and drives OpenShell provider updates, policy application, hook execution, and sandbox writes, tampering with nested fields can bypass manifest constraints before path-specific guards run.
    • Recommendation: Add a runtime schema/deep validator for SandboxMessagingPlan before any applier side effect. Constrain agent/workflow enums, sandbox/channel/provider/env-key formats, policy preset/key names, hook phases/handlers/output declarations, credential binding structure, render targets/paths, and build-file shapes. Add negative tests for tampered provider, policy, render, and hook entries that assert no OpenShell call occurs.
    • Evidence: assertSandboxMessagingPlan() checks schemaVersion, sandboxName, agent, workflow, and that top-level collections are arrays/objects; applyCredentialsAtOpenShell() and applyPolicyAtOpenShell() then consume binding.providerName, binding.providerEnvKey, entry.presetName, and entry.policyKeys directly from the plan.
  • Validate applier hook outputs against declared outputs before applying build files (src/lib/messaging/applier/agent-config.ts:177): runMessagingHook() enforces that hook outputs are declared, have the expected kind, and are serializable, but applyAgentConfigAtOpenShell() accepts the injected runHook result directly and applies any build-file outputs it receives. A raw or buggy applier hook runner can therefore return undeclared build-file outputs that write or merge sandbox agent config files within the allowed roots.
    • Recommendation: Route applier hook execution through the same output-declaration validation used by runMessagingHook(), or add an equivalent validator in runApplyHook() using request.outputs before applyHookBuildFileOutputs(). Add tests for undeclared outputs, kind mismatches, non-serializable values, and required-output failures.
    • Evidence: runApplyHook() awaits runner(request), then calls applyHookBuildFileOutputs(plan, result.outputs, runOpenshell) when outputs exist. The validation in hooks/hook-runner.ts is not invoked on this path.
  • Unresolved authorization templates can be written into agent configs (src/lib/messaging/applier/agent-config.ts:75): The applier writes rendered OpenClaw/Hermes config contents and only reports unresolvedTemplateRefs afterward. Several unresolved references control authorization or exposure behavior, such as allowed users, Discord guilds, Slack channel/user policy, and Telegram mention behavior. If a later resolver is skipped or incomplete, agents may receive literal placeholders or fall back to insecure defaults.
    • Recommendation: Fail closed on unresolved security-sensitive template refs before writing config, or add a required resolver stage before applyAgentConfigAtOpenShell(). At minimum classify refs and reject unresolved allowlist/auth/mention templates in apply paths, with negative tests.
    • Evidence: applyAgentConfigAtOpenShell() writes contents with writeSandboxFile() before returning unresolvedTemplateRefs. Tests assert the written OpenClaw config still contains {{telegramConfig.requireMention}}, and manifests contain refs such as {{allowedIds.*}}, {{discord.guilds}}, and {{discord.allowedUsers.*}}.
  • remove-channel plans still keep the removed channel configured and disabled (src/lib/messaging/compiler/workflow-planner.test.ts:292): The linked [Messaging] Add workflow planner for onboard and channel lifecycle #3995 acceptance criterion says remove-channel plans remove the channel from configured and disabled state, but the current planner contract/test still models the removed WeChat channel as configured, disabled, and present in the plan.
    • Recommendation: Change the planner API/tests so remove-channel receives enough pre-state plus the removed channel and emits the post-removal configured/disabled state, or explicitly revise the issue scope if callers are intentionally responsible for pre-filtering before invoking this planner.
    • Evidence: The test named builds remove-channel plans from the post-removal configured state passes configuredChannels: ["wechat", "slack"] and disabledChannels: ["wechat"], then expects disabledChannels to equal ["wechat"], channels to include wechat, and WeChat to match configured: true, disabled: true, active: false.
  • Telegram reachability puts the bot token in the request URL path without full redaction coverage (src/lib/messaging/channels/telegram/hooks/get-me-reachability.ts:70): The Telegram Bot API URL embeds the bot token in the path. Although the hook throws generic errors for fetch failures, tokenized URLs are commonly captured by fetch instrumentation, proxies, traces, or request metadata. The partial redaction helper used elsewhere does not apply the /bot<REDACTED>/ path rule used by full redaction.
    • Recommendation: Ensure every error/log path that can include Telegram request URLs uses redactFull() or an equivalent /bot.../ path redaction. Add a negative test where a failed fetch/error includes the Telegram URL and assert the token is not exposed.
    • Evidence: fetchTelegramGetMe() calls fetchImpl(`${baseUrl}/bot${token}/getMe`). redactFull() has a /bot<REDACTED>/ rule, while redact() only performs URL query/userinfo redaction and token-pattern partial redaction.
  • WeChat plugin installation is version-pinned but not integrity-verified (src/lib/messaging/channels/wechat/hooks/seed-openclaw-account.ts:16): The WeChat seed hook writes an OpenClaw plugin install entry from an npm package spec pinned to a version, but without integrity, lockfile, trusted registry, or artifact verification metadata. This introduces installer/supply-chain trust into sandbox configuration.
    • Recommendation: Add integrity verification or a trusted artifact mechanism before wiring this path into production. If OpenClaw supports lockfile or integrity fields, include them in the generated patch and test that unverified plugin specs are rejected.
    • Evidence: WECHAT_PLUGIN_SPEC is @tencent-weixin/openclaw-weixin@2.4.3; buildWechatSeedOpenClawAccountOutputs() emits plugins.installs.openclaw-weixin with source: "npm", spec, and installPath.
  • Localized tolerant paths need source-of-truth decisions before production use (src/lib/messaging/applier/agent-config.ts:181): Several new tolerance paths handle invalid states locally without documenting the source boundary, why the source cannot be fixed here, the regression test proving the source cannot regress, or when the workaround can be removed. This includes silently skipping apply hooks on onFailure: skip-channel, converting Telegram network failures to generic errors, and treating malformed Telegram JSON as {}.
    • Recommendation: For each tolerant behavior, either make the invalid state impossible at the producer or document and test the boundary explicitly. Add negative tests for apply-hook skip behavior and malformed/network-failed Telegram reachability, including expected channel state and cleanup behavior.
    • Evidence: runApplyHook() catches errors and returns when request.onFailure === "skip-channel"; fetchTelegramGetMe(...).catch() throws a generic error; readTelegramJson() catches parse errors and returns {}.
  • OpenShell and sandbox applier behavior is covered only by mocks (src/lib/messaging/applier/setup-applier.test.ts:185): The tests have useful unit coverage for command shapes, path guards, prototype-pollution defenses, and disabled-channel filtering, but the changed surfaces perform OpenShell provider mutations, policy application, sandbox file writes, chmod/mode application, and config merging through shell commands. Those runtime/infrastructure paths need targeted validation before production wiring.
    • Recommendation: Add or identify targeted runtime/integration validation for provider create/update env passing, policy preset application, sandbox file writes, mode application, and config merge behavior. Keep external E2E status separate from this review.
    • Evidence: setup-applier tests use mock MessagingOpenShellRunner callbacks and in-memory files maps. Deterministic test-depth context marked the applier/runtime paths as runtime_validation_recommended.
  • Messaging foundation adds several monolith hotspots (src/lib/messaging/applier/agent-config.ts:1): This PR adds multiple large new files in current hotspot areas, including a 605-line applier implementation and several large test files. The deterministic drift policy flagged these as monolith growth needing extraction or an explicit offset before merge.
    • Recommendation: Split the largest files by responsibility before merging: separate agent-config path validation, structured merge, env-line rendering, hook-output handling, and OpenShell I/O; split large tests by feature area. If an exception is intentional, document why the growth is temporary and what follow-up removes it.
    • Evidence: Monolith deltas flagged setup-applier.test.ts (+765), manifest-compiler.test.ts (+637), agent-config.ts (+605), and channels/manifests.test.ts (+423).

Workflow run details

This is an automated advisory review. A human maintainer must make the final merge decision.

sandl99 added 2 commits May 22, 2026 10:30
Signed-off-by: San Dang <sdang@nvidia.com>
Signed-off-by: San Dang <sdang@nvidia.com>
@sandl99 sandl99 changed the title feat(messaging): add hook scaffold and channel manifests feat(messaging): add channel enrollment manifests May 22, 2026
@sandl99 sandl99 requested a review from cv May 22, 2026 08:58
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 23, 2026

E2E Scenario Advisor Recommendation

Required scenario E2E: ubuntu-repo-cloud-openclaw-telegram, ubuntu-repo-cloud-openclaw-discord, ubuntu-repo-cloud-openclaw-slack, ubuntu-repo-cloud-hermes-discord, ubuntu-repo-cloud-hermes-slack, ubuntu-repo-cloud-openclaw-token-rotation
Optional scenario E2E: None

Dispatch required scenario E2E:

  • gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-openclaw-telegram
  • gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-openclaw-discord
  • gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-openclaw-slack
  • gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-hermes-discord
  • gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-hermes-slack
  • gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-openclaw-token-rotation

Workflow run

Full scenario advisor summary

E2E Scenario Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required scenario E2E

  • ubuntu-repo-cloud-openclaw-telegram: Messaging compiler/applier, hook registry, Telegram manifest, and Telegram reachability hook changes affect the OpenClaw Telegram onboarding path and messaging-telegram suite.
    • Dispatch: gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-openclaw-telegram
  • ubuntu-repo-cloud-openclaw-discord: Discord manifest plus shared messaging plan compilation, credential binding, provider application, policy, and OpenClaw agent-render changes affect the OpenClaw Discord messaging suite.
    • Dispatch: gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-openclaw-discord
  • ubuntu-repo-cloud-openclaw-slack: Slack manifest plus shared messaging credential/provider, policy, hook, and OpenClaw render/applier changes affect the OpenClaw Slack messaging suite.
    • Dispatch: gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-openclaw-slack
  • ubuntu-repo-cloud-hermes-discord: The changed manifests and render/applier/compiler code include Hermes-specific env/config rendering for Discord, so the Hermes Discord messaging scenario should run.
    • Dispatch: gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-hermes-discord
  • ubuntu-repo-cloud-hermes-slack: The changed manifests and render/applier/compiler code include Hermes-specific env rendering for Slack, so the Hermes Slack messaging scenario should run.
    • Dispatch: gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-hermes-slack
  • ubuntu-repo-cloud-openclaw-token-rotation: Shared credential binding and OpenShell provider application changes can affect provider reuse/update and token rotation behavior covered by the messaging-token-rotation suite.
    • Dispatch: gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-openclaw-token-rotation

Optional scenario E2E

  • None.

Relevant changed files

  • src/lib/messaging/applier/agent-config.ts
  • src/lib/messaging/applier/index.ts
  • src/lib/messaging/applier/openshell-provider.ts
  • src/lib/messaging/applier/plan-filter.ts
  • src/lib/messaging/applier/policy.ts
  • src/lib/messaging/applier/setup-applier.test.ts
  • src/lib/messaging/applier/setup-applier.ts
  • src/lib/messaging/applier/types.ts
  • src/lib/messaging/channels/discord/manifest.ts
  • src/lib/messaging/channels/index.ts
  • src/lib/messaging/channels/manifests.test.ts
  • src/lib/messaging/channels/slack/manifest.ts
  • src/lib/messaging/channels/telegram/hooks/get-me-reachability.test.ts
  • src/lib/messaging/channels/telegram/hooks/get-me-reachability.ts
  • src/lib/messaging/channels/telegram/hooks/index.ts
  • src/lib/messaging/channels/telegram/manifest.ts
  • src/lib/messaging/channels/wechat/hooks/health-check.ts
  • src/lib/messaging/channels/wechat/hooks/ilink-login.ts
  • src/lib/messaging/channels/wechat/hooks/implementations.test.ts
  • src/lib/messaging/channels/wechat/hooks/index.ts
  • src/lib/messaging/channels/wechat/hooks/seed-openclaw-account.ts
  • src/lib/messaging/channels/wechat/manifest.ts
  • src/lib/messaging/channels/whatsapp/manifest.ts
  • src/lib/messaging/compiler/engines/agent-render-engine.ts
  • src/lib/messaging/compiler/engines/build-step-engine.ts
  • src/lib/messaging/compiler/engines/credential-binding-engine.ts
  • src/lib/messaging/compiler/engines/health-check-engine.ts
  • src/lib/messaging/compiler/engines/policy-resolver.ts
  • src/lib/messaging/compiler/engines/state-update-engine.ts
  • src/lib/messaging/compiler/engines/template.ts
  • src/lib/messaging/compiler/index.ts
  • src/lib/messaging/compiler/manifest-compiler.test.ts
  • src/lib/messaging/compiler/manifest-compiler.ts
  • src/lib/messaging/compiler/types.ts
  • src/lib/messaging/compiler/workflow-planner.test.ts
  • src/lib/messaging/compiler/workflow-planner.ts
  • src/lib/messaging/hooks/builtins.ts
  • src/lib/messaging/hooks/common/index.ts
  • src/lib/messaging/hooks/common/token-paste.test.ts
  • src/lib/messaging/hooks/common/token-paste.ts
  • src/lib/messaging/hooks/hook-runner.test.ts
  • src/lib/messaging/hooks/hook-runner.ts
  • src/lib/messaging/hooks/index.ts
  • src/lib/messaging/hooks/registry.ts
  • src/lib/messaging/hooks/types.ts
  • src/lib/messaging/index.ts
  • src/lib/messaging/manifest/registry.test.ts
  • src/lib/messaging/manifest/types.test.ts
  • src/lib/messaging/manifest/types.ts

@sandl99 sandl99 requested a review from ericksoa May 23, 2026 08:30
@copy-pr-bot
Copy link
Copy Markdown

copy-pr-bot Bot commented May 25, 2026

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

cv
cv previously approved these changes May 25, 2026
## Summary
Adds the phase-1 messaging manifest compiler that converts channel
manifests into a serializable sandbox messaging plan. The compiler
resolves channel inputs through env keys and interactive enrollment
hooks, then delegates credential, policy, render, build-step,
state-update, and health-check planning to small pure engines.

## Related Issue
Fixes #3994

## Changes
- Add `ManifestCompiler` with interactive enrollment-hook input
resolution and env-key input initialization.
- Add compiler plan engines for credential bindings, network policy,
agent render fragments, build steps, state updates, and health checks.
- Expand `SandboxMessagingPlan` and related manifest plan types to the
top-level plan shape required by #3994.
- Add coverage for built-in Telegram/Discord/Slack/WeChat/WhatsApp
plans, Hermes WeChat policy aliasing, non-interactive env input
behavior, secret-free JSON plans, disabled channels, and a synthetic
non-built-in channel.

## 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
- [ ] `make 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 performed:
- `npm test -- --project cli src/lib/messaging` passes.
- `npm run typecheck:cli` passes.
- `npm run lint -- src/lib/messaging` passes with the existing unrelated
warning in `src/lib/onboard/child-exit-tracker.test.ts`.
- `git diff --check` passes.
- `npm run source-shape:check` passes.
- `npx prek run --all-files` and the normal pre-push hook were attempted
and currently fail in unrelated full CLI doctor/debug/snapshot tests
outside the messaging compiler changes.

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

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

## Summary by CodeRabbit

* **New Features**
* Added manifest compilation system for messaging channels with support
for multiple agents and workflows
  * Implemented credential binding and authentication management
  * Added network policy configuration and agent rendering capabilities
  * Introduced health check and build step planning
  * Added state persistence and hydration management
  * Implemented placeholder resolution for sandbox names and credentials

* **Tests**
* Added comprehensive test suite validating compilation behavior,
credential handling, and plan serialization

<!-- 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/4069?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: San Dang <sdang@nvidia.com>
Comment thread src/lib/messaging/applier/setup-applier.ts Fixed
Comment thread src/lib/messaging/applier/setup-applier.ts Fixed
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

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 `@src/lib/messaging/compiler/manifest-compiler.ts`:
- Around line 124-127: The current hooks selection includes hooks for channels
that may be disabled; update the filter applied to manifest.hooks (the chain
that calls isHookForAgent(manifest.hooks, context.agent) and then
cloneHookReference(manifest.id,...)) to also exclude hooks whose channel is
inactive/disabled. Concretely, extend the existing filter predicate in the
manifest.hooks pipeline to require the channel active flag (e.g., check
hook.channel?.active !== false or hook.active !== false depending on your hook
shape) so only hooks for active channels are passed to
cloneHookReference(manifest.id, hook).
🪄 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: 993d082f-9a7f-480a-bd1b-f7ecce7df3ca

📥 Commits

Reviewing files that changed from the base of the PR and between 3a92503 and 51e9591.

📒 Files selected for processing (27)
  • src/lib/messaging/applier/index.ts
  • src/lib/messaging/applier/setup-applier.test.ts
  • src/lib/messaging/applier/setup-applier.ts
  • src/lib/messaging/applier/types.ts
  • src/lib/messaging/channels/manifests.test.ts
  • src/lib/messaging/channels/telegram/hooks/fakes.test.ts
  • src/lib/messaging/channels/telegram/hooks/fakes.ts
  • src/lib/messaging/channels/telegram/manifest.ts
  • src/lib/messaging/channels/wechat/hooks/fakes.test.ts
  • src/lib/messaging/channels/wechat/hooks/fakes.ts
  • src/lib/messaging/channels/wechat/manifest.ts
  • src/lib/messaging/compiler/engines/agent-render-engine.ts
  • src/lib/messaging/compiler/engines/build-step-engine.ts
  • src/lib/messaging/compiler/engines/credential-binding-engine.ts
  • src/lib/messaging/compiler/engines/health-check-engine.ts
  • src/lib/messaging/compiler/engines/policy-resolver.ts
  • src/lib/messaging/compiler/engines/state-update-engine.ts
  • src/lib/messaging/compiler/engines/template.ts
  • src/lib/messaging/compiler/index.ts
  • src/lib/messaging/compiler/manifest-compiler.test.ts
  • src/lib/messaging/compiler/manifest-compiler.ts
  • src/lib/messaging/compiler/types.ts
  • src/lib/messaging/compiler/workflow-planner.test.ts
  • src/lib/messaging/compiler/workflow-planner.ts
  • src/lib/messaging/index.ts
  • src/lib/messaging/manifest/types.test.ts
  • src/lib/messaging/manifest/types.ts
✅ Files skipped from review due to trivial changes (1)
  • src/lib/messaging/applier/index.ts

Comment thread src/lib/messaging/compiler/manifest-compiler.ts Outdated
Signed-off-by: San Dang <sdang@nvidia.com>
@cv cv added v0.0.53 Release target and removed v0.0.52 Release target labels May 27, 2026
@ericksoa ericksoa dismissed stale reviews from cv and cv May 27, 2026 18:28

Unapproving per maintainer request.

@ericksoa ericksoa added v0.0.55 and removed v0.0.53 Release target labels May 27, 2026
@sandl99 sandl99 changed the title feat(messaging): add channel enrollment manifests feat(messaging): rebuild new manifest-style messaging architecture May 28, 2026
@jyaunches jyaunches added R1 v0.0.56 Release target and removed v0.0.55 labels May 29, 2026
@cv cv added the integration: whatsapp WhatsApp integration or channel behavior label May 30, 2026
@sandl99 sandl99 requested a review from cv June 1, 2026 11:07
@cv cv merged commit 09e4878 into main Jun 1, 2026
18 checks passed
@cv cv deleted the u/sdang/messaging-hooks-channels-3993-3994 branch June 1, 2026 15:49
@wscurran wscurran added area: messaging Messaging channels, bridges, manifests, or channel lifecycle feature PR adds or expands user-visible functionality and removed enhancement: messaging 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 feature PR adds or expands user-visible functionality integration: whatsapp WhatsApp integration or channel behavior refactor PR restructures code without intended behavior change v0.0.56 Release target VRDC Issues and PRs submitted by NVIDIA VRDC test team.

Projects

None yet

6 participants