Files
Ricardo Rivero 16879fdc7a fix(whatsapp): model forwarded and product-inquiry context variants in WhatsAppInboundMessage (#723)
## Problem

`WhatsAppInboundMessage.context` is typed as:

```ts
/** Context for quoted replies */
context?: {
  from: string;
  id: string;
};
```

But Meta's Cloud API webhook sends **mutually exclusive context shapes**
depending on message origin ([text messages webhook
reference](https://developers.facebook.com/documentation/business-messaging/whatsapp/webhooks/reference/messages/text)):

- **Quoted replies** (and interactions with a business message): `from`
+ `id`
- **Forwarded messages**: only `forwarded` ("only included if forwarded
5 times or less") or `frequently_forwarded` ("only included if forwarded
more than 5 times") — **no `id`, no `from`**
- **Catalog product inquiries**: `from` + `id` + `referred_product`

Because the type declares `id` required whenever `context` is present,
downstream code like `message.raw.message.context?.id.trim()`
type-checks cleanly and then throws a `TypeError` at runtime the first
time a user forwards a message to the bot — `context` exists, `id`
doesn't. We hit exactly this in production code building reply-to
handling on top of the adapter.

## Change

- All `context` fields are optional, and the forwarded/product-inquiry
fields (`forwarded`, `frequently_forwarded`, `referred_product`) are
added, with doc comments noting which variant each field belongs to.
- Changeset included (`@chat-adapter/whatsapp`: patch).

The adapter itself never reads `context` at runtime, so this is a
type-only change. Consumers who currently dereference `context.id`
unguarded will get a compile error after upgrading — intentionally,
since that code is a latent runtime crash on forwarded messages.

---------

Signed-off-by: Ricardo Rivero <ricardo@enzadon.com>
Co-authored-by: dancer <josh@afterima.ge>
2026-08-03 13:43:08 +01:00
..