> ## Documentation Index
> Fetch the complete documentation index at: https://docs-code.palyra.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Channel Connectors and Messaging

<details>
  <summary>Relevant source files</summary>

  The following files were used as context for generating this wiki page:

  * apps/desktop/src-tauri/src/features/onboarding/connectors/discord/mod.rs
  * apps/desktop/src-tauri/src/features/onboarding/connectors/discord/summary.rs
  * apps/web/src/console/sections/ChannelsSection.tsx
  * apps/web/src/consoleApi/channels/core.ts
  * apps/web/src/consoleApi/channels/discord.ts
  * apps/web/src/features/channels/connectors/discord/components/DiscordConnectorActionsPanel.tsx
  * apps/web/src/features/channels/connectors/discord/components/DiscordOnboardingPanel.tsx
  * apps/web/src/features/channels/connectors/discord/controller.ts
  * apps/web/src/features/channels/core/api.ts
  * apps/web/src/features/channels/core/domain.ts
  * apps/web/src/features/channels/core/useChannelCoreState.ts
  * crates/palyra-cli/src/args/message.rs
  * crates/palyra-cli/src/client/message.rs
  * crates/palyra-cli/src/commands/approvals.rs
  * crates/palyra-cli/src/commands/channels/connectors/discord/setup.rs
  * crates/palyra-cli/src/commands/channels/connectors/discord/verify.rs
  * crates/palyra-cli/src/commands/channels/mod.rs
  * crates/palyra-cli/src/commands/channels/router.rs
  * crates/palyra-cli/src/commands/message.rs
  * crates/palyra-connectors/src/core/supervisor/admin.rs
  * crates/palyra-connectors/src/core/supervisor/tests.rs
  * crates/palyra-connectors/src/core/supervisor/types.rs
  * crates/palyra-connectors/src/lib.rs
  * crates/palyra-connectors/src/providers/discord/adapter/admin.rs
  * crates/palyra-connectors/src/providers/discord/adapter/admin\_operation\_tests.rs
  * crates/palyra-connectors/src/providers/discord/adapter/gateway.rs
  * crates/palyra-connectors/src/providers/discord/adapter/mod.rs
  * crates/palyra-connectors/src/providers/discord/adapter/runtime.rs
  * crates/palyra-connectors/src/providers/discord/adapter/tests.rs
  * crates/palyra-connectors/src/providers/discord/adapter/transport.rs
  * crates/palyra-connectors/tests/simulator\_harness.rs
  * crates/palyra-daemon/src/application/channels/messages.rs
  * crates/palyra-daemon/src/application/channels/mod.rs
  * crates/palyra-daemon/src/application/channels/providers/discord/lifecycle.rs
  * crates/palyra-daemon/src/application/channels/providers/discord/mod.rs
  * crates/palyra-daemon/src/application/channels/providers/discord/onboarding.rs
  * crates/palyra-daemon/src/application/channels/providers/mod.rs
  * crates/palyra-daemon/src/application/channels/status.rs
  * crates/palyra-daemon/src/channel\_router.rs
  * crates/palyra-daemon/src/channels.rs
  * crates/palyra-daemon/src/channels/discord.rs
  * crates/palyra-daemon/src/transport/http/handlers/admin/channels/mod.rs
  * crates/palyra-daemon/src/transport/http/handlers/console/channels/mod.rs
</details>

The Channel Connector subsystem provides the interface between Palyra's internal agent logic and external communication platforms. It manages the lifecycle of connections, enforces routing policies for inbound messages, and provides a unified API for outbound delivery across different protocols.

## System Architecture

The messaging architecture is split between the `palyra-connectors` crate, which defines the provider-agnostic interfaces, and the `palyra-daemon`, which implements the routing and application-level logic.

Messaging Architecture Overview

```mermaid theme={null}
graph TD
    subgraph "External Platforms"
        Discord["Discord Gateway/API"]
        Slack["Slack (Future)"]
        Telegram["Telegram (Future)"]
    end

    subgraph "palyra-daemon"
        CP["ChannelPlatform"]
        CR["ChannelRouter"]
        IC["InboundCoalescer"]
        Supervisor["ConnectorSupervisor"]
    end

    subgraph "palyra-connectors"
        Adapter["ConnectorAdapter (Trait)"]
        Store["ConnectorStore (SQLite)"]
    end

    Discord <--> Adapter
    Adapter <--> Supervisor
    Supervisor <--> CP
    CP <--> CR
    CR <--> IC
```

