Vishal Yathish
90dc3251a5
[slack] add support for typing indicators with custom loading states ( #87 )
...
* [slack] add support for typing indicators with custom loading states
* adjust docs
* add changeset
* adjust
* remove
* minor bugfix
* add to example
2026-02-24 12:12:47 -08:00
Hayden Bleasel
e970a6939b
Upgrade Biome configuration to use Ultracite preset ( #81 )
...
* Upgrade Biome to Ultracite
* Remove package commands
* Update biome.jsonc
* Update biome.jsonc
* Initial fixes
* Update biome.jsonc
* Remaining fixes
* Update pnpm-lock.yaml
* Fix commands
* Update knip.json
* Merge Claude files
* Fix skipped test
* Misc fixes
2026-02-20 22:01:10 -08:00
Hayden Bleasel
1348532068
Open Source Beta Prep ( #73 )
...
* Update docs - Slack Assistants API, App Home tab, Stream stop blocks
* Update README.md
* Update package readmes, fix readme integration test
* Add npm badges to all package READMEs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
* Add test coverage to all packages
* Create CODE_OF_CONDUCT.md
* Create pull_request_template.md
* Create issue templates
* Create config.yml
* Add unit tests for errors, singleton, logger, message, modals, gchat utils, and teams markdown
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
* Add a vitest:workspace command
* Misc URL fixes
* Update CONTRIBUTING.md
* Misc fixes, upgrade workflow/serde
* Replace PII in integration test data
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-20 13:25:09 -08:00
John Pham
f371c0d951
feat(slack): add assistant_thread_started event support ( #54 )
...
* feat(slack): full Slack Assistants API support
- Route assistant_thread_started + assistant_thread_context_changed
- Add onAssistantThreadStarted + onAssistantContextChanged handlers
- Add setSuggestedPrompts, setAssistantStatus, setAssistantTitle methods
- Extend stream() for Block Kit on stop (stopBlocks)
- Bump @slack/web-api to ^7.11.0 for chatStream
- 14 integration tests
* fix: pass waitUntil to assistant thread started handlers
2026-02-19 16:18:05 -08:00
John Pham
283edba8ab
feat(slack): enable DM support ( #39 )
...
* feat(slack): enable DM support with per-thread IDs and implicit mentions
DMs now use per-message threadTs (same as channels) instead of collapsing
all DM messages into one thread. Each top-level DM starts a new conversation;
thread replies continue the same conversation.
DM messages automatically set isMention=true so bots process them without
requiring @mention — natural for 1:1 conversations.
* fix: use empty threadTs for top-level DMs, thread_ts for replies
Top-level DM messages use empty threadTs to match openDM() subscriptions.
DM thread replies use thread_ts for per-conversation isolation.
Fixes integration test replay-dm.test.ts.
* style: fix biome formatting
* test: add e2e replay tests for direct DM implicit mention
* style: fix extra blank line lint error
* test: use real recorded DM fixtures for e2e tests
2026-02-18 11:30:22 -08:00
Vishal Yathish
8c50252d00
[chat] add support for slash commands ( #50 )
...
* [chat] add support for slash commands
* add comprehensive tests
* add documentation
* adding changeset
2026-02-18 08:32:44 -08:00
Malte Ubl
446df01e75
[RFC] Add Channel abstraction as first-class citizen alongside Thread ( #46 )
...
* [chat] add Channel abstraction as first-class citizen alongside Thread
Introduces a Channel concept — the container that holds threads — enabling
channel-level operations, thread-to-channel navigation, and natural support
for threadless platforms (iMessage, WhatsApp, SMS).
Design:
- Postable base interface: shared by both Thread and Channel, providing id,
adapter, isDM, state/setState, messages (newest-first async iterator),
post, postEphemeral, startTyping, mentionUser. Enables polymorphic code
that works with either entity.
- Channel interface (extends Postable): adds name, threads() async iterator,
and fetchInfo(). ChannelImpl provides the concrete implementation with
backward message pagination, thread listing, posting, state management
(channel-state: key prefix), and workflow serialization (chat:Channel).
- Thread updates: Thread now extends Postable and gains a `channel` getter
(lazy-created, cached ChannelImpl) and a `messages` getter (newest-first
backward iterator) alongside the existing `allMessages` (oldest-first).
- Channel ID format: derived from thread IDs by dropping the thread part.
Default: first two colon-separated parts (slack:C123, gchat:spaces/ABC).
Adapters override via optional channelIdFromThreadId() method.
- Adapter interface additions (all optional): channelIdFromThreadId,
fetchChannelMessages, listThreads, fetchChannelInfo, postChannelMessage.
- Chat class: chat.channel(channelId) method creates a Channel by ID,
auto-inferring adapter from the prefix. Reviver handles chat:Channel.
- Slack adapter: implements all five channel methods using
conversations.history (vs conversations.replies for threads),
conversations.info, and chat.postMessage without thread_ts.
- Mock adapter: updated with all channel methods for testing.
- 32 new tests covering ChannelImpl, thread.channel, deriveChannelId,
and the backward messages iterator.
Usage:
// Navigate from thread to channel
const channel = thread.channel;
// Get a channel directly
const channel = chat.channel("slack:C123ABC");
// Iterate messages newest first
for await (const msg of channel.messages) { ... }
// List threads in a channel
for await (const t of channel.threads()) { ... }
// Post to channel top-level
await channel.post("Hello channel!");
TODO:
- Add replay tests for channel operations against recorded webhook data
- Implement channel methods in non-Slack adapters (GChat, Teams, Discord,
GitHub, Linear) — currently they fall back to the default/no-op behavior
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
* channel-post-sample
* Better metadata
* Fix bug
* Fixes
* Other adapters
* Fix-gchat
* Fix-discord
* Fix-discord-threads
* Discord replay
* Teams tests and fix pre-existing failures
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-02-16 17:09:51 -08:00
Vishal Yathish
417374b844
[chat] add inline select components ( #45 )
...
* [chat] add inline select components
* changeset
* adding radio buttons
* adding unit tests
* add documentation for the new components
* add replay tests
2026-02-15 17:18:53 -08:00
Vishal Yathish
f7cdd29641
[modals] enable modals from ephemeral messages ( #42 )
...
* [modals] enable modals from ephemeral messages
* add replay tests
* edit in place
2026-02-14 21:40:58 -08:00
Nicolás Montone
c7d51cb8f4
add support for privatemetadata in slack adapter ( #40 )
...
* add private metadata in chat adapter
* add test on jsx runtime
* changeset
2026-02-14 17:17:03 -08:00
Nicolás Montone
43172e7b89
formatting fix
2026-02-09 18:05:44 -08:00
Nicolás Montone
06b152abff
add multi-workspace e2e
2026-02-09 15:29:53 -08:00
Nicolás Montone
935600514e
Add multi-workspace support to slack adapter
2026-02-09 13:02:38 -08:00
Fernando Rojo
acf570ac40
Merge pull request #30 from vercel-labs/f/linear
...
feat: add Linear adapter
2026-02-06 12:42:56 -05:00
Vishal Yathish
efaa9162d3
[bugfix] slack API does not send team ID in event payload when files attached on thread start ( #28 )
...
* [slack] slack API does not send team ID in event payload when files attached on mention
* changeset
2026-02-05 17:10:29 -08:00
Fernando Rojo
154dda0965
linear
2026-02-05 19:52:12 -05:00
Fernando Rojo
1fb8fd2a50
github
2026-01-31 19:02:43 -05:00
Vishal Yathish
160f1f7d59
[chat] fetch event relatedMessage separately ( #25 )
...
* [chat] fetch event message separately
* add replay tests
* remove logs
* add changeset
* pass context between modal frames
* remove dividers
* remove unused export
2026-01-23 21:44:53 -08:00
Fernando Rojo
ce0ea536ba
readme fixes
2026-01-21 12:52:44 -05:00
Fernando Rojo
62014514fe
fix: tests in readme
2026-01-21 12:44:40 -05:00
Fernando Rojo
8073eae795
fix: lint
2026-01-21 12:23:59 -05:00
Malte Ubl
7403d64618
readme
2026-01-05 12:50:44 -08:00
Malte Ubl
b1a8d47356
README tests
2026-01-04 18:55:01 -08:00
Malte Ubl
2286214024
README updates and replay test for role mention
2026-01-04 18:40:28 -08:00
Malte Ubl
e64f13bb73
discord-ws15
2026-01-04 17:32:30 -08:00
Malte Ubl
21012ea23c
Forwarding discord via http
2026-01-04 16:29:47 -08:00
Malte Ubl
c9abd473ab
verify9
2026-01-04 13:39:37 -08:00
Malte Ubl
8fabb998f9
verify6
2026-01-04 13:25:26 -08:00
Malte Ubl
815548c39a
verify
2026-01-04 13:00:11 -08:00
Malte Ubl
50f06527e7
Add discord adapter ( #7 )
...
* Implement a discord adapter
* Integration tests
2026-01-04 12:44:34 -08:00
Malte Ubl
7e8826f9c2
Required-logger
2026-01-04 09:12:45 -08:00
Malte Ubl
4ef6e98b65
Test refactor
2026-01-03 13:48:05 -08:00
Malte Ubl
56d7c58f91
Teams original message
2026-01-03 13:33:59 -08:00
Malte Ubl
45c4f8b14d
Fix teams again7
2026-01-03 13:17:06 -08:00
Malte Ubl
0c13ed5320
Fix teams again6
2026-01-03 13:04:24 -08:00
Malte Ubl
143af459f4
Fix teams again5
2026-01-03 12:20:34 -08:00
Malte Ubl
63cc5c85f1
Replay tests for fetchMessages and allMessages
2026-01-03 10:42:49 -08:00
Malte Ubl
09bb779f70
Make only one recording entry per sha
2026-01-03 08:32:24 -08:00
Vishal Yathish
9b95317750
[chat-sdk] add support for streamed messages + example of AI bot ( #1 )
...
* [chat-sdk] add support for streamed messages + example of AI bot
* Refactor to just post AI
* Permissions
* Permissions teams
* empty
* Replay tests
* Better fake stream
* fix-slack-bug
* changeset
---------
Co-authored-by: Malte Ubl <malte.ubl@gmail.com >
2026-01-02 18:58:07 -08:00
Malte Ubl
1922517855
chat-sdk to chat director rename
2026-01-02 16:11:31 -08:00
Malte Ubl
c72b37a91f
Fix gchat actions
2026-01-02 15:40:52 -08:00
Malte Ubl
107a246fd7
Refactor replay tests
2026-01-02 14:46:23 -08:00
Malte Ubl
d2ffcc2cbe
The great rename
...
We've acquired `chat` on npm. This plan covers renaming all packages and setting up automated publishing.
| Current Name | New Name | Version |
|--------------|----------|---------|
| `chat-sdk` | `chat` | 4.0.0 |
| `@chat-sdk/slack` | `@chat-adapter/slack` | 4.0.0 |
| `@chat-sdk/gchat` | `@chat-adapter/gchat` | 4.0.0 |
| `@chat-sdk/teams` | `@chat-adapter/teams` | 4.0.0 |
| `@chat-sdk/state-memory` | `@chat-adapter/state-memory` | 4.0.0 |
| `@chat-sdk/state-redis` | `@chat-adapter/state-redis` | 4.0.0 |
| `@chat-sdk/state-ioredis` | `@chat-adapter/state-ioredis` | 4.0.0 |
1. **Main package** (`packages/chat-sdk/package.json`):
- Change `"name": "chat-sdk"` → `"name": "chat"`
- Change `"version": "0.1.0"` → `"version": "4.0.0"`
2. **Adapter packages**:
- `packages/adapter-slack/package.json`: `@chat-sdk/slack` → `@chat-adapter/slack`
- `packages/adapter-gchat/package.json`: `@chat-sdk/gchat` → `@chat-adapter/gchat`
- `packages/adapter-teams/package.json`: `@chat-sdk/teams` → `@chat-adapter/teams`
- Update all versions to `4.0.0`
- Update dependency on `chat-sdk` → `chat`
3. **State packages**:
- `packages/state-memory/package.json`: `@chat-sdk/state-memory` → `@chat-adapter/state-memory`
- `packages/state-redis/package.json`: `@chat-sdk/state-redis` → `@chat-adapter/state-redis`
- `packages/state-ioredis/package.json`: `@chat-sdk/state-ioredis` → `@chat-adapter/state-ioredis`
- Update all versions to `4.0.0`
- Update dependency on `chat-sdk` → `chat`
Update `peerDependencies` and `dependencies` in each package:
```json
// Before
"peerDependencies": {
"chat-sdk": "workspace:*"
}
// After
"peerDependencies": {
"chat": "workspace:*"
}
```
Search and replace across the codebase:
| Find | Replace |
|------|---------|
| `from "chat-sdk"` | `from "chat"` |
| `from 'chat-sdk'` | `from 'chat'` |
| `import("chat-sdk")` | `import("chat")` |
| `from "@chat-sdk/slack"` | `from "@chat-adapter/slack"` |
| `from "@chat-sdk/gchat"` | `from "@chat-adapter/gchat"` |
| `from "@chat-sdk/teams"` | `from "@chat-adapter/teams"` |
| `from "@chat-sdk/state-memory"` | `from "@chat-adapter/state-memory"` |
| `from "@chat-sdk/state-redis"` | `from "@chat-adapter/state-redis"` |
| `from "@chat-sdk/state-ioredis"` | `from "@chat-adapter/state-ioredis"` |
Update any references to old package names in:
- `pnpm-workspace.yaml`
- `turbo.json` (task filters)
- Root `package.json` scripts
1. **README.md files** in each package
2. **Examples** (`examples/nextjs-chat/`)
3. **AGENTS.md** and other docs
4. **JSDoc comments** referencing package names
1. **Install changesets**:
```bash
pnpm add -D @changesets/cli
pnpm changeset init
```
2. **Configure `.changeset/config.json`**:
```json
{
"$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json ",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"linked": [
["chat", "@chat-adapter/*"]
],
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": ["example-nextjs-chat"]
}
```
3. **Add GitHub Action** (`.github/workflows/release.yml`):
```yaml
name: Release
on:
push:
branches:
- main
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
release:
name: Release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v2
with:
version: 9
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- run: pnpm install
- run: pnpm build
- run: pnpm test
- name: Create Release Pull Request or Publish
uses: changesets/action@v1
with:
publish: pnpm changeset publish
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
```
4. **Add publish config to each package.json**:
```json
"publishConfig": {
"access": "public"
}
```
1. Run full build: `pnpm build`
2. Run typecheck: `pnpm typecheck`
3. Run lint: `pnpm lint`
4. Run tests: `pnpm test`
5. Test local linking in example app
| File | Changes |
|------|---------|
| `packages/chat-sdk/package.json` | Rename to `chat`, version 4.0.0 |
| `packages/adapter-slack/package.json` | Rename to `@chat-adapter/slack`, update deps |
| `packages/adapter-gchat/package.json` | Rename to `@chat-adapter/gchat`, update deps |
| `packages/adapter-teams/package.json` | Rename to `@chat-adapter/teams`, update deps |
| `packages/state-memory/package.json` | Rename to `@chat-adapter/state-memory`, update deps |
| `packages/state-redis/package.json` | Rename to `@chat-adapter/state-redis`, update deps |
| `packages/state-ioredis/package.json` | Rename to `@chat-adapter/state-ioredis`, update deps |
| `examples/nextjs-chat/package.json` | Update all dependencies |
| `packages/integration-tests/package.json` | Update all dependencies |
| `turbo.json` | Update package references |
| All `*.ts` files | Update import statements |
| All `README.md` files | Update package names in docs |
| `.changeset/config.json` | Create new |
| `.github/workflows/release.yml` | Create new |
1. Update all `package.json` files (names, versions, dependencies)
2. Run `pnpm install` to update lockfile
3. Update all import statements in source files
4. Update all import statements in test files
5. Update documentation
6. Set up changesets
7. Run full validation
8. Create initial changeset for 4.0.0 release
9. Commit and push
If issues arise:
1. Git revert the rename commit
2. Run `pnpm install` to restore lockfile
3. Previous npm versions remain available
2026-01-02 13:56:55 -08:00
Malte Ubl
514b0281ac
DM tests
2026-01-02 10:50:32 -08:00
Malte Ubl
494772cf73
teams-test
2026-01-02 10:35:46 -08:00
Malte Ubl
7712b529b2
teams-dm
2026-01-02 10:26:50 -08:00
Malte Ubl
a4ec15e792
replay-dm
2026-01-02 10:21:07 -08:00
Malte Ubl
3785643146
fixes
2026-01-02 06:35:14 -08:00
Malte Ubl
39270b8b5d
DM
2026-01-01 20:28:14 -08:00
Malte Ubl
da0b16fa9a
JSX
2026-01-01 19:01:37 -08:00