Commit Graph

58 Commits

Author SHA1 Message Date
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