1.10.0 adds the createChatRoute model option (vercel/geistdocs#142).
Pass xai/grok-4.5 to restore the model set in #687, which the
package-backed chat route had reverted to its hardcoded default.
Signed-off-by: molebox <rich@vercel.com>
Brings the Ask AI panel z-index fix (paints below the search command
menu) and adds the Turborepo logo to the navbar OSS products dropdown,
matching the new package default (we keep an explicit list because the
package default includes chat-sdk.dev itself).
Signed-off-by: molebox <rich@vercel.com>
The @vercel/geistdocs stylesheet inverts the dark background tokens
(background-100 becomes pure black over a near-black background-200),
which flattened elevated surfaces on the homepage: the Chat SDK Core
code window blended into the page and the active code-showcase tab had
no visible state. Restore the site's original dark values (elevated
background-100 over pure-black background-200) in the local override
layer.
Signed-off-by: molebox <rich@vercel.com>
## summary
- swap chat model strings to `xai/grok-4.5` across the docs site, the
shipped guides, and the example bots, so the docs lead with the latest
model
- apps/docs: ai overview, ai-sdk-tools, and streaming pages, the two
landing-page code samples, and the live chat demo route
(`app/api/chat/route.ts`, previously `openai/gpt-4.1-mini`)
- packages/chat/resources/guides: the seven guides that use a chat model
(slack connect, slack + ai sdk, liveblocks, vercel blob, github code
review, daily digest, ai gateway)
- examples: nextjs-chat and nuxt-chat bots
- deliberately left non-chat model strings as they were, since grok-4.5
cannot fill those roles: the `openai/text-embedding-3-small` embedding
model and the `openai/gpt-4o-mini` reranker
- in the ai gateway guide, grok-4.5 is now the primary model but the
fallback list stays cross-provider (`anthropic/claude-opus-4.8`,
`google/gemini-3.1-pro-preview`) so the failover example still
demonstrates real cross-provider fallback
- also fixed a pre-existing prose/code mismatch in that guide, the
fallback prose said `claude-opus-4.7` while the code listed `4.8`, now
aligned to `4.8`
---------
Signed-off-by: dancer <josh@afterima.ge>
Replace the locally-copied geistdocs runtime in apps/docs with the
published @vercel/geistdocs package, keeping site-specific content,
custom sections, and established public contracts local.
Package-backed now: docs page + layouts (createDocsPage,
GeistdocsDocsLayout/HomeLayout), navbar/footer/provider, search
(createSearchRoute), Ask AI (createChatRoute, AI SDK v6), per-page
markdown (createDocsMarkdownRoute), sitemap.md
(createSitemapMarkdownRoute, now with an Adapters section), a new
/agents.md surface (createAgentsRoute), proxy (createProxy with
explicit markdownRoutes for /docs and /adapters), MDX defaults,
design tokens/styles, and icon/logo assets.
Kept local by design: the curated /llms.txt index and /llms-full.txt
corpus (referenced by the published SKILL.md artifacts and tests), the
adapters section (README fetching, OG images, JSON-LD, feature
matrices, adapters.mdx markdown route), RSS, and the OG image route.
Also: removes 13 now-unused dependencies (ai@5, @ai-sdk/react@2,
dexie, jotai, cmdk, vaul, mermaid, etc.), slims the local CSS to
overrides on top of @vercel/geistdocs/styles.css, and updates the
docs-llms integration test to assert on the new proxy shape.
Signed-off-by: molebox <rich@vercel.com>
## What
- Add the new **X** adapter logo to the homepage supported-platforms
grid, placed after Messenger.
- Cap the grid width on mobile (`max-w-64`, reset with `sm:max-w-none`)
so the logos wrap **4 / 4 / 3** instead of orphaning a single logo
(Telegram) on its own line.
## Why
We now ship an `@chat-adapter/x` adapter, so X belongs in the homepage
lineup. With 11 logos, the previous flex-wrap fit 5 per row on phones,
producing a lonely 5 / 5 / 1 break. Constraining the container forces
even, centered rows down to 320px-wide screens.
## Notes
- The `x` logo SVG and the `/adapters/official/x` page already exist
(added in a prior change from `main`); this only wires X into the
homepage grid.
- Docs-only change — no changeset required.
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
## summary
new `@chat-adapter/x` adapter for X (Twitter), built on the X API v2 and
the X Activity API. write bot logic once and reply to mentions, hold DM
conversations, post from the account, and like posts, like the other
Chat SDK adapters
what it supports:
- reply to public mentions (`post.mention.create`) and top-level posts
via `channel.post`
- send and receive direct messages (`dm.received` / `dm.sent`)
- edit and delete owned posts, delete own DM events
- likes as the only reaction (`emoji.heart` or `"like"`)
- buffered streaming: accumulates an LLM stream and posts once instead
of post+edit churn on a public timeline
- OAuth 2.0 user context with managed token refresh (rotating refresh
token persisted in the state adapter, optional AES-256-GCM encryption)
- webhook CRC and `x-twitter-webhooks-signature` verification
key design decisions:
- DMs are threaded by the other participant's user id (`x:dm:{userId}`)
because X DM webhooks carry no conversation id, only participants
- OAuth 2.0 only at runtime: DM send and read are verified to work on
OAuth 2.0 user tokens, so no OAuth 1.0a in the adapter (subscription and
webhook setup is one-time and handled in the X developer console)
- parsers were written against real captured payloads: mentions use the
v2 shape (author hydrated in `includes.users`), DMs use the legacy
Account Activity shape (`direct_message_events`,
`message_create.message_data`, a `users` map, and no conversation id)
also includes the `chat/adapters` catalog entry, docs page, CLI scaffold
spec, and `sample-messages.md` with real captured payloads
<details><summary>usage</summary>
```typescript
import { Chat } from "chat";
import { createXAdapter } from "@chat-adapter/x";
const bot = new Chat({
userName: "mybot",
adapters: { x: createXAdapter() },
});
bot.onNewMention(async (thread, message) => {
await thread.post(`hi @${message.author.userName}!`);
});
bot.onDirectMessage(async (thread) => {
await thread.post("hello from X");
});
```
</details>
## test plan
- adapter unit tests pass against the real captured payload shapes, with
regression tests for author-from-`includes` (mentions) and the legacy
`direct_message_events` shape (DMs)
- real captured `post.mention.create` and `dm.received` payloads
verified end-to-end through `handleWebhook`: signature verification,
routing, author resolution, and participant threading, plus
bad-signature rejection returns 401
- every write and read path fired live against the X API through the
adapter: top-level post, reply to a mention, like and unlike, edit,
delete, DM send, DM read, DM delete
- OAuth 2.0 managed token refresh exercised live (access and refresh
token rotation)
---------
Signed-off-by: dancer <josh@afterima.ge>
## Summary
Adds **chat-adapter-zaileys** to the community adapters catalog — a
WhatsApp adapter powered by
[Zaileys](https://github.com/zeative/zaileys), a batteries-included
TypeScript wrapper around the unofficial WhatsApp Web API.
- npm: https://www.npmjs.com/package/chat-adapter-zaileys
- Repo: https://github.com/zeative/chat-adapter-zaileys
- Docs: https://zeative.github.io/chat-adapter-zaileys/
## What it adds vs the existing Baileys community adapter
- Real `thread.fetchMessages` history backed by a pluggable message
store (memory/SQLite/Postgres/Redis/Convex), with cursor pagination and
`rehydrateAttachment` for queue/debounce strategies
- Cards render as **native WhatsApp buttons** with `chat.onAction`
round-trips
- Poll votes decrypted natively — no `messageSecret` bookkeeping, works
across restarts
- `scheduleMessage` support (persisted scheduler)
- Opt-in slash-command routing to `chat.onSlashCommand`
- QR/pairing auth, reconnection, and session persistence handled by the
underlying client
## Files changed (per `.agents/skills/add-adapter`)
- `apps/docs/content/adapters/community/zaileys.mdx` — docs page with
feature matrix
- `apps/docs/content/adapters/community/meta.json` — slug added to
Platforms
- `apps/docs/adapters.json` — registry entry
- `packages/integration-tests/src/documentation-test-utils.ts` —
`chat-adapter-zaileys` + `zaileys` in `VALID_DOC_PACKAGES`
## Validation
- `pnpm --filter chat build` ✓
- `pnpm --filter @chat-adapter/integration-tests test` → 914/914 ✓
- `pnpm --filter chat typecheck` ✓
- `pnpm check` + `pnpm konsistent` ✓
Signed-off-by: zeative <zaadevofc@gmail.com>
Adds Dial as a vendor-official adapter — SMS, MMS, iMessage, and inbound
voice-call transcripts for Chat SDK.
- `vendor-official/dial.mdx` adapter page (following the Photon / Linq /
Sendblue format)
- catalog entry in `packages/chat/src/adapters/index.ts` with
`DIAL_API_KEY` / `DIAL_FROM_NUMBER_ID` / `DIAL_WEBHOOK_SECRET`
- `create-chat-sdk` scaffold spec entry
- registry entry in `adapters.json` + `dial` added to vendor-official
`meta.json`
- integration-test doc lists + changeset
Repo: https://github.com/GetDial-AI/chat-sdk-adapter · npm:
`@getdial/chat-sdk-adapter` · Dial docs:
https://docs.getdial.ai/integrations/agent-clients/vercel-chat-sdk
The adapter maps a phone conversation to a Chat SDK thread (identified
by the pair of phone numbers — Dial-owned and peer), an SMS/MMS/iMessage
to a message with optional media attachments, and a completed voice
call's transcript to a message on the caller's thread. Outbound sends
and transcript fetches go through the official `@getdial/sdk`; inbound
webhooks are HMAC-SHA256 verified against a per-subscription signing
secret with constant-time compare.
### Validation
- `pnpm --filter chat build` — clean
- `pnpm --filter chat typecheck` — clean
- `pnpm --filter create-chat-sdk typecheck` — clean
- `pnpm --filter @chat-adapter/integration-tests exec vitest run
src/docs-adapters.test.ts` — 361/361 passed
- `pnpm check` (ultracite) — clean
- `pnpm konsistent` — 34 files, no violations
Fixes#666
## Summary
Both `slack_event` handlers (`startSocketMode` and
`runSocketModeListener`) ack and discard every envelope with `retry_num
> 0`. Slack retries an event (immediately, +1 min, +5 min) when a prior
delivery wasn't acked — including events that arrived while the app had
**no open socket** (restart, deploy, or Slack's routine connection
refreshes). For those, the retry is the only delivery the app ever sees,
so dropping it permanently loses the event (production incident details
in #666).
- **`@chat-adapter/slack`**: route retry envelopes through
`routeSocketEvent` like first deliveries (it acks per envelope type,
preserving the 3s ack window), and log them at info with `retry_num` /
`retry_reason` so redelivery is observable. Duplicate protection is
unchanged and sufficient: `Chat.processMessage` dedupes on `message.id`
(the Slack event `ts`, identical on a retry) via `state.setIfNotExists`.
- **`chat`**: raise the default `DEDUPE_TTL_MS` from 5 to 10 minutes.
Slack's final retry fires ~5 minutes after the original delivery —
exactly at the old TTL boundary, where the dedupe entry from the first
processing could expire just before the retry arrives and cause a
double-process. `dedupeTtlMs` config still overrides.
Behavior note for review: apps that relied on retries being invisible
will now see redelivered events flow through — deduped when already
handled, processed when not. That is the intended semantic:
at-least-once delivery from Slack, exactly-once handling via the SDK's
dedupe.
## Test plan
- Replaced the `"skips retries"` test with `"processes retries like
first deliveries (dedupe drops true duplicates)"` — asserts a
`retry_num: 1` envelope is acked and reaches `processMessage`.
- Updated the default-TTL test to 10 minutes; the custom-`dedupeTtlMs`
test is unchanged.
- `pnpm validate` passes end to end (knip, check, typecheck, test,
build); `pnpm --filter chat --filter @chat-adapter/slack test` = 1028 +
506 passing.
Signed-off-by: tdietert <thomasd@mercury.com>
Adds Cloudflare Agents as a vendor-official **state** adapter —
`agents/chat-sdk`'s `createChatSdkState()`, a Chat SDK `StateAdapter`
that stores subscriptions, locks, queues, dedupe keys, thread/channel
state, transcripts, and history in Durable Object SQLite via
`ChatSdkStateAgent` sub-agents.
- `vendor-official/cloudflare-agents.mdx` state-adapter page (Agent
setup, wrangler DO migration, sharding, config, storage/cleanup)
- catalog entry in `packages/chat/src/adapters/index.ts` (`group:
vendor-official`, `type: state`)
- registry entry in `adapters.json` + `cloudflare-agents` in
vendor-official `meta.json`
- integration-test doc lists + changeset
Repo: https://github.com/cloudflare/agents · package `agents`
(`agents/chat-sdk`) ·
[docs](https://developers.cloudflare.com/agents/runtime/communication/chat-sdk/)
### Not wired into the create-chat-sdk CLI
This adapter runs inside a Cloudflare Worker with Durable Objects, not
the generated Next.js runtime, so it is intentionally kept out of the
scaffold:
- added to `CLI_INCOMPATIBLE_ADAPTERS` (rejected via `--adapter`, hidden
from the platform picker and e2e run, like `lark`/`matrix`)
- new `listCliStateAdapters()` filters the interactive **state** picker
and the `--help` adapter list (the state picker previously used raw
`listStateAdapters()` and would have offered it, then thrown on
selection)
### Tests
- `catalog/display.test.ts` — `listCliStateAdapters`: returns only state
adapters, includes `memory`/`redis`, and excludes `cloudflare-agents`
while asserting it *is* in the raw catalog
- `catalog/selection.test.ts` —
`resolveAdapterValue("cloudflare-agents")` throws "not supported"
- `cli/program.test.ts` — `buildAdapterList()` help text omits
`cloudflare-agents`
- existing `CLI_SCAFFOLD_SPEC covers every catalog adapter` +
docs-adapters/docs-content suites cover the catalog entry, registry
parity, and MDX imports
### Validation
- create-chat-sdk: **178 passed**, typecheck clean
- integration docs suites pass; Biome + knip clean
---------
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
Adds an opt-in Vercel Connect authentication mode to the scaffolder for
the Slack, GitHub, and Linear adapters, via a `--connect` flag and a new
interactive auth-mode prompt (shown only when a Connect-capable adapter
is selected).
When enabled, the generated project:
- spreads the matching helper from `@vercel/connect/chat` into the
adapter factory in `src/lib/bot.ts` (non-Connect adapters keep their
native factory calls)
- adds `@vercel/connect` to dependencies
- lists each connector UID (for example `SLACK_CONNECTOR`) plus the
recommended `GITHUB_BOT_USER_ID`, in place of native provider secrets,
in `.env.example`
- documents `vercel link` / `vercel env pull` and the deployed-URL
webhook caveat in the README and post-install next steps
Connect policy lives in the existing `scaffold-spec.ts` (per-adapter
`connect` field), so `chat/adapters` stays the single source of adapter
metadata.
Stacked on #647 (base `vercel-connect/base`).
## Companion
`@vercel/connect/chat` subpath: vercel/vercel#16826.
---------
Signed-off-by: Ben Sabic <bensabic@users.noreply.github.com>
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
Adds Vercel Connect support to the GitHub adapter:
- A new `installationToken` config option (string or resolver) supplies
installation access tokens directly, skipping the GitHub App private-key
JWT exchange.
- A new optional `webhookVerifier` verifies inbound webhooks (Connect
trigger-forwarded requests via a Vercel OIDC token) in place of the
GitHub webhook secret.
Pair with `connectGitHubAdapter()` from `@vercel/connect/chat`. Includes
a changeset (`@chat-adapter/github` minor).
Stacked on #647 (base `vercel-connect/base`).
## Companion
`@vercel/connect/chat` subpath: vercel/vercel#16826.
<img width="933" height="755" alt="CleanShot 2026-06-30 at 12 02 18"
src="https://github.com/user-attachments/assets/cc834560-0486-4f09-b8d5-8264be360544"
/>
---------
Signed-off-by: Ben Sabic <bensabic@users.noreply.github.com>
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
Adds Vercel Connect support to the Linear adapter:
- `accessToken` now accepts a `() => string | Promise<string>` resolver
in addition to a string, so tokens can be sourced from Vercel Connect at
runtime.
- A new optional `webhookVerifier` verifies inbound webhooks (Connect
trigger-forwarded requests via a Vercel OIDC token) in place of the
Linear webhook secret.
- Connect-mode outbound calls outside webhook handling are supported via
`withInstallation(organizationId, fn)`.
Pair with `connectLinearAdapter()` from `@vercel/connect/chat`. Includes
a changeset (`@chat-adapter/linear` minor).
Stacked on #647 (base `vercel-connect/base`).
## Companion
`@vercel/connect/chat` subpath: vercel/vercel#16826.
<img width="929" height="664" alt="CleanShot 2026-06-30 at 12 35 30"
src="https://github.com/user-attachments/assets/c5861cb9-d66b-42c6-b838-5b4983f48646"
/>
---------
Signed-off-by: Ben Sabic <bensabic@users.noreply.github.com>
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
Adds a Vercel Connect guide to the docs under **Usage**
(`chat-sdk.dev/docs/vercel-connect`), covering connector setup, trigger
forwarding, the per-platform `connect*Adapter` helpers from
`@vercel/connect/chat`, custom OIDC webhook verification and its trust
boundary, and limitations. Also adds a "Vercel Connect Guide" card to
the docs homepage.
This is the base of a stack; the adapter, tests, and CLI PRs below build
on it. Docs-only, so no changeset.
## Stack
- #647 — feat(chat): Vercel Connect (this PR, base → `main`)
- #648 — docs(slack): document Vercel Connect support
- #649 — feat(linear): add Vercel Connect support
- #650 — feat(github): add Vercel Connect support
- #654 — feat(tests): add Vercel Connect webhook contract helper
- #655 — feat(create-chat-sdk): add Vercel Connect mode
All of the above are stacked on this branch (`vercel-connect/base`).
## Companion
The helpers this documents ship in the `@vercel/connect/chat` subpath:
vercel/vercel#16826.
---------
Signed-off-by: Ben Sabic <bensabic@users.noreply.github.com>
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
eve homepage is now live, change the link from the docs to the homepage
now, reflecting how the other OSS sites behave
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
## Summary
Plan’s task list API always marked existing in-progress steps as
complete whenever a new step was added. That made sense for simple
sequential bots, but it blocked parallel work — even though the docs
already showed a parallel pattern and per-task updates by ID were added
earlier.
This PR adds an optional flag on task creation so callers can keep
multiple steps in progress at once, while leaving the old sequential
behavior as the default.
**Opt-out flag, default on**. We considered removing auto-completion
entirely. That would’ve been cleaner for parallel use but would’ve
broken existing sequential bots that rely on implicit “move to next
step” behavior. Defaulting to the current behavior keeps upgrades safe;
parallel callers pass the flag off.
**No broader API redesign**. Task completion stays explicit via status
updates and the existing “complete plan” flow. The change is scoped to
when a new task is appended.
closes#630
## summary
resolves#515
adds Discord slash-command interaction response flags so selected
commands can defer as ephemeral
Discord locks ephemerality on the initial
`DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE` response, so the adapter now
exposes `interactionFlags` on `createDiscordAdapter` for that initial
acknowledgement
```ts
import {
createDiscordAdapter,
DiscordInteractionResponseFlag,
} from "@chat-adapter/discord";
const discord = createDiscordAdapter({
interactionFlags: ({ command }) => {
if (command === "/admin") {
return DiscordInteractionResponseFlag.Ephemeral;
}
},
});
```
handlers still use the normal `event.channel.post(...)` flow, and
`event.channel.postEphemeral(...)` keeps the normal Chat SDK fallback
behavior outside Discord's slash-command interaction response path
Co-authored-by: dancer <josh@afterima.ge>
- Replace npm version/download badges with Agent Stack and MIT badges on
the root README and all published package READMEs
- Streamline root `AGENTS.md`: fix title, add an accurate monorepo map,
trim duplicated CONTRIBUTING/Ultracite/env-var content, and link to
package-level `AGENTS.md` files
- Slim the Chat SDK agent skill (`skills/chat/SKILL.md` and published
copies) to defer to bundled docs, chat-sdk.dev, Vercel KB, and
`llms.txt` instead of inlining CLI flags, quick-start code, and API
tables
- Polish root README copy (install examples, adapter/build links, Vercel
Plugin URL, Vercel KB link, “Made by Vercel” badge)
- Minor `CONTRIBUTING.md` fixes: simplify DCO wording, correct
preview-branch proxy file references (`proxy.ts` vs middleware)
---------
Signed-off-by: Ben Sabic <bensabic@users.noreply.github.com>
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
Updates the Zernio (vendor-official) adapter page to reflect
`@zernio/chat-sdk-adapter@0.4.0`.
## What changed
- **Feature support**: `selectMenus` → partial (card
`Select`/`RadioSelect` now map to a WhatsApp interactive **list**).
- **Platform matrix**: added Lists, Location/Contacts, Templates/Flows
rows (WhatsApp); corrected WhatsApp typing to ✓.
- **New sections**:
- *WhatsApp rich messages* — `sendInteractive`
(button/list/cta_url/flow/location-request/voice-call), `sendLocation`,
`sendContacts`, `sendTemplate`, `reply` via the exported
`ZernioApiClient`.
- *Inbound interactive replies* — reading button/list/flow responses, ad
referral, and quoted context off `message.raw.metadata`.
- *Opening conversations* — `openDM` and `openConversation` (cold-start
by phone).
- **API client**: added `createConversation`.
Scope follows the same split as other adapters: cross-platform concepts
live in the adapter; WhatsApp-only sends go through the alongside
client.
Removes the QQ Bot community adapter entry from
`apps/docs/adapters.json`.
The entry only provided a navigation listing without a corresponding
content page, so https://chat-sdk.dev/adapters/community/qq-bot resolved
to a 404.
- Swap the text-based eve placeholder in the OSS products dropdown for
the actual eve wordmark, hard-copied as an SVG from
`@vercel/geistcn-assets` and themed via `currentColor`.
- Put AI Elements last, drop Streamdown to address G feedback
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds the
[`chat-adapter-weixin`](https://github.com/wong2/weixin-chat-adapter)
community adapter (Weixin / WeChat iLink bot) to the docs.
### What's included
- `apps/docs/content/adapters/community/weixin.mdx` — hand-authored
adapter page following the existing community-adapter structure
(install, quick start, long-polling note, QR login, env vars, config
`TypeTable`, thread-ID format, capabilities/limitations, and
`<FeatureSupport />`).
- `apps/docs/adapters.json` — registry entry (`community: true`, author,
pinned README commit).
- `apps/docs/content/adapters/community/meta.json` — sidebar link under
**Platforms**.
### Notes
The adapter talks to Weixin's iLink bot HTTP JSON APIs directly. It uses
long polling for inbound messages (no webhook) and requires a Chat SDK
`StateAdapter` for cursor / context-token / dedupe / history. It's 1:1
only, so messages route through `onDirectMessage`.
### Verification
`docs-adapters` (322) and `docs-llms` (129) integration tests pass.
---------
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
- Break hero title cleanly on desktop only so "for" doesn't strand on
mobile
- Keep OSS stat labels (e.g. "Weekly downloads") on one line
- Shrink feature box headings on mobile, full size from sm
- Span the third feature box full-width on mobile
- Enable horizontal scroll for long code lines in the code showcase
- Match "more adapters" link color to the "Supports" label
---------
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
Syncs the bundled Chat SDK KB resources from Edge Config and hardens the
`sync-resources` script that generates them.
- **New guides** (4): Vercel Connect, the Slack Vercel Connect bot, AI
Gateway + AI SDK, and the daily digest bot. Existing guide bodies
refreshed and `templates.json` regenerated.
- **Script hardening** (`scripts/sync-resources.ts`):
- Fetch + validate all guides into memory **before** wiping the
resources dir — a failed fetch now leaves the working tree untouched.
- Validate the `resources-edge-config.json` shape with a clear error
instead of a blind cast.
- Reject duplicate guide slug collisions.
- Retry transient fetches (5xx / network) with exponential backoff; fail
fast on 4xx, bad content-type, and oversized bodies.
- Mirror `skills/chat/SKILL.md` to **all four** committed copies (docs
site `.well-known` + `AGENTS.md`, and the two `create-chat-sdk` scaffold
templates).
- TSDoc on every function.
- **Tests**: new offline consistency test in
`packages/integration-tests` — every guide has a non-empty file with no
orphans, `templates.json` mirrors the config, no duplicate slugs, and
all four `SKILL.md` copies are byte-identical to the source.
---------
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
Adds Linq as a vendor-official adapter — iMessage and SMS for Chat SDK.
- `vendor-official/linq.mdx` adapter page (following the Velt /
AgentPhone format)
- catalog entry in `adapters.json`
- `linq` added to the vendor-official `meta.json`
Repo: https://github.com/linq-team/linq-chat-sdk · npm:
`@linqapp/chat-sdk-adapter` (Apache-2.0)
The adapter is built and tested end-to-end against the live Linq API and
the Chat SDK runtime (real iMessage round-trip, webhooks, reactions,
media). Confirmed with Benji that a repo link works and Apache-2.0 is
fine. Happy to adjust the page to match any conventions I missed.
---------
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
## Summary
Adds Novu as a vendor official adapter to Chat SDK allowing
multi-channel notification delivery and quick channel setup for
multi-tenant apps.
Official change log entry:
https://novu.co/changelog/novu-chat-sdk-adapter/
Official social post: https://x.com/novuhq/status/2067870170320679158
## Test plan
Manually tested with our team to ensure compatability with the create
chat sdk and template apps, also created an example repo:
https://github.com/novuhq/novu-chat-sdk-example
## Checklist
- [x] All commits are signed and verified
- [x] `pnpm validate` passes
- [x] Changeset added (or N/A — see
[CONTRIBUTING.md](./CONTRIBUTING.md))
- [x] Documentation updated (or N/A)
---------
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
Follow-up to #572 (now merged). Improvements to the Velt vendor-official
entry:
- **Sharpen the description + tagline** to reflect what's distinctive:
comments are *anchored* to the exact element, across documents,
rich-text editors, canvases, PDFs, and video — with per-comment document
context and a streaming AI reply.
- **Add a Live demo link** to the Examples section: the [tiptap comments
demo](https://sample-apps-tiptap-comments-demo.vercel.app) where you
@-mention **Velt Bot** and get a streaming AI reply (runs the
`nextjs-velt-ai-bot` sample app).
- **Re-pin the `readme` SHA** to current `main` so the linked package
README reflects the latest content (now includes example + live-demo
links).
Touches only `apps/docs/adapters.json` and
`apps/docs/content/adapters/vendor-official/velt.mdx`
## summary
restores Open Graph and Twitter preview images across the homepage,
adapters, and resources pages
adds the canonical metadata base so social image URLs resolve against
chat-sdk.dev instead of localhost
Add Teams subpath exports for custom runtimes, including Bot Connector
API helpers, Graph reads, parse-only webhooks, format helpers, Adaptive
Cards, and Task Module primitives.
---------
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
Stacked on top of #603 (`create-chat-sdk`).
Refreshes the chat-sdk.dev homepage styling:
- Adds Geist typography utilities (`text-heading-*`, `text-copy-*`) and
applies them to the hero, section headings, and copy.
- Adds a grid-based layout (`home-grid.css`) with consistent guide lines
for the stats, supported-platforms, code, and integrations sections.
- Adds a tabbed code showcase for the Chat SDK Core section, with window
chrome, a Geist syntax theme, and
`bot.ts`/handlers/cards/streaming/tools/state/multi-platform snippets.
- Scopes inline-code styling and sets the dark-mode
`--ds-background-100`/`--ds-background-200` tokens so `background-100`
is the elevated surface.
---------
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
Adds `create-chat-sdk`, a CLI that scaffolds a Next.js Chat SDK bot
project:
```bash
npm create chat-sdk@latest my-bot
# non-interactive
npm create chat-sdk@latest -- my-bot --adapter slack redis -y
```
The user picks platform and state adapters interactively or via
`--adapter`, and the CLI generates a webhook-only project with
`src/lib/bot.ts`, `.env.example`, `next.config.ts`, `package.json`, and
a README, then optionally runs `git init` and installs dependencies.
There are no pages or client UI in the template.
Adapter choices come straight from the `chat/adapters` catalog, so the
CLI has no adapter registry of its own. When a coding agent such as
Cursor or Claude Code runs the CLI, it uses non-interactive defaults and
requires an explicit platform adapter. `--interactive` forces prompts.
## also in this pr
- `google-chat` is renamed to `gchat` everywhere, including docs pages,
the OG image, and adapter catalog. Old URLs redirect permanently,
including language-prefixed and `/og` paths
- a new docs page is available at `chat-sdk.dev/docs/create-chat-sdk`,
and the CLI is promoted on the homepage, package READMEs, and agent
skill
- `create-chat-sdk` releases independently with a minor changeset for
its initial `0.1.0` release
---------
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
Co-authored-by: dancer <josh@afterima.ge>
## summary
adds native rich message support for Telegram Bot API 10.1
explicit markdown and AST messages now use `sendRichMessage`, edits use
rich message payloads, and private chat streams use
`sendRichMessageDraft` before persisting the completed response
preserves existing behavior for plain strings, raw messages, cards,
media captions, and older or custom Bot API servers through automatic
fallback
adds typed inbound rich message parsing, rich message limits, regression
coverage, and updated adapter documentation
## summary
adds `webClientOptions` to `SlackAdapterConfig` so users can configure
the underlying Slack `WebClient` instances
the options apply to both the default client and per-token clients used
for multi-workspace requests, including settings such as `retryConfig`,
per-request `timeout`, custom headers, and `rejectRateLimitedCalls`
`slackApiUrl` is intentionally excluded from `webClientOptions` because
the existing `apiUrl` option remains the single configuration path for
overriding the Slack Web API base URL
custom headers are cloned for each client because the Slack SDK adds
authorization to the provided headers object, preventing credentials
from leaking between token-bound clients
---------
Co-authored-by: dancer <josh@afterima.ge>
Adds a safeguard in `NavigationMenuTrigger` to skip `preventDefault`
when the click is on a nested link, so the logo navigates home without
interfering with the chevron dropdown, matching the AI SDK website
interaction model.
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
## Summary
Adds Telegram bot command support for Chat SDK slash command handlers.
- Routes Telegram `/command` and `/command@botusername` messages to
`bot.onSlashCommand`
- Ignores commands addressed to another bot
- Keeps non-command messages on the existing normal message path
## Test plan
- `pnpm validate`
- Tested locally against a real Telegram bot
## Checklist
- [x] All commits are signed and verified
- [x] `pnpm validate` passes
- [x] Changeset added
- [x] Documentation updated
---------
Co-authored-by: dancer <josh@afterima.ge>
Adapter Catalog:
- Adds a zero-dependency `chat/adapters` subpath for official and
vendor-official adapter metadata.
- Includes typed catalog entries, env specs, peer dependency metadata,
and helper APIs for setup and onboarding flows.
- Wires the subpath into the `chat` package export map and build config.
Code Coverage:
- Adds unit coverage for catalog integrity, registry sync, helper
behavior, official env declarations, and peer dependency derivation.
- Extends docs integration coverage for `chat/adapters` imports and
vendor-official package install metadata.
Documentation:
- Documents the new catalog on the adapter overview page.
- Splits platform-specific adapter guidance into a new
`/docs/platform-adapters` page.
- Renames `/docs/state` to `/docs/state-adapters` and adds a redirect
for the old slug.
Agent Guidance:
- Updates repo-local and public agent guidance so agents know when and
how to use `chat/adapters`.
- Adds focused `AGENTS.md` guidance inside `packages/chat/src/adapters`
for future catalog maintenance.
---------
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
Adds official platform adapter branding across the docs site, npm
READMEs, and social previews.
- **Homepage**: add Twilio to the supported-platforms logo grid
- **OG images**: add custom artwork for all 11 official platform
adapters under content/adapters/official/og/; serve static-first from
the existing /adapters/official/{slug}/og route with dynamic fallback
for state adapters
- **READMEs**: add linked hero banners to every official platform
adapter package README, using the live OG URL as the single image source
- **Tests**: integration-test guardrails for OG image coverage, README
banner discoverability, and knip-clean helpers
- **Changeset**: empty changeset for CI
<img width="2400" height="1256" alt="Chat SDK - Slack"
src="https://github.com/user-attachments/assets/4d186a1c-5651-44b8-8698-091ee23b44da"
/>
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
## Summary
- Add the QQ Bot community platform adapter to `apps/docs/adapters.json`
- Point the listing at the published npm package
`@youglin/adapter-qq-bot`
- Pin the rendered README to the adapter repository commit
`46e76e8e6965d5dc1ee1446bbea76feb23cf7733`
## Verification
- Parsed `apps/docs/adapters.json` and checked unique `slug` /
`packageName` values
- Verified the `readme` field is pinned to a 40-character commit SHA
- Verified GitHub API can fetch `README.md` at the pinned adapter commit
Improves Chat SDK discoverability across npm, READMEs, and the docs site
for search engines and AI coding agents.
- **npm metadata**: point every published package `homepage` at
chat-sdk.dev deep links; expand `chat` keywords/description; fix
`repository.directory` (`packages/chat-sdk` → `packages/chat`); align
state adapter keywords
- **READMEs**: add npm callouts, Documentation/Guides links, and AI
Coding Agents sections (skill install, optional Vercel Plugin,
`llms.txt` / `llms-full.txt`) across all published packages and the repo
root
- **docs JSON-LD**: `HowTo` / `TechArticle` on getting-started,
streaming, and cards; `CollectionPage` + official-only `ItemList` on
`/adapters` (with split human vs JSON-LD descriptions)
- **UTMs**: add `chat-sdk_site` / `chat-sdk_repo` tracking params to
Resources links in selected MDX pages and adapter READMEs (discord,
github, slack, liveblocks, getting-started, ai index)
- **contract tests**: integration-tests guardrails for npm metadata and
README discoverability so future package additions don't drift
---------
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
Moves the Sendblue adapter from community to vendor-official in the docs
site now that Sendblue maintains `chat-adapter-sendblue`.
- package: `chat-adapter-sendblue`
- repo: https://github.com/sendblue-api/chat-adapter-sendblue
- docs: https://docs.sendblue.com/guides/chat-sdk-adapter/
Updates the adapter registry and hand-authored detail page (iMessage,
SMS, RCS, `sb-signing-secret` webhook verification, official Sendblue
guide links). Reorders vendor-official adapters so Liveblocks, Resend,
Sendblue, and Zernio appear first. Adds a permanent redirect from
`/adapters/community/sendblue`.
Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com>
## summary
clarifies that `author.isMe` means the message was sent by the current
bot runtime and should be filtered from handler dispatch
documents that adapters backed by user-owned accounts should not map
platform fields like `fromMe` directly to `isMe`
recommends tracking message ids returned by `postMessage` so webhook
echoes can be identified without filtering legitimate user-authored
messages