Files
Ben Sabic 80def3ab17 feat: add author.isSystem to distinguish platform-generated messages (#707)
Closes #653

Chat SDK's normalized author only distinguished the current bot from
other bots (`isBot`/`isMe`), so Slack system notifications authored by
the reserved `USLACK` user — which carry no `bot_id` and no system
subtype — were dispatched to handlers as if human-authored. Consumers
had to hard-code `message.author.userId === "USLACK"`, leaking
Slack-specific identifiers into adapter-independent code.

This adds an optional `isSystem?: boolean` to the normalized `Author`
type, documented so that an absent value means `false`. Keeping it
optional avoids breaking existing custom adapters and serialized
messages, as proposed in the issue. The Slack adapter now sets it in
both parse paths (`parseSlackMessage` and the sync `parseMessage` path)
via a `SLACK_SYSTEM_USER_ID` constant, so applications can write:

```ts
bot.onNewMention(async (thread, message) => {
  if (message.author.isSystem) {
    return;
  }
  await generateAssistantResponse(thread, message);
});
```

Other adapters can adopt the same field when their platforms expose
equivalent system-generated messages.

Also included:

- Regression tests covering the issue's exact case (`USLACK` DM, no
`bot_id`, no subtype) across all three layers: async parse, sync
`parseMessage`, and end-to-end `handleWebhook` dispatch — plus the
negative case for human authors.
- A `USLACK` webhook fixture in `sample-messages.md`.
- `isSystem` documented in the Author type table on the Message API docs
page.
- Changesets for `chat` and `@chat-adapter/slack`.

---------

Co-authored-by: mdnanocom <arnaud@massive-dynamic.ai>
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
Co-authored-by: dancer <josh@afterima.ge>
2026-07-16 00:46:05 +10:00
..