Commit Graph

262 Commits

Author SHA1 Message Date
github-actions[bot] 3f881daf07 Version Packages (#186)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-06 00:01:23 -08:00
Hayden Bleasel b35bb34dd5 feat: make adapter constructors default to env vars (#182)
* Update adapter configs

* Update tests

* Add new adapter config tests

* Update index.mdx

* Update index.test.ts

* Fix polynomial regex issue

* Update index.ts

* Remove unused suppressions

* Misc fixes

* Update index.test.ts

* Update index.test.ts

* Update index.ts

* Update index.mdx

* Test and lint fixes
2026-03-05 16:29:44 -08:00
Hayden Bleasel cc65dc3111 fix: atomic message deduplication to prevent silent app_mention drops (#189)
* Add setIfNotExists

* Update chat.test.ts

* Improve tests

* Create bright-regions-dance.md
2026-03-05 16:16:03 -08:00
Hayden Bleasel d3db36ec35 fix(slack): check text value truthiness for file-only posts (#187)
* Update index.ts

* Update index.test.ts

* Create odd-news-jam.md
2026-03-05 16:15:51 -08:00
Hayden Bleasel 10b0e6b6ec fix(slack): allow file_share and other content subtypes through (#188)
* Update index.ts

* Update index.test.ts

* Create fluffy-onions-unite.md
2026-03-05 16:15:44 -08:00
Hayden Bleasel a3f8656243 Teams: support certificate and federated credentials (#190)
* Add federated auth support to Teams

* Update index.test.ts

* Create teams-certificate-federated-auth.md
2026-03-05 16:15:36 -08:00
Hayden Bleasel 5cfd9be5fa Fix JSX issues (#161)
* Fix JSX issues

* fix: add null guards for event.thread in onAction handlers

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-05 16:13:33 -08:00
Hayden Bleasel e09ce7ea4a Switch to using chatApi.media.download (#168) 2026-03-05 16:13:26 -08:00
Dardan Bujupaj 5f32506c2d fix discord thread starter root message parsing (#185)
* fix discord thread starter root message parsing

* use original thread start message as raw
2026-03-05 13:27:49 -08:00
github-actions[bot] e937e0d3dd Version Packages (#181)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-04 15:27:16 -08:00
zm2231 f27c89b424 feat(slack): streaming StreamChunk support + url_verification fix (#173)
* feat(slack): support streaming task_update, plan_update, markdown_text chunks

- Add StreamChunk type for structured streaming content
- Extend stream() to accept AsyncIterable<string | StreamChunk>
- Add taskDisplayMode option to StreamOptions
- Slack adapter passes structured chunks directly to Slack's streaming API
- Handle url_verification before signature check to prevent Slack from
  silently disabling event delivery when signing secret is misconfigured
- Add tests for StreamChunk handling in thread.post()

* review fixes: type safety, security, dedup

- Replace loose StreamChunk interface (index signature) with
  discriminated union (MarkdownTextChunk | TaskUpdateChunk | PlanUpdateChunk)
- Move url_verification back after signature check to prevent
  unauthenticated challenge responses
- Remove redundant AsyncIterable<string> from PostableMessage union
- Extract pushTextAndFlush helper to deduplicate markdown flush logic
- Remove unnecessary `as string` casts after type guards
- Export individual chunk types from package index

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* add changeset

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Hayden Bleasel <hello@haydenbleasel.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-04 11:31:30 -08:00
John Pham 130e780418 fix openModal crash when action has no thread context (#174)
* fix openModal crash when action has no thread context

Home tab actions (e.g. Change Team) have no thread → openModal closure
crashed accessing thread.channel on null. Guard thread access in the
openModal closure and pass undefined to storeModalContext.

Add test for empty threadId action → openModal works with null thread.

* add changeset

* make ActionEvent.thread nullable, remove unsafe cast

- Change `ActionEvent.thread` type from `Thread` to `Thread | null`
- Remove `null as unknown as Thread` unsafe cast in handleActionEvent
- Update test files to use null guards and optional chaining

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Hayden Bleasel <hello@haydenbleasel.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-04 11:15:33 -08:00
Utopia f0dfa4d64d fix: preserve nesting depth when rendering lists in all chat adapters (#177)
* fix: preserve nesting depth when rendering lists in all chat adapters

All format converters (Slack, Discord, Teams, Google Chat) were flattening
nested lists during Markdown→platform conversion. When a listItem had a
paragraph followed by a child list, the child list output was concatenated
directly onto the parent item's text with no indentation or separating
newline, producing garbled output like "• parent• child 1\n• child 2".

Add an optional `depth` parameter to each adapter's private `nodeToX()`
method. The `isListNode` handler now builds lines explicitly: paragraph
content is prefixed with the bullet/number at the correct indent level
(`"  ".repeat(depth)`), and nested list nodes are rendered recursively
at `depth + 1`. Sibling items at the same depth are unaffected.

Add regression tests covering:
- nested unordered lists (2 levels)
- nested ordered lists (2 levels)
- deeply nested lists (3 levels)
- flat sibling items (no regressions)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor: extract renderList() helper to eliminate dead depth parameter

The previous fix added `depth = 0` to each adapter's general nodeToX()
method, but only the isListNode branch ever used it — a dead parameter
across ~10 other branches that made the signature misleading.

Extract a private renderList(node: List, depth: number) method in each
adapter. nodeToX() stays as a clean single-argument node converter;
all depth-aware list logic lives exclusively inside renderList(), which
recurses into itself for nested lists and calls nodeToX() for leaf nodes.

Import the List type from the chat package to give renderList() an
explicit, narrowed parameter type.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Deduplicate renderList into BaseFormatConverter, fix start offset, add mixed list tests

- Extract shared renderList() into BaseFormatConverter with configurable bullet char
- Respect List.start property for ordered lists starting at non-1 values
- Remove dead isListItemNode branches from all adapters
- Add mixed ordered/unordered nesting test to all adapters

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Hayden Bleasel <hello@haydenbleasel.com>
2026-03-04 11:06:32 -08:00
Malte Ubl ff954f938b Correctly handle AI SDK stream concatenation (#170)
* Correctly handle AI SDK stream concatenation

* changset

* docs

---------

Co-authored-by: Hayden Bleasel <hello@haydenbleasel.com>
2026-03-04 11:02:02 -08:00
github-actions[bot] 0ab742c62d Version Packages (#133)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-03-04 00:32:57 -08:00
Nicolás Montone f0c7050349 add member_joined_channel event support to Slack adapter (#167)
* Add member_joined_channel event support to Slack adapter

* changset

* Apply suggestion from @NicolasMontone

* fix
2026-03-03 16:24:40 -08:00
Malte Ubl 02e7ef605c Implement markdown and AST rendering for tables across adapters (#160)
* Implement markdown and AST rendering for tables across adapters

* Render the default instead

* Fix bot app

* lint

* streaming-rendering

* fix-streaming

* fix-streaming-agent

* fix-streaming-again2

* fix-streaming-again3

* prefix tests

* no final edit

* changeset

* feedback

* lint

* Copilot feedback
2026-03-03 09:43:18 -08:00
Hayden Bleasel 73de82dbef Add remend for streaming markdown healing (#163)
* Add remend

* Create sixty-wasps-hope.md

* feat: wrap message content in markdown objects (#164)

Update 'fallbackStream' and 'handleStream' to send '{ markdown: string }'. Adjust tests for '{ markdown: string }'.

Slack-Thread: https://vercel.slack.com/archives/C08077A6JDB/p1772491650055389?thread_ts=1772491650.055389&cid=C08077A6JDB

Co-authored-by: v0 <v0[bot]@users.noreply.github.com>

---------

Co-authored-by: v0 <v0[bot]@users.noreply.github.com>
2026-03-03 07:59:58 -08:00
Hayden Bleasel 6e4b2e7a09 Fix teams adapter tests 2026-03-02 15:24:34 -08:00
Hayden Bleasel 394336fffe Update index.test.ts 2026-03-02 14:48:12 -08:00
Hayden Bleasel 8a6f0ce8fa Improve test coverage 2026-03-02 14:42:32 -08:00
Hayden Bleasel d93d5470f6 Add unit tests for newline streaming issue 2026-03-02 14:17:34 -08:00
Timo Lins 24532a715c [Telegram] Enable Telegram auto/polling mode for local bots without public webhooks (#141)
* Add Telegram auto mode polling and init username fallback

* Expose Telegram resetWebhook API

* Refine Telegram API to longPolling and safer auto mode

* Fix: Environment variable cleanup sets `process.env.VERCEL` to the string `"undefined"` (truthy) instead of removing it, leaking a truthy VERCEL env var into subsequent tests.

This commit fixes the issue reported at packages/adapter-telegram/src/index.test.ts:661

**Bug explanation:**

In the test "auto mode stays in webhook mode on serverless runtime" (line 622), the cleanup code in the `finally` block at line 662 uses `process.env.VERCEL = undefined` when the env var wasn't previously set. In Node.js, `process.env` coerces all values to strings, so `process.env.VERCEL = undefined` actually sets `process.env.VERCEL` to the string `"undefined"`. This is truthy (`Boolean("undefined")` === `true`).

This was verified empirically:
```
process.env.TEST_VAR = undefined;
typeof process.env.TEST_VAR  // "string"
process.env.TEST_VAR         // "undefined"  
Boolean(process.env.TEST_VAR) // true
```

The consequence is that after this test runs, `process.env.VERCEL` remains set to the truthy string `"undefined"`, causing `isLikelyServerlessRuntime()` to return `true` for all subsequent tests that run in the same process. This could cause any auto-mode tests that follow to incorrectly detect a serverless runtime and behave differently than expected.

**Fix explanation:**

Changed `process.env.VERCEL = undefined` to `delete process.env.VERCEL`, which properly removes the environment variable from `process.env`. After `delete`, `process.env.VERCEL` is `undefined` (the actual undefined value, not the string), and `Boolean(process.env.VERCEL)` correctly returns `false`. This matches the standard pattern for cleaning up environment variables in Node.js tests.

Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Co-authored-by: timolins <me@timo.sh>

* Fix lint: replace delete env cleanup with Reflect.deleteProperty

* Harden Telegram polling tests and polish polling docs

* Improve Telegram polling docs with clearer motivation and examples

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 23:08:00 +01:00
Hayden Bleasel da7e05d521 Fix Discord reaction events missing thread context (#158)
* Initial fix

* Add tests

* Create cute-nights-send.md

* Misc improvements
2026-03-02 13:44:00 -08:00
Peter Clement f01b92fec4 Ensure handling of Discord slash commands (#152)
* Correctly handle discord slash commands

* chore: remove unintended bot.tsx formatting churn

* tidy up

* Expand subcommand path into event.command

* Fix race condition

* Run fix

* Fix duplicate slash-context check

* Fix integration test mock

* Run fix

* Update docs

---------

Co-authored-by: Hayden Bleasel <hello@haydenbleasel.com>
2026-03-02 13:21:25 -08:00
Hayden Bleasel f6d56ea903 Fix Discord thread channel ID for reactions and delete (#135)
* Update index.ts

* Create sour-sheep-fry.md
2026-03-02 13:13:42 -08:00
Hayden Bleasel b38fda49fa Fix formatting 2026-03-02 13:10:22 -08:00
handlebauer 9522b04243 feat(chat, adapter-gchat, adapter-discord): add disabled prop to Button (#150)
* feat(chat, adapter-gchat): add disabled prop to Button

Google Chat Cards v2 natively supports `disabled` on buttons, but
`ButtonOptions` / `ButtonElement` didn't expose it. Add the prop to
the core type and thread it through the gchat adapter serializer.

Closes #149

Made-with: Cursor

* feat(adapter-discord): thread disabled prop through Discord button serializer

DiscordButton already had `disabled` in its type but convertButtonElement
never set it from ButtonElement. Wire it through so disabled buttons
render correctly on Discord too.

Made-with: Cursor
2026-03-02 12:39:16 -08:00
Hayden Bleasel aba4643bd3 Improve formatting file specificity 2026-03-01 11:04:06 -08:00
Hayden Bleasel 572ce34d2e Update index.test.ts 2026-03-01 10:52:07 -08:00
Cristoper Anderson 981650aa08 fix(teams): avoid ESM directory import for graph auth provider (#121)
* fix(teams): avoid ESM directory import for graph auth provider

* Create fix-esm-directory-import.md

* Create ESM import test

---------

Co-authored-by: Penguinistrator <cipher416@users.noreply.github.com>
Co-authored-by: Hayden Bleasel <hello@haydenbleasel.com>
2026-02-28 20:25:20 -08:00
Vincenzo Domina f5a75c9680 feat(chat): allow disabling fallback streaming placeholder (#139)
* feat(chat): allow disabling fallback streaming placeholder

Add ChatConfig options to delay initial post+edit placeholder and wait for real text before creating the streamed message. Improves ordering for Telegram and other fallback-streaming adapters.

Made-with: Cursor

* fix(chat): simplify fallback streaming placeholder

* Create fallback-streaming-placeholder.md

* Improve test

* Add new test

* Run fix

* Update streaming.mdx

---------

Co-authored-by: Hayden Bleasel <hello@haydenbleasel.com>
2026-02-28 19:18:37 -08:00
TRACTION 1a37385556 fix(discord): add Partials.Channel to gateway client for DM support (#128)
* fix(discord): add Partials.Channel to gateway client for DM support

The gateway client requests DirectMessages intent but doesn't include `Partials.Channel`, which discord.js requires to emit DM events. Without it, all DM `MessageCreate` events are silently dropped.

Signed-off-by: TRACTION <19631364+iamtraction@users.noreply.github.com>

* Create fix-discord-dm-partials.md

* Create gateway.test.ts

* Run fix

---------

Signed-off-by: TRACTION <19631364+iamtraction@users.noreply.github.com>
Co-authored-by: Hayden Bleasel <hello@haydenbleasel.com>
2026-02-28 18:58:35 -08:00
Hayden Bleasel f774c4e7b1 Run formatter 2026-02-27 10:03:36 -08:00
Hayden Bleasel b0ff46b62b Create telegram-utils.test.ts 2026-02-27 10:02:14 -08:00
Hayden Bleasel 8a9a6d2374 Upgrade vitest 2026-02-27 09:58:28 -08:00
Hayden Bleasel ac1c55ceeb Resolves #78 2026-02-27 09:24:16 -08:00
Hayden Bleasel 128d013207 Resolves #58 2026-02-27 09:17:48 -08:00
dependabot[bot] 26cdbe3c63 Bump @octokit/auth-app from 7.2.2 to 8.2.0 (#76)
Bumps [@octokit/auth-app](https://github.com/octokit/auth-app.js) from 7.2.2 to 8.2.0.
- [Release notes](https://github.com/octokit/auth-app.js/releases)
- [Commits](https://github.com/octokit/auth-app.js/compare/v7.2.2...v8.2.0)

---
updated-dependencies:
- dependency-name: "@octokit/auth-app"
  dependency-version: 8.2.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-27 09:09:54 -08:00
dependabot[bot] 301aa32c2d Bump @octokit/rest from 21.1.1 to 22.0.1 (#62)
Bumps [@octokit/rest](https://github.com/octokit/rest.js) from 21.1.1 to 22.0.1.
- [Release notes](https://github.com/octokit/rest.js/releases)
- [Commits](https://github.com/octokit/rest.js/compare/v21.1.1...v22.0.1)

---
updated-dependencies:
- dependency-name: "@octokit/rest"
  dependency-version: 22.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-27 09:05:36 -08:00
dependabot[bot] a22b14136c Bump @types/node from 22.19.3 to 25.3.0 (#79)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.19.3 to 25.3.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.3.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-27 09:01:01 -08:00
Rihan Arfan 32b17d9370 refactor: replace broad googleapis dependency with specific packages (#29)
* refactor: replace broad googleapis dependency with specific packages

* fix: reorder imports in gchat adapter

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Create tidy-groups-marry.md

---------

Co-authored-by: Hayden Bleasel <hello@haydenbleasel.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 08:49:04 -08:00
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