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
5ed3ed9126
add example
2026-02-09 14:03:50 -08:00
Fernando Rojo
e8ec9cd901
oauth
2026-02-05 20:06:55 -05:00
Fernando Rojo
0392ad6701
linear threads
2026-02-05 19:58:09 -05:00
Fernando Rojo
154dda0965
linear
2026-02-05 19:52:12 -05:00
Fernando Rojo
284dc2830f
log
2026-01-31 22:59:23 -05:00
Fernando Rojo
0b4899c8fc
emoji support
2026-01-31 21:33:28 -05:00
Fernando Rojo
5b0f3f5a94
fixes
2026-01-31 21:24:21 -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
Vishal Yathish
e84cbf4187
[chat] add relatedThread and relatedMessage props to modal events
2026-01-22 13:19:09 -08:00
Fernando Rojo
70bca43f51
lint
2026-01-21 15:00:17 -05:00
Fernando Rojo
b03cbd7130
add <LinkButton>
2026-01-21 14:54:48 -05:00
Fernando Rojo
8073eae795
fix: lint
2026-01-21 12:23:59 -05:00
Fernando Rojo
4f2ff75070
ephemeral readme
2026-01-21 11:14:39 -05:00
Vishal Yathish
a488dbf118
[chat] add support for modals and form inputs + add to slack adapter
2026-01-20 10:20:08 -08:00
Malte Ubl
e9a540a574
Remove bad Fluid behavior
2026-01-06 08:57:22 -08:00
Malte Ubl
1efab24d53
Optimize discord listener
2026-01-06 08:28:35 -08:00
Malte Ubl
bebd470827
Role mention support
2026-01-04 18:32:15 -08:00
Malte Ubl
96c0875b29
Start discord gateway via cron
2026-01-04 17:42:12 -08:00
Malte Ubl
21012ea23c
Forwarding discord via http
2026-01-04 16:29:47 -08:00
Malte Ubl
78c27ec8f8
discord-ws3
2026-01-04 14:07:05 -08:00
Malte Ubl
8f9f0d880b
discord-ws2
2026-01-04 14:03:18 -08:00
Malte Ubl
e1d97f6af5
discord-ws
2026-01-04 13:59:41 -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
bed9113fc8
Fix teams again8
2026-01-03 13:19:54 -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
6d8039950e
Fix teams again3
2026-01-03 11:25:14 -08:00
Malte Ubl
63cc5c85f1
Replay tests for fetchMessages and allMessages
2026-01-03 10:42:49 -08:00
Malte Ubl
1abaee2dcd
Teams and GChat fixes
2026-01-03 09:32:52 -08:00
Malte Ubl
fb786253a1
Don't limit all
2026-01-03 09:16:39 -08:00
Malte Ubl
0df823a7e4
Fix fetchMessages and allMessages
2026-01-03 09:12:22 -08:00
Malte Ubl
09bb779f70
Make only one recording entry per sha
2026-01-03 08:32:24 -08:00
Malte Ubl
518d9c85c8
Fix fetchMessages in gchat
2026-01-03 08:12:17 -08:00
Malte Ubl
344f352882
log-history
2026-01-03 08:04:52 -08:00
Malte Ubl
a020b8054a
record-more
2026-01-02 19:19:25 -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
3de5ee3537
style
2026-01-02 17:21:35 -08:00
Malte Ubl
9108e32089
DX for testing
2026-01-02 17:19:09 -08:00
Malte Ubl
d0e6abef24
Skip in middleware
2026-01-02 17:10:04 -08:00
Malte Ubl
80400c0ac8
Make previews testable
2026-01-02 17:05:44 -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