# grove.reply()

## Signature

```ts
grove.reply(message: { kind: 'channel' | 'dm'; from: string; channel?: string; id?: string }, text: string, options?: { receipt?: string }): void
```

## Availability

IRC-bound runtimes; same restrictions as [grove.send()](grove-send.md). A DM reply requires query.send and an existing query. A channel reply uses an explicit channel and requires server scope plus network.send in the current implementation.

## Parameters

| Parameter | Required | Description |
| --- | --- | --- |
| `message` | Yes | The original message event payload. Use its original kind, from, channel, and id. |
| `message.kind` | Yes | dm routes to from; channel routes to channel. |
| `message.from` | Yes | Peer nickname for a DM. |
| `message.channel` | For channel | Confirmed joined channel name. |
| `message.id` | No | IRC message ID used as reply context when supported by the native send path. |
| `text` | Yes | Ordinary message text; the send validation and trimming rules apply. |
| `options.receipt` | No | UUID for messageEcho correlation. |

Options do not support to, channel, or open overrides. The facade derives the target solely from message.

## Return value

Returns `undefined`; no acknowledgement Promise.

## Behavior and errors

The facade always forwards message.channel as an explicit target. Consequently, a conversation-bound channel instance cannot currently use this helper even for its own channel; use `grove.send(text)` there, which sends without reply metadata. This is a current API 1 implementation limitation.

Invalid destinations, missing permissions, malformed receipts, and CTCP-framed text are refused as for send. A supplied message object is not permission to access its destination.

## Example

```js
// Server-scoped runtime with channel.read and network.send.
grove.on('message', message => {
  if (!message.own && message.kind === 'channel' && message.text === '!hello') {
    grove.reply(message, 'Hello!')
  }
})
```

