Nicolás Montone
5b3090a7a6
add CardLink Element ( #109 )
2026-02-25 08:05:30 -08:00
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
Malte Ubl
9affdf3a55
Make the logger optional and infer most adapter config ( #88 )
...
* Make the logger optional and infer most adapter config
* Fix init
2026-02-23 17:48:41 -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
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
John Pham
84fdddc1b6
Fix teams adapter test for actions fallback change
2026-02-12 11:00:29 -08:00
Fernando Rojo
b03cbd7130
add <LinkButton>
2026-01-21 14:54:48 -05:00
Malte Ubl
9e8f9e7425
Serde for Thread and Message ( #10 )
...
* Serde for Thread and Message
* Refactor
* serde
* message
2026-01-20 19:24:12 -08: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
ce42863fa5
Error handling
2026-01-04 09:20:12 -08:00
Malte Ubl
7e8826f9c2
Required-logger
2026-01-04 09:12:45 -08:00
Malte Ubl
0363a04dab
More refactoring
2026-01-04 08:22:30 -08:00
Malte Ubl
82440f657a
Test coverage
2026-01-04 08:05:01 -08:00
Malte Ubl
fb7c41d3a5
Refactoring duplication
2026-01-03 20:32:35 -08:00
Malte Ubl
56d7c58f91
Teams original message
2026-01-03 13:33:59 -08:00
Malte Ubl
0c13ed5320
Fix teams again6
2026-01-03 13:04:24 -08:00
Malte Ubl
9821f052e2
Fix teams again4
2026-01-03 11:37:05 -08:00
Malte Ubl
6d8039950e
Fix teams again3
2026-01-03 11:25:14 -08:00
Malte Ubl
7c2586bbcd
Fix teams again2
2026-01-03 10:58:05 -08:00
Malte Ubl
568a88590a
Fix teams again
2026-01-03 10:46:49 -08:00
Malte Ubl
63cc5c85f1
Replay tests for fetchMessages and allMessages
2026-01-03 10:42:49 -08:00
Malte Ubl
edf68fe63d
User names and teams fixes
2026-01-03 10:08:08 -08:00
Malte Ubl
1eaf7a55c1
Fix-teams
2026-01-03 09:54:33 -08:00
Malte Ubl
e8b98347d0
teams-and-gchat-bugs
2026-01-03 09:48:10 -08:00
Malte Ubl
1abaee2dcd
Teams and GChat fixes
2026-01-03 09:32:52 -08:00
Malte Ubl
0df823a7e4
Fix fetchMessages and allMessages
2026-01-03 09:12:22 -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
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
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
ec90937f5b
teams
2026-01-01 20:37:54 -08:00
Malte Ubl
67720bf7ec
fixes2
2026-01-01 19:28:01 -08:00
Malte Ubl
31b003f66a
fixes
2026-01-01 19:22:46 -08:00
Malte Ubl
da0b16fa9a
JSX
2026-01-01 19:01:37 -08:00
Malte Ubl
c75b9bc17d
features
2026-01-01 17:25:27 -08:00
Malte Ubl
39c7427b56
New properties
2026-01-01 14:19:50 -08:00
Malte Ubl
82c9e10d34
More logging
2026-01-01 13:09:42 -08:00
Malte Ubl
7e2350aaf9
test
2026-01-01 13:04:55 -08:00
Malte Ubl
e8cd04e86d
Teams thread context
2026-01-01 13:01:32 -08:00
Malte Ubl
08d740b4fc
type-safe
2026-01-01 12:27:36 -08:00
Malte Ubl
ce4baf2183
Type-safe emoji
2026-01-01 11:46:44 -08:00
Malte Ubl
092baf8fdb
Better tests
2026-01-01 09:38:22 -08:00
Malte Ubl
d696201e98
Refactor
2025-12-31 16:25:22 -08:00
Malte Ubl
2c78cc1f78
step
2025-12-31 13:22:58 -08:00
Malte Ubl
a36418732b
fix2
2025-12-22 18:45:40 -08:00
Malte Ubl
eeb393ab9f
fix
2025-12-22 18:38:02 -08:00