Sources: [crates/palyra-daemon/src/channels.rs#1-10](http://crates/palyra-daemon/src/channels.rs#1-10), [crates/palyra-daemon/src/channel\_router.rs#1-10](http://crates/palyra-daemon/src/channel_router.rs#1-10), [crates/palyra-connectors/src/lib.rs#1-9](http://crates/palyra-connectors/src/lib.rs#1-9)

## Core Components

### ChannelPlatform

The `ChannelPlatform` serves as the high-level facade for the daemon. It integrates the `ConnectorSupervisor`, the `MediaArtifactStore`, and the gRPC gateway router into a single operator-facing surface [crates/palyra-daemon/src/channels.rs#1-10](http://crates/palyra-daemon/src/channels.rs#1-10). It handles:

* Connector inventory and lifecycle management [crates/palyra-daemon/src/channels.rs#176-183](http://crates/palyra-daemon/src/channels.rs#176-183).
* Message read, search, and mutation operations (edit/delete/react) [crates/palyra-daemon/src/channels.rs#114-143](http://crates/palyra-daemon/src/channels.rs#114-143).
* Outbound attachment processing [crates/palyra-daemon/src/channels.rs#56-58](http://crates/palyra-daemon/src/channels.rs#56-58).

### ChannelRouter

The `ChannelRouter` is a policy-driven engine that decides if an inbound message should trigger an agent run. It evaluates mention patterns, sender allow/deny lists, and Direct Message (DM) policies [crates/palyra-daemon/src/channel\_router.rs#1-10](http://crates/palyra-daemon/src/channel_router.rs#1-10).

| Feature              | Description                                                                                                                                                                      |
| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Mention Matching** | Gates runs based on whether the agent was explicitly mentioned [crates/palyra-daemon/src/channel\_router.rs#198-198](http://crates/palyra-daemon/src/channel_router.rs#198-198). |
| **DM Pairing**       | A code-plus-approval flow for securing direct message interactions [crates/palyra-daemon/src/channel\_router.rs#73-78](http://crates/palyra-daemon/src/channel_router.rs#73-78). |
| **Concurrency**      | Limits the number of simultaneous runs per channel [crates/palyra-daemon/src/channel\_router.rs#208-208](http://crates/palyra-daemon/src/channel_router.rs#208-208).             |

### ConnectorSupervisor

The `ConnectorSupervisor` manages the background workers that poll inbound traffic and drain the outbox [crates/palyra-daemon/src/channels.rs#4-7](http://crates/palyra-daemon/src/channels.rs#4-7). It tracks `ConnectorStatusSnapshot` and manages the `ConnectorQueueSnapshot` which includes pending, claimed, and dead-lettered messages [crates/palyra-daemon/src/application/channels/status.rs#31-35](http://crates/palyra-daemon/src/application/channels/status.rs#31-35).

Sources: [crates/palyra-daemon/src/channels.rs#169-174](http://crates/palyra-daemon/src/channels.rs#169-174), [crates/palyra-daemon/src/channel\_router.rs#195-208](http://crates/palyra-daemon/src/channel_router.rs#195-208), [crates/palyra-daemon/src/application/channels/status.rs#80-112](http://crates/palyra-daemon/src/application/channels/status.rs#80-112)

## Messaging Lifecycle

The system processes messages through a multi-stage pipeline to ensure reliability and policy compliance.

Inbound and Outbound Data Flow

```mermaid theme={null}
sequenceDiagram
    participant P as "External Platform"
    participant A as "ConnectorAdapter"
    participant S as "ConnectorSupervisor"
    participant R as "ChannelRouter"
    participant G as "Gateway/Agent Loop"

    Note over P, G: Inbound Flow
    P->>A: Webhook/WebSocket Event
    A->>S: InboundMessageEvent
    S->>R: route_inbound()
    R->>G: Admission & Dispatch

    Note over P, G: Outbound Flow
    G->>S: enqueue_outbound(OutboundMessageRequest)
    S->>A: send_outbound()
    A->>P: API Request
```

Sources: [crates/palyra-connectors/tests/simulator\_harness.rs#47-78](http://crates/palyra-connectors/tests/simulator_harness.rs#47-78), [crates/palyra-daemon/src/channels/discord.rs#150-173](http://crates/palyra-daemon/src/channels/discord.rs#150-173)

### Inbound Pipeline

1. **Ingress**: Platforms deliver messages to the `ConnectorAdapter`.
2. **Admission**: `ChannelRouter` checks rules (e.g., `allow_from`, `require_mention`) [crates/palyra-daemon/src/channel\_router.rs#195-208](http://crates/palyra-daemon/src/channel_router.rs#195-208).
3. **Coalescing**: Rapid-fire messages are merged to provide coherent context.
4. **Dispatch**: The message is sent to the `AgentRunLoopState` for processing.

For details, see [Channel Router and Inbound Pipeline](/channel_connectors_and_messaging/channel_router_and_inbound_pipeline).

### Outbound Pipeline

1. **Enqueue**: Agents request a message send via `OutboundMessageRequest` [crates/palyra-daemon/src/channels/discord.rs#150-166](http://crates/palyra-daemon/src/channels/discord.rs#150-166).
2. **Delivery**: The supervisor drains the outbox and calls the adapter's `send_outbound` method [crates/palyra-connectors/tests/simulator\_harness.rs#129-133](http://crates/palyra-connectors/tests/simulator_harness.rs#129-133).
3. **Receipt**: A `DeliveryOutcome` is returned, providing a native platform ID or a `RetryClass` for failures [crates/palyra-connectors/tests/simulator\_harness.rs#141-161](http://crates/palyra-connectors/tests/simulator_harness.rs#141-161).

## Supported Connectors

Palyra uses a provider-adapter architecture. Currently, Discord is the primary supported platform, with stubs for Slack and Telegram.

| Provider     | Status     | Key Components                                     |
| :----------- | :--------- | :------------------------------------------------- |
| **Discord**  | Production | `DiscordConnectorAdapter`, `DiscordGatewayMonitor` |
| **Slack**    | Planned    | `SlackAdapter` (Stub)                              |
| **Telegram** | Planned    | `TelegramAdapter` (Stub)                           |

### Discord Adapter

The Discord implementation uses a WebSocket gateway for inbound events and a REST API for outbound messaging and administrative operations (like guild/channel resolution) [crates/palyra-connectors/src/providers/discord/adapter/tests.rs#1-20](http://crates/palyra-connectors/src/providers/discord/adapter/tests.rs#1-20). It supports:

* Zlib-stream compression for gateway traffic [crates/palyra-connectors/src/providers/discord/adapter/tests.rs#25-27](http://crates/palyra-connectors/src/providers/discord/adapter/tests.rs#25-27).
* Automatic chunking of long messages [crates/palyra-connectors/src/providers/discord/adapter/tests.rs#16-17](http://crates/palyra-connectors/src/providers/discord/adapter/tests.rs#16-17).
* Rate limit handling with `RetryClass::RateLimit` [crates/palyra-connectors/tests/simulator\_harness.rs#147-154](http://crates/palyra-connectors/tests/simulator_harness.rs#147-154).

For details, see [Platform Connectors: Discord, Slack, Telegram](/channel_connectors_and_messaging/platform_connectors_discord_slack_telegram).

Sources: [crates/palyra-daemon/src/channels/discord.rs#19-23](http://crates/palyra-daemon/src/channels/discord.rs#19-23), [crates/palyra-connectors/src/providers/discord/adapter/tests.rs#16-27](http://crates/palyra-connectors/src/providers/discord/adapter/tests.rs#16-27), [crates/palyra-connectors/tests/simulator\_harness.rs#121-128](http://crates/palyra-connectors/tests/simulator_harness.rs#121-128)

## Operational Management

Operators manage channels through the CLI (`palyra channels`) or the Web Console.

### CLI Operations

The CLI provides commands for lifecycle management:

* `add`/`login`: Configures a new connector [crates/palyra-cli/src/commands/channels/mod.rs#38-140](http://crates/palyra-cli/src/commands/channels/mod.rs#38-140).
* `status`: Displays health and queue depth [crates/palyra-cli/src/commands/channels/mod.rs#260-272](http://crates/palyra-cli/src/commands/channels/mod.rs#260-272).
* `pairings`: Manages DM pairing codes and grants [crates/palyra-cli/src/commands/channels/mod.rs#215-235](http://crates/palyra-cli/src/commands/channels/mod.rs#215-235).

### Health and Monitoring

The `build_channel_status_payload` function aggregates connector status, runtime snapshots, and queue health [crates/palyra-daemon/src/application/channels/status.rs#27-55](http://crates/palyra-daemon/src/application/channels/status.rs#27-55). It identifies saturation states such as `rate_limited`, `auth_failed`, or `backpressure` [crates/palyra-daemon/src/application/channels/status.rs#118-154](http://crates/palyra-daemon/src/application/channels/status.rs#118-154).

Sources: [crates/palyra-cli/src/commands/channels/mod.rs#36-40](http://crates/palyra-cli/src/commands/channels/mod.rs#36-40), [crates/palyra-daemon/src/application/channels/status.rs#1-7](http://crates/palyra-daemon/src/application/channels/status.rs#1-7), [crates/palyra-daemon/src/transport/http/handlers/admin/channels/mod.rs#26-41](http://crates/palyra-daemon/src/transport/http/handlers/admin/channels/mod.rs#26-41)

## Child Pages

* [Channel Router and Inbound Pipeline](/channel_connectors_and_messaging/channel_router_and_inbound_pipeline)
* [Platform Connectors: Discord, Slack, Telegram](/channel_connectors_and_messaging/platform_connectors_discord_slack_telegram)
