Commit Graph

220 Commits

Author SHA1 Message Date
github-actions[bot] 6ef8816a55 Version Packages (#100)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-26 15:07:23 -08:00
Tobias Lins 0c688a0111 Add support for telegram bot (#90)
* Add support for telegram bot

* Add support for action buttons in telegram

* Use markdown parse mode

* Add more tests

* Fix linting issues

* Fixes

* Fixes

* Don't reverse order messages for AI and always answer for telegram

* Add telegram integration test

* Update telegram.json
2026-02-26 14:10:41 -08:00
Vishal Yathish 2623a50815 [bugfix] multiple files uploaded to slack as different messages (#116) 2026-02-25 16:58:40 -08:00
Nicolás Montone 5b3090a7a6 add CardLink Element (#109) 2026-02-25 08:05:30 -08:00
Nicolás Montone 0f8503198b chat: make message dedup TTL configurable and update default ttl to 5min. (#101)
* feat(chat): make message dedup TTL configurable to prevent Slack retry duplicates

* changeset

* fix

* bump default to 5 min

* fix

* Fix: Test, JSDoc, and README all reference the old default dedupe TTL of 60,000ms after the constant was changed to 300,000ms (5 minutes), causing test failure.


This commit fixes the issue reported at packages/chat/src/chat.test.ts:140

**Bug:**

The `DEDUPE_TTL_MS` constant in `packages/chat/src/chat.ts` line 51 was changed from `60_000` (60 seconds) to `5 * 60 * 1000` (300,000 ms = 5 minutes). However, three other locations were not updated to match:

1. **Test (`chat.test.ts` line 140):** The test "should use default dedupe TTL of 60 seconds" asserts that `mockState.set` is called with `60_000` as the TTL. Since the actual code now uses `300_000`, the test fails — confirmed by running the test suite which shows 1 failed test: expected `60000` but received `300000`.

2. **JSDoc (`types.ts` line 40):** The documentation comment says "Defaults to 60000 (60 seconds)" which is incorrect — it's now 300000 (5 minutes).

3. **README.md (line 52):** The Configuration table lists the default as `60000` which is now wrong.

**Evidence:** Running `npx vitest run` shows 1 test failure out of 443 tests. After applying the fix, all 443 tests pass.

**Fix:**

1. Updated the test in `chat.test.ts`: Changed the test description from "60 seconds" to "5 minutes" and the expected value from `60_000` to `300_000`.
2. Updated the JSDoc in `types.ts`: Changed "Defaults to 60000 (60 seconds)" to "Defaults to 300000 (5 minutes)".
3. Updated the README.md: Changed the default value in the Configuration table from `60000` to `300000`.

Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Co-authored-by: NicolasMontone <montonenicolas01@gmail.com>

* fix

---------

Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
2026-02-24 17:05:30 -08:00
Malte Ubl 39888ce38d Fix teams bundling under strict ESM (#99) 2026-02-24 15:10:11 -08:00
github-actions[bot] 18b540a9cc Version Packages (#95)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-24 15:18:11 -05: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
Matthew Lewis 7d4b3c50cf feat: allow for custom install key prefix. (#92) 2026-02-24 14:22:51 -05:00
github-actions[bot] 7fb3248a31 Version Packages (#89)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-23 19:12:59 -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
github-actions[bot] 6d38779543 Version Packages (#86)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-23 14:29:17 -08:00
Vishal Yathish ce33270722 [chat] add currentMessage to serialized thread (#85)
* [chat] add currentMessage to serialized thread

* documentation

* remove

* changeset
2026-02-23 14:11:04 -08:00
github-actions[bot] 1b23565262 Version Packages (#84)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-22 19:40:32 -08:00
Malte Ubl 94ab8270be Delete listSubscriptions from state adapter. It was unused (#83) 2026-02-21 16:32:28 -08:00
Hayden Bleasel dfb2b02668 Migrate to Vercel 2026-02-20 22:07:19 -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 a79ff81bcc Callout skill 2026-02-20 20:16:03 -08:00
Hayden Bleasel 2c05318ab7 Bake docs into chat package 2026-02-20 20:02:41 -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
github-actions[bot] 4768add423 Version Packages (#72)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-20 11:21:15 -08:00
John Pham 09cdfa3f4b fix(slack,gchat): convert **bold** to *bold* in Card text blocks (#71)
* fix(slack): convert **bold** to *bold* in Card text blocks

Slack mrkdwn uses single asterisks for bold, not double.
CardText content with standard Markdown was rendering
literally instead of as bold. Applied conversion in
convertTextToBlock and convertFieldsToBlock.

* fix(gchat): convert **bold** to *bold* in Card text blocks
test(slack,gchat): add comprehensive markdown bold conversion tests

* fix: biome formatting in cards test

* add changeset

* fix: biome formatting in gchat cards test
2026-02-20 11:04:21 -08:00
github-actions[bot] 10a9b4bf9a Version Packages (#70)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-19 16:27:02 -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
github-actions[bot] c0c0b1ec6f Version Packages (#53)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-18 11:40:12 -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
github-actions[bot] 5a7a925983 Version Packages (#48)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-15 17:25: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
github-actions[bot] 25bf3765fd Version Packages (#44)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-14 21:53:20 -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
github-actions[bot] b670cb18b6 Version Packages (#41)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-14 17:23:32 -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
github-actions[bot] 34cb4cd0da Version Packages 2026-02-12 21:34:50 +00:00
John Pham b0ba19a874 Fix gchat and slack adapter test assertions 2026-02-12 11:54:20 -08:00
John Pham 8c03dd65e5 Fix actions fallback in all adapters and core package
Discord, Linear, GitHub adapters and core chat package each had
their own childToFallbackText with the same [label] pattern.
2026-02-12 11:17:55 -08:00
John Pham 84fdddc1b6 Fix teams adapter test for actions fallback change 2026-02-12 11:00:29 -08:00
John Pham 18ce1d070e Exclude actions from card fallback text
Action buttons (e.g. Cancel) were showing as [Cancel] in Slack
notification previews. The fallback text field powers notifications
and screen readers where buttons aren't actionable — strip them.
2026-02-12 10:45:04 -08:00
github-actions[bot] 5d9ce3044d Version Packages 2026-02-10 02:17:57 +00: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 5ed3ed9126 add example 2026-02-09 14:03:50 -08:00
Nicolás Montone 935600514e Add multi-workspace support to slack adapter 2026-02-09 13:02:38 -08:00
github-actions[bot] 37783fa1a5 Version Packages 2026-02-06 20:20:05 +00:00
John Pham b9abd8b3a2 fix: prevent double-wrapping of Slack mentions
The mention regex /@(\w+)/g matched @user even inside existing
<@user> format, producing <<@user>>. Slack renders the doubled
brackets as literal < > around the mention.

Add negative lookbehind (?<!<) to skip already-wrapped mentions.
2026-02-06 10:47:27 -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
github-actions[bot] 5189f6f216 Version Packages (#31)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-05 17:41:12 -08: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 8531b02f13 readme 2026-02-05 20:07:34 -05:00