feat(channels): Extend channel relay to ExitPlanMode, AskUserQuestion, and all modal dialogs

Resolved 💬 4 comments Opened Mar 25, 2026 by cversek Closed Apr 26, 2026

Problem

The Telegram plugin's permission capability (v0.0.2) successfully relays PermissionRequest dialogs to remote channels. However, other modal dialogs that block the CLI session are not relayed, causing silent deadlocks for channel-only users:

  • ExitPlanMode: Plan approval prompt renders only in terminal. Channel users see Claude go silent after planning.
  • AskUserQuestion: Interactive questions with options render only in terminal. Channel users cannot respond.
  • EnterPlanMode: Plan mode entry confirmation not relayed.

This prevents truly remote workflows — a user on their phone via Telegram can approve file writes but cannot approve plans or answer agent questions.

Proposed Solution

Extend the channel relay protocol with a unified modal dialog notification that covers all blocking dialog types through a common JSON schema:

Outbound: CC → Channel Server

{
  "method": "notifications/claude/channel/dialog_request",
  "params": {
    "request_id": "tbxkq",
    "dialog_type": "plan_approval",
    "title": "Accept this plan?",
    "description": "The agent has prepared an implementation plan...",
    "content_preview": "## Plan\n1. Create API endpoint\n2. Add tests...",
    "options": [
      { "id": "accept", "label": "Yes, accept plan", "is_default": true },
      { "id": "reject", "label": "No, reject plan" },
      { "id": "accept_with_feedback", "label": "Yes, and..." }
    ],
    "allows_free_text": true,
    "metadata": {
      "plan_file": "/path/to/plan.md"
    }
  }
}

Inbound: Channel Server → CC

{
  "method": "notifications/claude/channel/dialog_response",
  "params": {
    "request_id": "tbxkq",
    "selected_option": "accept_with_feedback",
    "free_text": "Looks good but prioritize the tests first"
  }
}

Dialog Types

| dialog_type | Current behavior | With this feature |
|---|---|---|
| plan_approval (ExitPlanMode) | Terminal only | Channel relay with accept/reject/feedback |
| user_question (AskUserQuestion) | Terminal only | Channel relay with option selection + free text |
| plan_entry (EnterPlanMode) | Terminal only | Channel relay with confirm/cancel |
| permission (existing) | Already relayed | Unified under same schema (backward compat) |

AskUserQuestion Example

{
  "method": "notifications/claude/channel/dialog_request",
  "params": {
    "request_id": "mfvqz",
    "dialog_type": "user_question",
    "title": "Which approach do you prefer?",
    "description": "I found two ways to implement the cache...",
    "options": [
      { "id": "option_1", "label": "Redis-based cache" },
      { "id": "option_2", "label": "In-memory with LRU" },
      { "id": "option_3", "label": "SQLite file cache" }
    ],
    "allows_free_text": true
  }
}

Channel response:

{
  "method": "notifications/claude/channel/dialog_response",
  "params": {
    "request_id": "mfvqz",
    "selected_option": "option_1",
    "free_text": "Redis, but make sure it degrades gracefully if Redis is down"
  }
}

Why This Matters

The permission relay in v0.0.2 proved that remote tool approval works. Users are already building workflows around Telegram channels — approving file writes from their phone, reviewing code previews, providing inline feedback with verdicts. But the moment an agent enters plan mode or asks a question, the channel goes silent and the session deadlocks.

This is the single biggest gap preventing fully remote agent collaboration. The pattern is proven (permission relay works), the schema is straightforward (extend with dialog_type + options), and the use cases are immediate.

Capability Declaration

Channel servers would declare the new capability:

{
  "experimental": {
    "claude/channel": {},
    "claude/channel/permission": {},
    "claude/channel/dialog": {}
  }
}

Servers that only declare permission continue working as before (backward compatible). Servers that declare dialog receive all modal dialog types through the unified schema.

Related Issues

  • #37573 — AskUserQuestion not surfaced to Telegram plugin
  • #37505 — Permission prompts not visible via Telegram MCP
  • #36501 — No terminal prompt visibility from Telegram
  • #37610 — ExitPlanMode stuck state on Remote UI
  • #33625 — AskUserQuestion missing on mobile Remote Control
  • #28508 — AskUserQuestion selections not received from mobile
  • #29393 — Co-work stalls on AskUserQuestion
  • #12605 — AskUserQuestion hook support proposal
  • #19283 — Plan approval triggers no hook event
  • #27265 — Plan approval auto-approves before team lead can review

View original on GitHub ↗

This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