mirror of
https://github.com/vercel/chat.git
synced 2026-09-14 18:32:29 +08:00
@chat-adapter/github@4.32.0
734 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
6f18930cf3 |
chore(release): version packages (#623)
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @chat-adapter/discord@4.32.0 ### Minor Changes -@chat-adapter/whatsapp@4.32.0 @chat-adapter/github@4.32.0 @chat-adapter/twilio@4.32.0 @chat-adapter/discord@4.32.0 @chat-adapter/messenger@4.32.0 @chat-adapter/slack@4.32.0 chat@4.32.0 @chat-adapter/state-pg@4.32.0 create-chat-sdk@0.1.1 @chat-adapter/gchat@4.32.0 @chat-adapter/tests@4.32.0 @chat-adapter/web@4.32.0 @chat-adapter/state-memory@4.32.0 @chat-adapter/linear@4.32.0 @chat-adapter/shared@4.32.0 @chat-adapter/telegram@4.32.0 @chat-adapter/state-redis@4.32.0 @chat-adapter/state-ioredis@4.32.0 @chat-adapter/teams@4.32.0 |
||
|
|
219625724c |
fix(discord): sort imports (#657)
## summary sorts the Discord adapter type imports so main lint passes again ## test plan - `pnpm exec ultracite check packages/adapter-discord/src/index.ts` - `git diff --check` |
||
|
|
2e4735118e |
fix: let Plan tasks run in parallel without implicit auto-completion (#632)
## 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 |
||
|
|
a769d4d6d9 |
build(deps): bump changesets/action from 1.7.0 to 1.8.0 (#579)
Bumps [changesets/action](https://github.com/changesets/action) from 1.7.0 to 1.8.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/changesets/action/releases">changesets/action's releases</a>.</em></p> <blockquote> <h2>v1.8.0</h2> <h3>Minor Changes</h3> <ul> <li><a href="https://redirect.github.com/changesets/action/pull/258">#258</a> <a href="https://github.com/changesets/action/commit/f5dbf72f96949cb0daf45152f0f63062df70e97d"><code>f5dbf72</code></a> Thanks <a href="https://github.com/tom-sherman"><code>@tom-sherman</code></a>! - Support draft version PR modes with a new <code>prDraft</code> input. Use <code>create</code> to create new version PRs as drafts, or <code>always</code> to also convert existing version PRs back to draft when updating them.</li> </ul> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/changesets/action/pull/502">#502</a> <a href="https://github.com/changesets/action/commit/6002dbd987f49a3c0a134910d9c7bca975b79977"><code>6002dbd</code></a> Thanks <a href="https://github.com/oshytiko"><code>@oshytiko</code></a>! - Fixed initial <code>.changeset</code> state being picked up, when <code>cwd</code> parameter is provided</p> </li> <li> <p><a href="https://redirect.github.com/changesets/action/pull/536">#536</a> <a href="https://github.com/changesets/action/commit/81b3f61ebffcb868f73e4c0b2682517149c834a2"><code>81b3f61</code></a> Thanks <a href="https://github.com/radnan"><code>@radnan</code></a>! - Fixed <code>.changeset</code> state being picked for the version command when <code>cwd</code> parameter is provided</p> </li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/changesets/action/blob/main/CHANGELOG.md">changesets/action's changelog</a>.</em></p> <blockquote> <h1><code>@changesets/action</code></h1> <h2>1.8.0</h2> <h3>Minor Changes</h3> <ul> <li><a href="https://redirect.github.com/changesets/action/pull/258">#258</a> <a href="https://github.com/changesets/action/commit/f5dbf72f96949cb0daf45152f0f63062df70e97d"><code>f5dbf72</code></a> Thanks <a href="https://github.com/tom-sherman"><code>@tom-sherman</code></a>! - Support draft version PR modes with a new <code>prDraft</code> input. Use <code>create</code> to create new version PRs as drafts, or <code>always</code> to also convert existing version PRs back to draft when updating them.</li> </ul> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/changesets/action/pull/502">#502</a> <a href="https://github.com/changesets/action/commit/6002dbd987f49a3c0a134910d9c7bca975b79977"><code>6002dbd</code></a> Thanks <a href="https://github.com/oshytiko"><code>@oshytiko</code></a>! - Fixed initial <code>.changeset</code> state being picked up, when <code>cwd</code> parameter is provided</p> </li> <li> <p><a href="https://redirect.github.com/changesets/action/pull/536">#536</a> <a href="https://github.com/changesets/action/commit/81b3f61ebffcb868f73e4c0b2682517149c834a2"><code>81b3f61</code></a> Thanks <a href="https://github.com/radnan"><code>@radnan</code></a>! - Fixed <code>.changeset</code> state being picked for the version command when <code>cwd</code> parameter is provided</p> </li> </ul> <h2>1.7.0</h2> <h3>Minor Changes</h3> <ul> <li><a href="https://redirect.github.com/changesets/action/pull/564">#564</a> <a href="https://github.com/changesets/action/commit/935fe876b0054dfc962ac86bcddf028460040d46"><code>935fe87</code></a> Thanks <a href="https://github.com/Andarist"><code>@Andarist</code></a>! - Automatically use the GitHub-provided token to allow most users to avoid explicit <code>GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}</code> configuration.</li> </ul> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/changesets/action/pull/545">#545</a> <a href="https://github.com/changesets/action/commit/54220dd92c06e7da112b139f95d8beb933e4cdde"><code>54220dd</code></a> Thanks <a href="https://github.com/ryanbas21"><code>@ryanbas21</code></a>! - The <code>.npmrc</code> generation now intelligently handles both traditional NPM token authentication and trusted publishing scenarios by only appending the auth token when <code>NPM_TOKEN</code> is defined. This prevents 'undefined' from being written to the registry configuration when using OIDC tokens from GitHub Actions trusted publishing.</p> </li> <li> <p><a href="https://redirect.github.com/changesets/action/pull/563">#563</a> <a href="https://github.com/changesets/action/commit/6af4a7ec080d23ac6b304f69b67fd0aa92e089e7"><code>6af4a7e</code></a> Thanks <a href="https://github.com/Andarist"><code>@Andarist</code></a>! - Don't error on already committed symlinks and executables that stay untouched</p> </li> </ul> <h2>1.6.0</h2> <h3>Minor Changes</h3> <ul> <li><a href="https://redirect.github.com/changesets/action/pull/558">#558</a> <a href="https://github.com/changesets/action/commit/342005d41242bccd9dd9ae8d3679efce96af48ae"><code>342005d</code></a> Thanks <a href="https://github.com/harsha-venugopal-ledn"><code>@harsha-venugopal-ledn</code></a>! - Upgrade from Node.js 20 to Node.js 24 LTS</li> </ul> <h2>1.5.3</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/changesets/action/pull/477">#477</a> <a href="https://github.com/changesets/action/commit/9d933dcd11c284ac49a835db884c3c1008b2b96f"><code>9d933dc</code></a> Thanks <a href="https://github.com/Andarist"><code>@Andarist</code></a>! - Updated <code>@actions/*</code> and <code>@octokit/*</code> dependencies.</p> </li> <li> <p><a href="https://redirect.github.com/changesets/action/pull/479">#479</a> <a href="https://github.com/changesets/action/commit/cf373e45c90a0cc564cd2770de3e9a3a4cdd4603"><code>cf373e4</code></a> Thanks <a href="https://github.com/Andarist"><code>@Andarist</code></a>! - Switched to <code>esbuild</code> for bundling the dist file. This led to 45% file size reduction.</p> </li> <li> <p><a href="https://redirect.github.com/changesets/action/pull/488">#488</a> <a href="https://github.com/changesets/action/commit/022692ba027b33bf46d4d41907a317fbf04461a7"><code>022692b</code></a> Thanks <a href="https://github.com/s0"><code>@s0</code></a>! - Fix PRs sometimes not getting reopened with <code>commitMode: github-api</code></p> <p>There was a race-condition that means sometimes existing PRs would not be found, and new PRs would be opened. This has now been fixed by fetching existing PRs before making any changes.</p> </li> <li> <p><a href="https://redirect.github.com/changesets/action/pull/486">#486</a> <a href="https://github.com/changesets/action/commit/7ed195554624ebd75c08aa477b53110f61cc78f7"><code>7ed1955</code></a> Thanks <a href="https://github.com/s0"><code>@s0</code></a>! - Fixed situations in which <code>cwd</code> was specified as a relative path and used with (default) <code>commitMode: git-cli</code></p> </li> <li> <p><a href="https://redirect.github.com/changesets/action/pull/461">#461</a> <a href="https://github.com/changesets/action/commit/e9c36b696406360bf04204ad32e3dcf3ad752b77"><code>e9c36b6</code></a> Thanks <a href="https://github.com/nayounsang"><code>@nayounsang</code></a>! - Avoid hitting a deprecation warning when encountering errors from <code>@octokit/request-error</code></p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/changesets/action/commit/63a615b9cd06ba9a3e6d13796c7fbcb080a60a0b"><code>63a615b</code></a> v1.8.0</li> <li><a href="https://github.com/changesets/action/commit/84c24326acc93f51d3f24f30a546316c82e2115c"><code>84c2432</code></a> Version Packages (<a href="https://redirect.github.com/changesets/action/issues/598">#598</a>)</li> <li><a href="https://github.com/changesets/action/commit/f5dbf72f96949cb0daf45152f0f63062df70e97d"><code>f5dbf72</code></a> Add draft mode support (<a href="https://redirect.github.com/changesets/action/issues/258">#258</a>)</li> <li><a href="https://github.com/changesets/action/commit/91b911142e975cceaa134eecb302493230d68c05"><code>91b9111</code></a> Protect publishes with env gate (<a href="https://redirect.github.com/changesets/action/issues/610">#610</a>)</li> <li><a href="https://github.com/changesets/action/commit/d4c53c294341eec8a419ec2d1927138bfdeec234"><code>d4c53c2</code></a> Fix <code>CODEOWNERS</code> pattern</li> <li><a href="https://github.com/changesets/action/commit/2ae596f3dd74aaee4f346b31fda33a58528d3d40"><code>2ae596f</code></a> Tweak CI setup (<a href="https://redirect.github.com/changesets/action/issues/599">#599</a>)</li> <li><a href="https://github.com/changesets/action/commit/0784b0ec8fcaa273fc06742c926ee7cfc946a8e7"><code>0784b0e</code></a> Add <code>CODEOWNERS</code></li> <li><a href="https://github.com/changesets/action/commit/81b3f61ebffcb868f73e4c0b2682517149c834a2"><code>81b3f61</code></a> Fixed <code>.changeset</code> state being picked for the version command when <code>cwd</code> para...</li> <li><a href="https://github.com/changesets/action/commit/6002dbd987f49a3c0a134910d9c7bca975b79977"><code>6002dbd</code></a> Fix reading <code>.changeset</code> directory from path provided in <code>cwd</code> parameter (<a href="https://redirect.github.com/changesets/action/issues/502">#502</a>)</li> <li>See full diff in <a href="https://github.com/changesets/action/compare/6a0a831ff30acef54f2c6aa1cbbc1096b066edaf...63a615b9cd06ba9a3e6d13796c7fbcb080a60a0b">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
022a502726 |
feat(discord): add ephemeral slash command responses (#514)
## 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> |
||
|
|
eccc6b91bf |
fix(chat): detect mentions in skipped queued messages (#656)
## summary fixes #613 detects bot mentions across queued and burst skipped messages before routing handlers this makes `onNewMention` fire when an earlier skipped message mentions the bot and the latest collapsed message does not, while preserving `message.isMention` on the latest message adds regression coverage for both `queue` and `burst` |
||
|
|
bb6e52f058 |
build(deps): bump piscina from 4.9.2 to 4.9.3 (#627)
Bumps [piscina](https://github.com/piscinajs/piscina) from 4.9.2 to 4.9.3. <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/piscinajs/piscina/blob/v4.9.3/CHANGELOG.md">piscina's changelog</a>.</em></p> <blockquote> <h3><a href="https://github.com/piscinajs/piscina/compare/v4.9.2...v4.9.3">4.9.3</a> (2026-06-12)</h3> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/piscinajs/piscina/commit/4440ae15037b2462549943ba9ab66da0b87f906d"><code>4440ae1</code></a> chore(release): 4.9.3</li> <li><a href="https://github.com/piscinajs/piscina/commit/8703d3e353936c05dd3386508955e0e30c2ffc57"><code>8703d3e</code></a> Merge</li> <li><a href="https://github.com/piscinajs/piscina/commit/63532c5a7595dba7647f4c521d9aed39475a6d0f"><code>63532c5</code></a> docs: Update Fastify listen() calls to use { port: 3000 } in docs and example...</li> <li><a href="https://github.com/piscinajs/piscina/commit/67591a20a78c894de9170f782a038365784874bc"><code>67591a2</code></a> chores: gh actions least privilege (<a href="https://redirect.github.com/piscinajs/piscina/issues/1013">#1013</a>) (<a href="https://redirect.github.com/piscinajs/piscina/issues/1014">#1014</a>)</li> <li><a href="https://github.com/piscinajs/piscina/commit/7c4220706fa45ff1ea629891854ef45ed0ecdc30"><code>7c42207</code></a> chore: enhance contributing guidelines (<a href="https://redirect.github.com/piscinajs/piscina/issues/972">#972</a>)</li> <li><a href="https://github.com/piscinajs/piscina/commit/04c2c52b7c7bdfd7471668d2c052848fd91d9347"><code>04c2c52</code></a> chore: pin actions (<a href="https://redirect.github.com/piscinajs/piscina/issues/848">#848</a>) (<a href="https://redirect.github.com/piscinajs/piscina/issues/850">#850</a>)</li> <li><a href="https://github.com/piscinajs/piscina/commit/d157099670fbb55a5a6f8d730d44bff131d04387"><code>d157099</code></a> [Backport v4] chore: edit ignore files (<a href="https://redirect.github.com/piscinajs/piscina/issues/826">#826</a>)</li> <li>See full diff in <a href="https://github.com/piscinajs/piscina/compare/v4.9.2...v4.9.3">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/vercel/chat/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
4ee187ac3c |
fix(telegram): start typing before message processing (#612)
## Summary Send Telegram typing actions immediately for private incoming message and slash command updates before handing the message to Chat SDK processing. This lets Telegram clients show the native `...` indicator during early processing instead of waiting for downstream handler code to call `thread.startTyping()`. The change is scoped to private, non-bot Telegram messages and adds regression coverage for normal messages and slash commands plus a patch changeset. Closes #611 ## Test plan - [x] `pnpm validate` - [x] `pnpm --filter @chat-adapter/telegram test` - [x] `pnpm --filter @chat-adapter/telegram typecheck` - [x] `pnpm --filter @chat-adapter/telegram build` ## 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) --------- Signed-off-by: dancer <josh@afterima.ge> Co-authored-by: dancer <josh@afterima.ge> |
||
|
|
fc7df9c4cf |
fix(github): remove raw webhook payload logging (#500)
- Remove raw GitHub webhook body previews from adapter debug/error logs - Prevents webhook payload content from being copied into application logs when debug logging is enabled - No webhook routing or response behavior change; only log fields change ## Context The GitHub adapter logged a preview of incoming webhook request bodies while handling webhooks. Raw webhook payloads can contain repository metadata, user-authored issue or pull request text, URLs, installation details, and other provider-controlled content. Even at debug level, SDK logging should avoid copying raw provider payloads into application logs by default. ## Problem Debug logging should provide useful operational context without changing the privacy boundary of webhook data. The previous log emitted a raw body preview before signature verification. That meant an application with debug logging enabled could record payload content from both valid GitHub webhook events and invalid requests that were later rejected. This is unnecessary for normal webhook troubleshooting. Derived request metadata is enough to understand routing and parsing failures without retaining payload text. ## Changes The GitHub adapter no longer logs raw webhook bodies or body previews. Webhook logs now use bounded request-shape metadata: - `bodyBytes` - `contentType` - `eventType` - `signaturePresent` - `jsonParseStatus` for invalid JSON The change preserves signature verification, ping handling, JSON parsing, and event routing behavior. Regression tests cover invalid signature, invalid JSON, and valid webhook paths with token-shaped and customer-slug sentinel strings in the payload. The tests assert those sentinels, the full raw body, the old raw-body log message, and `bodyPreview` do not appear in logger calls. A patch changeset is included for `@chat-adapter/github`. ## Verification - `pnpm turbo build --filter @chat-adapter/github` - `pnpm --filter @chat-adapter/github test` - `pnpm --filter @chat-adapter/github typecheck` - `pnpm check` - `git diff --check` |
||
|
|
0d4e3ee490 |
fix(discord): render bare URLs as bare links, not masked links. (#567)
## Summary Discord only renders masked links `[text](url)` inside embeds. In a normal message, a bare URL converted to `[url](url)` shows up as literal text rather than a clickable link. In nodeToDiscordMarkdown's link branch, return the bare URL when the link's label equals its target (the bare-URL / autolink case); labeled links are unchanged. Adds regression tests for both bare URLs and <autolinks>. Fixes #565. |
||
|
|
579ac37b4f |
build(deps): bump pnpm/action-setup from 6.0.5 to 6.0.8 (#580)
Bumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 6.0.5 to 6.0.8. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pnpm/action-setup/releases">pnpm/action-setup's releases</a>.</em></p> <blockquote> <h2>v6.0.8</h2> <h2>What's Changed</h2> <ul> <li>docs(README): fix <code>cache_dependency_path</code> type by <a href="https://github.com/haines"><code>@haines</code></a> in <a href="https://redirect.github.com/pnpm/action-setup/pull/257">pnpm/action-setup#257</a></li> <li>fix: drop patchPnpmEnv so standalone+self-update works on Windows by <a href="https://github.com/zkochan"><code>@zkochan</code></a> in <a href="https://redirect.github.com/pnpm/action-setup/pull/258">pnpm/action-setup#258</a></li> <li>fix: update pnpm to 11.1.1 by <a href="https://github.com/mungodewar"><code>@mungodewar</code></a> in <a href="https://redirect.github.com/pnpm/action-setup/pull/248">pnpm/action-setup#248</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/mungodewar"><code>@mungodewar</code></a> made their first contribution in <a href="https://redirect.github.com/pnpm/action-setup/pull/248">pnpm/action-setup#248</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/pnpm/action-setup/compare/v6.0.7...v6.0.8">https://github.com/pnpm/action-setup/compare/v6.0.7...v6.0.8</a></p> <h2>v6.0.7</h2> <h2>What's Changed</h2> <ul> <li>fix: honor devEngines.packageManager.onFail=error (<a href="https://redirect.github.com/pnpm/action-setup/issues/252">#252</a>) by <a href="https://github.com/zkochan"><code>@zkochan</code></a> in <a href="https://redirect.github.com/pnpm/action-setup/pull/254">pnpm/action-setup#254</a></li> <li>fix: restore inputs from state in post by <a href="https://github.com/haines"><code>@haines</code></a> in <a href="https://redirect.github.com/pnpm/action-setup/pull/255">pnpm/action-setup#255</a></li> <li>fix: self-update bootstrap to packageManager-pinned version (<a href="https://redirect.github.com/pnpm/action-setup/issues/233">#233</a>) by <a href="https://github.com/zkochan"><code>@zkochan</code></a> in <a href="https://redirect.github.com/pnpm/action-setup/pull/256">pnpm/action-setup#256</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/haines"><code>@haines</code></a> made their first contribution in <a href="https://redirect.github.com/pnpm/action-setup/pull/255">pnpm/action-setup#255</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/pnpm/action-setup/compare/v6.0.6...v6.0.7">https://github.com/pnpm/action-setup/compare/v6.0.6...v6.0.7</a></p> <h2>v6.0.6</h2> <h2>What's Changed</h2> <ul> <li>fix: bin_dest output points to self-updated pnpm, not bootstrap by <a href="https://github.com/zkochan"><code>@zkochan</code></a> in <a href="https://redirect.github.com/pnpm/action-setup/pull/249">pnpm/action-setup#249</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/pnpm/action-setup/compare/v6.0.5...v6.0.6">https://github.com/pnpm/action-setup/compare/v6.0.5...v6.0.6</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pnpm/action-setup/commit/0e279bb959325dab635dd2c09392533439d90093"><code>0e279bb</code></a> fix: update pnpm to 11.1.1 (<a href="https://redirect.github.com/pnpm/action-setup/issues/248">#248</a>)</li> <li><a href="https://github.com/pnpm/action-setup/commit/3e835812ef01165f4f8ae08ade56da44427ed4e0"><code>3e83581</code></a> fix: drop patchPnpmEnv so standalone+self-update works on Windows (<a href="https://redirect.github.com/pnpm/action-setup/issues/258">#258</a>)</li> <li><a href="https://github.com/pnpm/action-setup/commit/551b42e879e37e74d986effdd2a1647d2b02d464"><code>551b42e</code></a> docs(README): fix <code>cache_dependency_path</code> type (<a href="https://redirect.github.com/pnpm/action-setup/issues/257">#257</a>)</li> <li><a href="https://github.com/pnpm/action-setup/commit/739bfe42ca9233c5e6aca07c1a25a9d34aca49b0"><code>739bfe4</code></a> fix: self-update bootstrap to packageManager-pinned version (<a href="https://redirect.github.com/pnpm/action-setup/issues/233">#233</a>) (<a href="https://redirect.github.com/pnpm/action-setup/issues/256">#256</a>)</li> <li><a href="https://github.com/pnpm/action-setup/commit/f61705d907761b3b5209e83910fafd1fea50c5a1"><code>f61705d</code></a> chore: add CODEOWNERS</li> <li><a href="https://github.com/pnpm/action-setup/commit/7a5507b117647ab83e96e9db317ba2234056ebf3"><code>7a5507b</code></a> fix: restore inputs from state in post (<a href="https://redirect.github.com/pnpm/action-setup/issues/255">#255</a>)</li> <li><a href="https://github.com/pnpm/action-setup/commit/1155470f3e5fb872accd4d104b8dfcda41f676ce"><code>1155470</code></a> fix: honor devEngines.packageManager.onFail=error (<a href="https://redirect.github.com/pnpm/action-setup/issues/252">#252</a>) (<a href="https://redirect.github.com/pnpm/action-setup/issues/254">#254</a>)</li> <li><a href="https://github.com/pnpm/action-setup/commit/91ab88e2619ed1f46221f0ba42d1492c02baf788"><code>91ab88e</code></a> fix: bin_dest output points to self-updated pnpm, not bootstrap (<a href="https://redirect.github.com/pnpm/action-setup/issues/249">#249</a>)</li> <li><a href="https://github.com/pnpm/action-setup/commit/e578e19d19d31b011b841ba2aca34731a5f706a5"><code>e578e19</code></a> fix: update pnpm to 11.0.4</li> <li>See full diff in <a href="https://github.com/pnpm/action-setup/compare/8912a9102ac27614460f54aedde9e1e7f9aec20d...0e279bb959325dab635dd2c09392533439d90093">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
490fa00e87 |
fix(discord): don't mangle email addresses into mentions (#651)
## Bug The Discord adapter converts `@mentions` with `/@(\w+)/g` in two places — `DiscordFormatConverter.convertMentionsToDiscord` (plain/`raw` messages) and the text-node branch of `nodeToDiscordMarkdown` (markdown/AST messages): ```ts text.replace(/@(\w+)/g, "<@$1>"); ``` That pattern matches `@word` even when the `@` is preceded by a word character, so it rewrites **email addresses** and `word@word` handles into broken mentions: | input | before | after | |---|---|---| | `Contact me at user@example.com` | `Contact me at user<@example>.com` | `Contact me at user@example.com` | | `ping support@vercel.com` | `ping support<@vercel>.com` | `ping support@vercel.com` | | `hey @alice` | `hey <@alice>` | `hey <@alice>` (unchanged) | The Slack adapter already guards against exactly this with a word-boundary check (`replaceBareMentions`); the Discord converter didn't. ## Fix Introduce a shared top-level `BARE_MENTION_PATTERN = /(?<![\w@.])@(\w+)/g` (per AGENTS.md, regex literals live at top level) with a negative lookbehind, so only an `@` at a word boundary becomes a mention. Emails/handles are left intact; real bare mentions still convert. Used in both conversion sites. ## Test Adds a regression test in `markdown.test.ts` asserting `Contact me at user@example.com` round-trips through `toAst`/`fromAst` without becoming a mention. Includes a changeset (`@chat-adapter/discord` patch). Commit is signed (Verified) and DCO signed-off. --------- Signed-off-by: Osamaali313 <86572800+Osamaali313@users.noreply.github.com> Signed-off-by: Ben Sabic <bensabic@users.noreply.github.com> Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com> |
||
|
|
99c598505f |
docs: refresh agent docs, README badges, and Chat SDK skill (#646)
- 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> |
||
|
|
bf505c5a39 |
chore: enforce DCO and refresh community health files (#644)
- Enforce the Developer Certificate of Origin (DCO) on all commits via the DCO GitHub App (`.github/dco.yml`), with the canonical DCO 1.1 text vendored as `DCO.txt`. - Document the sign-off requirement (`git commit -s`) in `CONTRIBUTING.md`, the PR template checklist, and `AGENTS.md`. - Refresh community-health docs: adopt Contributor Covenant 2.1 in `CODE_OF_CONDUCT.md` and update the disclosure contact in `SECURITY.md`. These changes align this repo with the conventions in the [eve repo](https://github.com/vercel/eve). Signed-off-by: Ben Sabic <bensabic@users.noreply.github.com> Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com> |
||
|
|
e0a155e718 |
fix(examples): add @vercel/oidc to fix nextjs-chat Vercel build (#645)
- The `nextjs-chat` example's generated workflow step route (`/.well-known/workflow/v1/step`) bundles `@workflow/world-vercel → @vercel/queue`, and `@vercel/queue` has an unconditional `import "@vercel/oidc"`. - `@vercel/oidc` is only a deep transitive dependency, so it isn't hoisted into the example app. Vercel's isolated build can't resolve it and fails with `Module not found: Can't resolve '@vercel/oidc'`. (It resolves locally only because pnpm symlinks it, which is why the GitHub Actions build — which excludes the example — stays green.) - Declaring `@vercel/oidc` as a direct dependency of the example fixes resolution for the bundler. No changeset needed — `example-*` packages are private and excluded from versioning. --------- Signed-off-by: Ben Sabic <bensabic@users.noreply.github.com> Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com> |
||
|
|
dd3fa75ac4 |
docs(zernio): document 0.4.0 — interactive lists, WhatsApp rich messages, openDM (#643)
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. |
||
|
|
ba30885093 |
docs: remove QQ Bot community adapter entry (#642)
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. |
||
|
|
7d02ea32de |
[docs] use actual eve logo in OSS nav dropdown (#641)
- 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> |
||
|
|
ef3f0f63bd |
docs: add Weixin community adapter (#638)
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> |
||
|
|
438f5513b0 |
fix: avoid dummy message context for lightweight threads (#633)
## summary fixes #631 removes dummy `Message` casts from lightweight thread, action, and reaction paths when no incoming message context exists this keeps the existing `currentMessage` guard meaningful and prevents streaming through `chat.thread(threadId)`, `chat.openDM(...)`, action threads, and reaction threads from reading fields from an empty object when Slack lacks the thread or recipient context required by `chat.startStream`, the adapter now returns `null` before consuming the stream so Chat SDK can transparently use its post-and-edit fallback native Slack streaming remains available for webhook-created threads and DM threads with valid native stream context --------- Co-authored-by: dancer <josh@afterima.ge> |
||
|
|
64b66864b1 |
chore(changesets): ignore all example-* packages and enforce the convention (#626)
Replace the explicit per-example entries in the changesets `ignore` list with an `example-*` name glob (matched by micromatch). All example apps are private and never published, so listing them individually only adds version and changelog churn to release PRs, and each new example required editing this CODEOWNERS-gated file. Add an integration test that resolves the changesets config against the workspace and asserts every examples/* package is in the resolved ignore list and follows the `example-*` naming convention, so an off-convention example app fails CI instead of silently leaking into releases. --------- Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com> |
||
|
|
937cac989e |
fix(telegram): prevent truncation of valid URLs with entity-marker characters in MarkdownV2 links (#610)
## Summary Fixes `@chat-adapter/telegram` silently truncating valid MarkdownV2 messages whose link URLs contain an odd number of entity-marker characters (`_`, `*`, `~`). `trimToMarkdownV2SafeBoundary` counted unescaped markers anywhere outside code spans and treated an odd total as an unterminated entity. But per the [MarkdownV2 spec](https://core.telegram.org/bots/api#markdownv2-style), only `)` and `\` are special inside the `(...)` URL part of an inline link — so a message ending with e.g. `[Read more](https://example.com/page?utm_campaign=a&utm_source=b&utm_channel=c)` (3 raw underscores in the URL) was sliced mid-URL, rejected by Telegram with `can't parse entities: Can't find end of a URL`, and degraded to plain text by the markdown fallback — links and formatting silently stripped. Changes in `findUnescapedPositionsOutsideCode`: - Tracks a link-URL state alongside the existing `inFence`/`inInline` tracking: it opens when an unescaped `](` is consumed outside code and closes at the first unescaped `)`. Markers inside that span are never recorded. - A link's `]` only counts toward bracket pairing once its URL closes, so hard truncation (4096-char limit) that slices mid-URL now leaves the `[` unmatched and trims back to before the link — previously the cut left an unterminated `(` that Telegram rejected. The defensive under-limit safety pass from #446 (streaming chunks) is intentionally kept; it's now link-aware. |
||
|
|
a8c4af7418 |
fix(slack): skip urls during mention resolution (#619)
## summary prevents cached Slack display names inside urls from being resolved as user mentions before payload formatting shares url-aware mention handling between cached user lookup and Slack formatting while preserving real mentions follow-up to #618, which only protected the final formatting pass |
||
|
|
63ac3e5988 |
docs: homepage nits (#628)
- 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> |
||
|
|
efa96108bd |
docs: sync KB resources and harden sync-resources script (#635)
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> |
||
|
|
07c1112976 |
[slack] skip mention resolution inside code blocks (#629)
Mention resolution happening inside code blocks – results in agents attempting to write NPM package names printing a Slack Bot user ID instead. <img width="837" height="627" alt="image" src="https://github.com/user-attachments/assets/6690af58-61e6-469a-910d-f71c36bcdd61" /> --------- Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com> |
||
|
|
f3de12823c |
Added Express.js chat-sdk example project (#551)
## Summary Added a new example project demonstrating how to use `chat-sdk` with Express.js. Previously, there was no example showing how to integrate `chat-sdk` in a simple Express.js setup. This PR adds a minimal Express.js project with a Discord bot integration to demonstrate how `chat-sdk` can be used in a practical server-side workflow. Closes #519 ## Test plan - Ran the example project locally - Verified the Express.js server starts successfully - Verified the Discord bot connects and responds as expected - Confirmed the example demonstrates basic `chat-sdk` usage with Express.js ## Checklist - [x] All commits are signed and verified - [x] `pnpm validate` passes - [ ] 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> |
||
|
|
d034b8b575 |
docs(adapters): add Linq as vendor-official adapter (#625)
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> |
||
|
|
a528a9f655 |
feat(docs): add eve to product switcher (#624)
Add an eve entry (text wordmark + Beta badge, linking to eve.dev/docs) to the top of the OSS product switcher in the docs navbar. <img width="352" height="328" alt="CleanShot 2026-06-20 at 01 09 35" src="https://github.com/user-attachments/assets/cd2f03b0-8b40-477b-a8a2-ac4a9911f44d" /> Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com> |
||
|
|
06af3e12fd |
docs(adapters): add Novu as vendor-official adapter (#622)
## 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> |
||
|
|
d3cd9719c0 |
docs(adapters): sharpen Velt description + add live demo link (#578)
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` |
||
|
|
a1110dd6d0 |
fix(docs): restore Open Graph images (#620)
## 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 |
||
|
|
2a553aa948 |
chore(release): version packages (#600)
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @chat-adapter/slack@4.31.0 ### Minor Changes -@chat-adapter/linear@4.31.0 create-chat-sdk@0.1.0 @chat-adapter/github@4.31.0 @chat-adapter/teams@4.31.0 @chat-adapter/discord@4.31.0 @chat-adapter/web@4.31.0 @chat-adapter/messenger@4.31.0 @chat-adapter/whatsapp@4.31.0 @chat-adapter/twilio@4.31.0 @chat-adapter/state-ioredis@4.31.0 @chat-adapter/state-redis@4.31.0 @chat-adapter/gchat@4.31.0 @chat-adapter/telegram@4.31.0 @chat-adapter/tests@4.31.0 @chat-adapter/state-pg@4.31.0 @chat-adapter/state-memory@4.31.0 @chat-adapter/shared@4.31.0 chat@4.31.0 @chat-adapter/slack@4.31.0 |
||
|
|
8c7141174a |
feat(teams): add low-level primitives (#593)
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> |
||
|
|
c2a26e7104 |
feat(docs): refresh homepage styling (#615)
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> |
||
|
|
a8bf99ab19 |
fix(adapter-slack): don't rewrite @handles inside URL paths as mentions (#618)
## Problem `linkBareMentionNames` (in `markdown.ts`) rewrites any bare `@word` into a `<@word>` Slack mention. Its lookbehind `(?<![<\w])@(\w+)` excludes `<` and word characters, but **not `/`** — so an `@handle` inside a URL path gets rewritten, corrupting the link: ``` See https://hackmd.io/@jkyang/B1W69XA-fe → See https://hackmd.io/<@jkyang>/B1W69XA-fe ❌ (Slack renders a broken mention; link dead) ``` This affects common `@handle` URLs (HackMD `/@user`, Mastodon `/@user`, Medium `/@user`, …). It reproduces on `main` via `toSlackPayload` for both the plain `text` and the native `markdown_text` paths, because `finalize()` runs the regex over the whole string. (The `renderPostable({ markdown })` AST path is unaffected — bare URLs become link nodes there — which is likely why it's gone unnoticed.) This is the same class of bug as the email fix in #394, which tuned this same regex; URL paths are the sibling case it didn't cover. ## Fix Add `/` to the negative lookbehind so a handle preceded by a path separator is left intact: ```diff -const BARE_MENTION_PATTERN = /(?<![<\w])@(\w+)/g; +const BARE_MENTION_PATTERN = /(?<![<\w/])@(\w+)/g; ``` Whitespace-/punctuation-led mentions (`(cc @george)`), emails (`user@example.com`), and `<mailto:…>` links are unaffected. ## Tests Two cases added to the `mentions` suite (plain string + markdown). Verified against current `main`: - **Without the fix:** both new tests fail (e.g. `…/@user` → `…/<@user>`). - **With the fix:** full `markdown.test.ts` suite passes (28/28). Changeset included (`patch`). --------- Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com> |
||
|
|
8f3af76565 |
feat: add create-chat-sdk CLI (#603)
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> |
||
|
|
4662309fe3 |
feat(telegram): support native rich messages (#616)
## 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 |
||
|
|
8336a3e818 |
feat(slack): expose webClientOptions to configure the underlying WebClient (#602)
## 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> |
||
|
|
5a59ae2aa3 |
fix(docs): allow product switcher logo to navigate home (#614)
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> |
||
|
|
9c936f8796 |
feat(telegram): support slash commands (#586)
## 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> |
||
|
|
b14114a714 |
test(slack): expand emulator coverage for emulate.dev 0.6.0 APIs (#591)
Upgrade @emulators/* to 0.6.0 and add integration tests for DMs, reactions, fetch history, modals, scheduled messages, file uploads, member joins, and bookmarks against the in-process Slack emulator. --------- Co-authored-by: Ben Sabic <bensabic@users.noreply.github.com> |
||
|
|
778ae69abc |
add zero-dependency chat/adapters for adapters catalog (#599)
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> |
||
|
|
171657a019 |
[chat] adding stable id to link button action handlers (#598)
Enabling overriding the `link:<url>` action ID for `LinkButton` events. |
||
|
|
7ecb9730e3 |
chore(docs): add missing Twilio logo and add official platform adapter OG images (#589)
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>
|
||
|
|
a924960747 |
docs: list QQ Bot community adapter (#583)
## 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 |
||
|
|
9921dcd1c4 |
docs(seo): improve npm metadata, README discoverability, and structured data (#587)
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> |
||
|
|
c290464634 |
docs(adapters): promote Sendblue to vendor-official adapter (#584)
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> |
||
|
|
2fb8ad29cf |
docs(adapters): add Kapso WhatsApp adapter (#577)
## Summary Adds [Kapso WhatsApp](https://docs.kapso.ai/) as a vendor-official adapter in `adapters.json`. Kapso is a WhatsApp adapter for Chat SDK that receives signed Kapso webhooks, replies through Chat SDK threads, and supports WhatsApp-native messaging features: - **Text messages** — send and receive WhatsApp messages via Kapso - **Buttons/cards** — Chat SDK card buttons render as WhatsApp reply buttons - **Media** — send and receive images, video, audio, documents, and stickers - **Reactions** — add/remove reactions and handle inbound reaction events - **History** — fetch Kapso-backed message, contact, and conversation metadata - **Webhook verification** — validates Kapso `X-Webhook-Signature` deliveries | Feature | Support | | --- | --- | | Send/receive text | Yes | | Reply buttons | Yes, up to 3 | | CTA URL buttons | Yes | | Media attachments | Yes | | Reactions | Yes | | Message history | Yes | - **Docs**: [docs.kapso.ai](https://docs.kapso.ai/) - **npm**: [`@kapso/chat-adapter`](https://www.npmjs.com/package/@kapso/chat-adapter) - **GitHub**: [`gokapso/chat-sdk-adapter`](https://github.com/gokapso/chat-sdk-adapter) - **Blog**: https://kapso.ai/blog/chat-sdk-adapter |
||
|
|
f40c4d4840 |
docs(chat): clarify isMe semantics for adapter authors (#582)
## 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 |