Skip to content

Release 2.0.12: merge main into release#442

Merged
corinagum merged 20 commits into
releasefrom
cg/prep-release-2.0.12
May 27, 2026
Merged

Release 2.0.12: merge main into release#442
corinagum merged 20 commits into
releasefrom
cg/prep-release-2.0.12

Conversation

@corinagum

@corinagum corinagum commented May 27, 2026

Copy link
Copy Markdown
Contributor

Summary

Brings origin/main into release for the 2.0.12 release. No carve-outs this time — Quoted Replies (PR #321) is included.

version.json: 2.0.112.0.12.

Aligns with teams.ts/teams.net cadence.

What's in this release (delta from 2.0.11)

Features

Security & fixes

Deprecations / package changes

Dependency bumps

Quoted Replies inclusion notes

  • Teams client rendering is in-sync with the wire format as of 2026-05-06.
  • APX QR rollout completed: Public 2026-04-10, GCCH/DoD/Gallatin 2026-04-14.
  • Builder methods (prepend_quote(), add_quote()), ctx.quote(), and the quote-aware ctx.reply() behavior are all present in this release.
  • examples/quoting is included.

Conflict resolution

The 2.0.11 release branch had the QR-removed shape for four files; took main's (QR-included) version for all of them:

  • examples/targeted-messages/src/main.py
  • packages/api/src/microsoft_teams/api/activities/message/message.py
  • packages/apps/src/microsoft_teams/apps/routing/activity_context.py
  • packages/apps/tests/test_activity_context.py

version.json conflict resolved to 2.0.12.

Test plan

  • uv sync clean
  • poe check (ruff format + lint) — clean
  • poe test — 609 passed
  • pyright — 0 errors, 0 warnings
  • Pipeline build + test stages green on release after merge
  • Publish pipeline run with Public → ESRP approval → PyPI
  • pip install microsoft-teams-apps==2.0.12 smoke install

corinagum and others added 20 commits May 4, 2026 15:31
… message (#419)

Fixes #418

## Summary

`HttpStream.close()` could send the final stream message while
`_flush()` was still mid-await, causing the final message to arrive
before in-flight chunks finished sending.

This is the Python parity of
[microsoft/teams.ts#553](microsoft/teams.ts#553)
(Bug 2 only — Bug 1 from the TS PR does not affect Python; `close()`
already calls `with_channel_data()` before `add_stream_final()`).

## Root cause

`_wait_for_id_and_queue()` polled:

```python
while (self._queue or not self._id) and not self._canceled:
```

This checks the queue and `_id` but not whether `_flush()` is currently
holding `self._lock`. After the inner `while self._queue` loop drains
the queue, `_flush()` awaits `_send_activity(...)` calls under the lock.
During those awaits:

- `self._queue` is empty (drained)
- `self._id` is set (after the first chunk)
- `self._lock` is still held

The predicate becomes false, the wait exits, and `close()` proceeds to
send the final activity — racing the in-flight chunk.

## Fix

Add `self._lock.locked()` to the wait predicate. The lock primitive is
already used in `close()`'s early-return guard at line 157, so this is
consistent with existing patterns.

## Test plan

- [x] Added `test_close_waits_for_flush_to_complete` — holds
`stream._lock` manually, asserts `close()` does not send the final
message until the lock is released.
- [x] All existing http-stream tests still pass (14/14).
- [x] Full apps test suite passes (271 passed).
- [x] `poe check` passes (ruff format + lint).
## Summary

Mirrors
[microsoft/teams.ts#556](microsoft/teams.ts#556)
in this codebase.

Some valid Microsoft Entra access tokens are issued with the Azure AD v1
issuer format (`https://sts.windows.net/{tenantId}/`) instead of the v2
issuer (`https://login.microsoftonline.com/{tenantId}/v2.0`). Today
`TokenValidator.for_entra` only accepts the v2 form, causing valid v1
tokens to be rejected.

## Changes

- `packages/apps/src/microsoft_teams/apps/auth/token_validator.py`: when
a `tenant_id` is provided, `TokenValidator.for_entra` now adds both the
v2 (`{login_endpoint}/{tenant_id}/v2.0`) and v1
(`https://sts.windows.net/{tenant_id}/`) issuers to `valid_issuers`.
- `packages/apps/tests/test_token_validator.py`:
- Updated `test_for_entra_initialization` to assert both issuers are
present.
- Added `test_validate_entra_token_v1_sts_issuer` covering acceptance of
a v1 `sts.windows.net` issuer through the full validation pipeline.

Note: Unlike the TS PR, this change does not introduce multi-tenant
`allowedTenantIds` semantics, since the Python `TokenValidator` doesn't
currently expose multi-tenant configuration. The fix is kept narrowly
scoped to issuer format acceptance.

Reference:
https://learn.microsoft.com/en-us/entra/identity-platform/access-tokens

## Test plan

- `uv run pytest packages/apps/tests/test_token_validator.py -q` — all
27 tests pass, including the new v1 issuer test.
…eb (#420)

Removes [uuid](https://github.com/uuidjs/uuid). It's no longer used
after updating ancestor dependency
[@microsoft/teams.client](https://github.com/microsoft/teams.ts/tree/HEAD/packages/client).
These dependencies need to be updated together.

Removes `uuid`

Updates `@microsoft/teams.client` from 2.0.1 to 2.0.9
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/microsoft/teams.ts/releases">@​microsoft/teams.client's
releases</a>.</em></p>
<blockquote>
<h2>v2.0.8</h2>
<h2>What's Changed</h2>
<ul>
<li>Bump version to 2.0.8-preview by <a
href="https://github.com/heyitsaamir"><code>@​heyitsaamir</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/502">microsoft/teams.ts#502</a></li>
<li>Bump hono from 4.12.9 to 4.12.12 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/microsoft/teams.ts/pull/510">microsoft/teams.ts#510</a></li>
<li>Bump <code>@​hono/node-server</code> from 1.19.11 to 1.19.13 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/microsoft/teams.ts/pull/509">microsoft/teams.ts#509</a></li>
<li>Bump vite from 6.4.1 to 6.4.2 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/microsoft/teams.ts/pull/514">microsoft/teams.ts#514</a></li>
<li>Bump axios from 1.13.5 to 1.15.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/microsoft/teams.ts/pull/518">microsoft/teams.ts#518</a></li>
<li>feat: GitHub issue analysis → Teams notification workflow by <a
href="https://github.com/heyitsaamir"><code>@​heyitsaamir</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/517">microsoft/teams.ts#517</a></li>
<li>Merge User-Agent headers when cloning HTTP client by <a
href="https://github.com/heyitsaamir"><code>@​heyitsaamir</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/508">microsoft/teams.ts#508</a></li>
<li>feat: graceful stream cancellation on 403 by <a
href="https://github.com/heyitsaamir"><code>@​heyitsaamir</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/513">microsoft/teams.ts#513</a></li>
<li>Add sovereign cloud support (GCCH, DoD, China) by <a
href="https://github.com/corinagum"><code>@​corinagum</code></a> in <a
href="https://redirect.github.com/microsoft/teams.ts/pull/500">microsoft/teams.ts#500</a></li>
<li>fix: drain entire queue per flush cycle by <a
href="https://github.com/heyitsaamir"><code>@​heyitsaamir</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/520">microsoft/teams.ts#520</a></li>
<li>fix: resolve missing deps, broken JSON, type errors, and typos in
CLI templates by <a
href="https://github.com/heyitsaamir"><code>@​heyitsaamir</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/521">microsoft/teams.ts#521</a></li>
<li>feat: add missing endpoints (Paged Members, Meeting Notifs) &amp;
address client gaps by <a
href="https://github.com/lilyydu"><code>@​lilyydu</code></a> in <a
href="https://redirect.github.com/microsoft/teams.ts/pull/516">microsoft/teams.ts#516</a></li>
<li>fix: surface Graph API error body in GraphError by <a
href="https://github.com/heyitsaamir"><code>@​heyitsaamir</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/524">microsoft/teams.ts#524</a></li>
<li>fix: improve error message when app credentials are missing by <a
href="https://github.com/heyitsaamir"><code>@​heyitsaamir</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/527">microsoft/teams.ts#527</a></li>
<li>Bump hono from 4.12.12 to 4.12.14 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/microsoft/teams.ts/pull/528">microsoft/teams.ts#528</a></li>
<li>Bump version to 2.0.9-preview by <a
href="https://github.com/heyitsaamir"><code>@​heyitsaamir</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/531">microsoft/teams.ts#531</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/microsoft/teams.ts/compare/v2.0.7...v2.0.8">https://github.com/microsoft/teams.ts/compare/v2.0.7...v2.0.8</a></p>
<h2>v2.0.7</h2>
<h2>What's Changed</h2>
<ul>
<li>Bump version to 2.0.7-preview by <a
href="https://github.com/heyitsaamir"><code>@​heyitsaamir</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/486">microsoft/teams.ts#486</a></li>
<li>Add support for Shared Channels in app templates by <a
href="https://github.com/singhk97"><code>@​singhk97</code></a> in <a
href="https://redirect.github.com/microsoft/teams.ts/pull/453">microsoft/teams.ts#453</a></li>
<li>Expose Graph Client http client via public getter by <a
href="https://github.com/heyitsaamir"><code>@​heyitsaamir</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/489">microsoft/teams.ts#489</a></li>
<li>Bump handlebars from 4.7.8 to 4.7.9 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/microsoft/teams.ts/pull/490">microsoft/teams.ts#490</a></li>
<li>Bump yaml from 2.8.2 to 2.8.3 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/microsoft/teams.ts/pull/491">microsoft/teams.ts#491</a></li>
<li>Fix HttpServer breaking Azure App Service named pipe ports by <a
href="https://github.com/heyitsaamir"><code>@​heyitsaamir</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/488">microsoft/teams.ts#488</a></li>
<li>Update Adaptive Cards package by <a
href="https://github.com/corinagum"><code>@​corinagum</code></a> in <a
href="https://redirect.github.com/microsoft/teams.ts/pull/476">microsoft/teams.ts#476</a></li>
<li>Add cancellation token to OnMessage handler in Program.cs template
by <a href="https://github.com/rido-min"><code>@​rido-min</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/499">microsoft/teams.ts#499</a></li>
<li>Fix ExpressAdapter to accept Express app directly by <a
href="https://github.com/heyitsaamir"><code>@​heyitsaamir</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/504">microsoft/teams.ts#504</a></li>
<li>Add OpenDialogData and SubmitData convenience wrappers by <a
href="https://github.com/corinagum"><code>@​corinagum</code></a> in <a
href="https://redirect.github.com/microsoft/teams.ts/pull/498">microsoft/teams.ts#498</a></li>
<li>Release 2.0.7 by <a
href="https://github.com/heyitsaamir"><code>@​heyitsaamir</code></a> in
<a
href="https://redirect.github.com/microsoft/teams.ts/pull/501">microsoft/teams.ts#501</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/microsoft/teams.ts/compare/v2.0.6...v2.0.7">https://github.com/microsoft/teams.ts/compare/v2.0.6...v2.0.7</a></p>
<h2>v2.0.6</h2>
<p>This release has been building up for a while! We are hoping to get
back into a regular groove of release features and fixes once more.</p>
<p>New Features</p>
<ul>
<li>HttpServer — New built-in HTTP server, begins deprecating HttpPlugin
(<a
href="https://github.com/microsoft/teams.ts/tree/HEAD/packages/client/issues/433">#433</a>)</li>
<li>Targeted Messages — Experimental (<a
href="https://github.com/microsoft/teams.ts/tree/HEAD/packages/client/issues/443">#443</a>,
<a
href="https://github.com/microsoft/teams.ts/tree/HEAD/packages/client/issues/449">#449</a>,
<a
href="https://github.com/microsoft/teams.ts/tree/HEAD/packages/client/issues/468">#468</a>,
<a
href="https://github.com/microsoft/teams.ts/tree/HEAD/packages/client/issues/477">#477</a>)</li>
<li>Reactions — Message reaction support (<a
href="https://github.com/microsoft/teams.ts/tree/HEAD/packages/client/issues/452">#452</a>)</li>
<li>signin/failure handling — New invoke activity for sign-in failures
(<a
href="https://github.com/microsoft/teams.ts/tree/HEAD/packages/client/issues/459">#459</a>)</li>
<li>Configurable messaging endpoint path (<a
href="https://github.com/microsoft/teams.ts/tree/HEAD/packages/client/issues/483">#483</a>)</li>
<li>Overridable base service URL for API Client (<a
href="https://github.com/microsoft/teams.ts/tree/HEAD/packages/client/issues/435">#435</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/microsoft/teams.ts/blob/main/packages/client/CHANGELOG.md">@​microsoft/teams.client's
changelog</a>.</em></p>
<blockquote>
<h1><code>@​microsoft/teams</code>.client</h1>
<h2>2.0.5</h2>
<h3>Patch Changes</h3>
<ul>
<li>Bug fixes and minor improvements</li>
<li>Updated dependencies
<ul>
<li><code>@​microsoft/teams</code>[email protected]</li>
<li><code>@​microsoft/teams</code>[email protected]</li>
<li><code>@​microsoft/teams</code>[email protected]</li>
</ul>
</li>
</ul>
<h2>2.0.4</h2>
<h3>Patch Changes</h3>
<ul>
<li>Fix backward compat issue with TokenCredentials</li>
<li>Updated dependencies
<ul>
<li><code>@​microsoft/teams</code>[email protected]</li>
<li><code>@​microsoft/teams</code>[email protected]</li>
<li><code>@​microsoft/teams</code>[email protected]</li>
</ul>
</li>
</ul>
<h2>2.0.3</h2>
<h3>Patch Changes</h3>
<ul>
<li>Regional oauth support, additional auth mechanisms support, resync
graph endpoints</li>
<li>Updated dependencies
<ul>
<li><code>@​microsoft/teams</code>[email protected]</li>
<li><code>@​microsoft/teams</code>[email protected]</li>
<li><code>@​microsoft/teams</code>[email protected]</li>
</ul>
</li>
</ul>
<h2>2.0.2</h2>
<h3>Patch Changes</h3>
<ul>
<li>Number of bug fixes and CLI improvements</li>
<li>Updated dependencies
<ul>
<li><code>@​microsoft/teams</code>[email protected]</li>
<li><code>@​microsoft/teams</code>[email protected]</li>
<li><code>@​microsoft/teams</code>[email protected]</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/microsoft/teams.ts/commits/HEAD/packages/client">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~microsoft1es">microsoft1es</a>, a new
releaser for <code>@​microsoft/teams</code>.client since your current
version.</p>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/microsoft/teams.py/network/alerts).

</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
<img width="800" height="234" alt="image"
src="https://github.com/user-attachments/assets/3b28b69a-346d-4610-8c24-a313fd26f488"
/>

- Add `QuotedReplyEntity` Pydantic model with nested `QuotedReplyData`
(`message_id` required,
`sender_id`/`sender_name`/`preview`/`time`/`is_reply_deleted`/`validated_message_reference`
optional); register in Entity union
- Add `get_quoted_messages()` on `MessageActivity` to read inbound
quoted reply entities
- Add `add_quoted_reply(message_id, response?)` builder on
`MessageActivityInput`
- Update `reply()` to stamp` QuotedReplyEntity + <quoted
messageId="..."/>` placeholder instead of blockquote HTML; remove
`reply_to_id` assignment
- Add `quote_reply()` on `ActivityContext`
- Mark all quoted reply types and methods as `@experimental`
- Add quoted-replies example exercising all APIs

---------

Co-authored-by: Corina Gum <>
Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
Bumps [microsoft-kiota-http](https://github.com/microsoft/kiota-python)
from 1.9.7 to 1.9.9.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/microsoft/kiota-python/releases">microsoft-kiota-http's
releases</a>.</em></p>
<blockquote>
<h2>microsoft-kiota-http: v1.9.9</h2>
<h2><a
href="https://github.com/microsoft/kiota-python/compare/microsoft-kiota-http-v1.9.8...microsoft-kiota-http-v1.9.9">1.9.9</a>
(2026-03-02)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>add header removal handler (<a
href="https://github.com/microsoft/kiota-python/commit/d066e9c8accf75cc15866f415d6ac1891653441c">d066e9c</a>)</li>
<li>add header removal handler (<a
href="https://github.com/microsoft/kiota-python/commit/67bb784b0794072b7a97d40bc1454c5a8ee3e414">67bb784</a>)</li>
<li>add header removal handler (<a
href="https://github.com/microsoft/kiota-python/commit/44e8d940bb6d6284b2eee67a01b5bdd31f7e9e5c">44e8d94</a>)</li>
<li>add header removal handler (<a
href="https://github.com/microsoft/kiota-python/commit/b64ec6e584baee40fa2f99a1dc4984fc9b98a56b">b64ec6e</a>)</li>
<li>add header removal handler (<a
href="https://github.com/microsoft/kiota-python/commit/648d31b4fb1848330da58641eb8de9c14c8f7206">648d31b</a>)</li>
<li>add header removal handler (<a
href="https://github.com/microsoft/kiota-python/commit/9700ed9d6b8715e9a87f7842e4db84af0cf682fe">9700ed9</a>)</li>
</ul>
<h2>microsoft-kiota-http: v1.9.8</h2>
<h2><a
href="https://github.com/microsoft/kiota-python/compare/microsoft-kiota-http-v1.9.7...microsoft-kiota-http-v1.9.8">1.9.8</a>
(2025-12-29)</h2>
<h3>Miscellaneous Chores</h3>
<ul>
<li><strong>microsoft-kiota-http:</strong> Synchronize microsoft-kiota
versions</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/microsoft/kiota-python/commit/6a723f70304ee84cfc668c5d4e886585be79f03f"><code>6a723f7</code></a>
Merge pull request <a
href="https://redirect.github.com/microsoft/kiota-python/issues/513">#513</a>
from microsoft/release-please--branches--main</li>
<li><a
href="https://github.com/microsoft/kiota-python/commit/00449ceb2ae57cae8f94531268c565c08cc6422c"><code>00449ce</code></a>
chore: release main</li>
<li><a
href="https://github.com/microsoft/kiota-python/commit/d066e9c8accf75cc15866f415d6ac1891653441c"><code>d066e9c</code></a>
Merge pull request <a
href="https://redirect.github.com/microsoft/kiota-python/issues/511">#511</a>
from microsoft/cobando/fix-redirect-vulnerability</li>
<li><a
href="https://github.com/microsoft/kiota-python/commit/67bb784b0794072b7a97d40bc1454c5a8ee3e414"><code>67bb784</code></a>
no sonar warnings added</li>
<li><a
href="https://github.com/microsoft/kiota-python/commit/44e8d940bb6d6284b2eee67a01b5bdd31f7e9e5c"><code>44e8d94</code></a>
fix linter issues</li>
<li><a
href="https://github.com/microsoft/kiota-python/commit/b64ec6e584baee40fa2f99a1dc4984fc9b98a56b"><code>b64ec6e</code></a>
updating func to only use 2 instead of 3 params</li>
<li><a
href="https://github.com/microsoft/kiota-python/commit/648d31b4fb1848330da58641eb8de9c14c8f7206"><code>648d31b</code></a>
adding port condition</li>
<li><a
href="https://github.com/microsoft/kiota-python/commit/9700ed9d6b8715e9a87f7842e4db84af0cf682fe"><code>9700ed9</code></a>
Adding header removal handler</li>
<li><a
href="https://github.com/microsoft/kiota-python/commit/f0a220dee8d0b6e00b93cfe6cfd0852a03924326"><code>f0a220d</code></a>
Merge pull request <a
href="https://redirect.github.com/microsoft/kiota-python/issues/510">#510</a>
from microsoft/ci/release-please-dispatch</li>
<li><a
href="https://github.com/microsoft/kiota-python/commit/8362bf5a0ede7ceec584d111cca8ca425df1564c"><code>8362bf5</code></a>
ci: adds workflow dispatch to release please</li>
<li>Additional commits viewable in <a
href="https://github.com/microsoft/kiota-python/compare/microsoft-kiota-http-v1.9.7...microsoft-kiota-http-v1.9.9">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=microsoft-kiota-http&package-manager=uv&previous-version=1.9.7&new-version=1.9.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/microsoft/teams.py/network/alerts).

</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [python-multipart](https://github.com/Kludex/python-multipart)
from 0.0.26 to 0.0.27.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/Kludex/python-multipart/releases">python-multipart's
releases</a>.</em></p>
<blockquote>
<h2>0.0.27</h2>
<h2>What's Changed</h2>
<ul>
<li>Pass parse offsets via constructors by <a
href="https://github.com/Kludex"><code>@​Kludex</code></a> in <a
href="https://redirect.github.com/Kludex/python-multipart/pull/268">Kludex/python-multipart#268</a></li>
<li>Add multipart header limits by <a
href="https://github.com/Kludex"><code>@​Kludex</code></a> in <a
href="https://redirect.github.com/Kludex/python-multipart/pull/267">Kludex/python-multipart#267</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/Kludex/python-multipart/compare/0.0.26...0.0.27">https://github.com/Kludex/python-multipart/compare/0.0.26...0.0.27</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/Kludex/python-multipart/blob/main/CHANGELOG.md">python-multipart's
changelog</a>.</em></p>
<blockquote>
<h2>0.0.27 (2026-04-27)</h2>
<ul>
<li>Add multipart header limits <a
href="https://redirect.github.com/Kludex/python-multipart/pull/267">#267</a>.</li>
<li>Pass parse offsets via constructors <a
href="https://redirect.github.com/Kludex/python-multipart/pull/268">#268</a>.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/Kludex/python-multipart/commit/6d1d6892a6b01b25da6f3e7b097e8e06c57fb250"><code>6d1d689</code></a>
Version 0.0.27 (<a
href="https://redirect.github.com/Kludex/python-multipart/issues/272">#272</a>)</li>
<li><a
href="https://github.com/Kludex/python-multipart/commit/0b10220b1555af068a2bc8b198022b1ae238200f"><code>0b10220</code></a>
Run CI on main branch pull requests (<a
href="https://redirect.github.com/Kludex/python-multipart/issues/271">#271</a>)</li>
<li><a
href="https://github.com/Kludex/python-multipart/commit/3e64f5f8caba0e5d391b0c1ad0f1c2edf9e8f911"><code>3e64f5f</code></a>
Add multipart header limits (<a
href="https://redirect.github.com/Kludex/python-multipart/issues/267">#267</a>)</li>
<li><a
href="https://github.com/Kludex/python-multipart/commit/eb109cc4eb8174f2a7efc1ba894b1bf6425c0b14"><code>eb109cc</code></a>
Pass parse offsets via constructors (<a
href="https://redirect.github.com/Kludex/python-multipart/issues/268">#268</a>)</li>
<li><a
href="https://github.com/Kludex/python-multipart/commit/78e29abb9a339598975beee093a770ec3033f76d"><code>78e29ab</code></a>
Bump pytest from 9.0.2 to 9.0.3 (<a
href="https://redirect.github.com/Kludex/python-multipart/issues/266">#266</a>)</li>
<li><a
href="https://github.com/Kludex/python-multipart/commit/b2ddd0982bdf0fe852e4f3baa12122d2827af46c"><code>b2ddd09</code></a>
fuzz: Enhance fuzzing capabilities with new chunked and boundary tests
(<a
href="https://redirect.github.com/Kludex/python-multipart/issues/264">#264</a>)</li>
<li>See full diff in <a
href="https://github.com/Kludex/python-multipart/compare/0.0.26...0.0.27">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=python-multipart&package-manager=uv&previous-version=0.0.26&new-version=0.0.27)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/microsoft/teams.py/network/alerts).

</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Prompt preview allows a bot to reference the original targeted message
in its reply, so Teams can render a collapsible preview of the user's
prompt.

When a bot replies to a targeted message (reactive scenarios), the SDK
now passes the original message's messageId via a targetedMessageInfo
entity in the activity's entities array.

For proactive replies, developers can attach the entity themselves with
the messageId of the targeted message.
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.6.3 to 2.7.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/urllib3/urllib3/releases">urllib3's
releases</a>.</em></p>
<blockquote>
<h2>2.7.0</h2>
<h2>🚀 urllib3 is fundraising for HTTP/2 support</h2>
<p><a
href="https://sethmlarson.dev/urllib3-is-fundraising-for-http2-support">urllib3
is raising ~$40,000 USD</a> to release HTTP/2 support and ensure
long-term sustainable maintenance of the project after a sharp decline
in financial support. If your company or organization uses Python and
would benefit from HTTP/2 support in Requests, pip, cloud SDKs, and
thousands of other projects <a
href="https://opencollective.com/urllib3">please consider contributing
financially</a> to ensure HTTP/2 support is developed sustainably and
maintained for the long-haul.</p>
<p>Thank you for your support.</p>
<h2>Security</h2>
<p>Addressed high-severity security issues. Impact was limited to
specific use cases detailed in the accompanying advisories; overall user
exposure was estimated to be marginal.</p>
<ul>
<li>
<p>Decompression-bomb safeguards of the streaming API were bypassed:</p>
<ol>
<li>When <code>HTTPResponse.drain_conn()</code> was called after the
response had been read and decompressed partially. (Reported by <a
href="https://github.com/Cycloctane"><code>@​Cycloctane</code></a>)</li>
<li>During the second <code>HTTPResponse.read(amt=N)</code> or
<code>HTTPResponse.stream(amt=N)</code> call when the response was
decompressed using the official <a
href="https://pypi.org/project/brotli/">Brotli</a> library. (Reported by
<a
href="https://github.com/kimkou2024"><code>@​kimkou2024</code></a>)</li>
</ol>
<p>See GHSA-mf9v-mfxr-j63j for details.</p>
</li>
<li>
<p>HTTP pools created using
<code>ProxyManager.connection_from_url</code> did not strip sensitive
headers specified in <code>Retry.remove_headers_on_redirect</code> when
redirecting to a different host. (GHSA-qccp-gfcp-xxvc reported by <a
href="https://github.com/christos-spearbit"><code>@​christos-spearbit</code></a>)</p>
</li>
</ul>
<h2>Deprecations and Removals</h2>
<ul>
<li>Used <code>FutureWarning</code> instead of
<code>DeprecationWarning</code> for better visibility of existing
deprecation notices. Rescheduled the removal of deprecated features to
version 3.0. (<a
href="https://redirect.github.com/urllib3/urllib3/issues/3763">urllib3/urllib3#3763</a>)</li>
<li>Removed support for end-of-life Python 3.9. (<a
href="https://redirect.github.com/urllib3/urllib3/issues/3720">urllib3/urllib3#3720</a>)</li>
<li>Removed support for end-of-life PyPy3.10. (<a
href="https://redirect.github.com/urllib3/urllib3/issues/4979">urllib3/urllib3#4979</a>)</li>
<li>Bumped the minimum supported pyOpenSSL version to 19.0.0. (<a
href="https://redirect.github.com/urllib3/urllib3/issues/3777">urllib3/urllib3#3777</a>)</li>
</ul>
<h2>Bugfixes</h2>
<ul>
<li>Fixed a bug where <code>HTTPResponse.read(amt=None)</code> was
ignoring decompressed data buffered from previous partial reads. (<a
href="https://redirect.github.com/urllib3/urllib3/issues/3636">urllib3/urllib3#3636</a>)</li>
<li>Fixed a bug where <code>HTTPResponse.read()</code> could cache only
part of the response after a partial read when
<code>cache_content=True</code>. (<a
href="https://redirect.github.com/urllib3/urllib3/issues/4967">urllib3/urllib3#4967</a>)</li>
<li>Fixed <code>HTTPResponse.stream()</code> and
<code>HTTPResponse.read_chunked()</code> to handle <code>amt=0</code>.
(<a
href="https://redirect.github.com/urllib3/urllib3/issues/3793">urllib3/urllib3#3793</a>)</li>
<li>Updated <code>_TYPE_BODY</code> type alias to include missing
<code>Iterable[str]</code>, matching the documented and runtime behavior
of chunked request bodies. (<a
href="https://redirect.github.com/urllib3/urllib3/issues/3798">urllib3/urllib3#3798</a>)</li>
<li>Fixed <code>LocationParseError</code> when paths resembling
schemeless URIs were passed to
<code>HTTPConnectionPool.urlopen()</code>. (<a
href="https://redirect.github.com/urllib3/urllib3/issues/3352">urllib3/urllib3#3352</a>)</li>
<li>Fixed <code>BaseHTTPResponse.readinto()</code> type annotation to
accept <code>memoryview</code> in addition to <code>bytearray</code>,
matching the <code>io.RawIOBase.readinto</code> contract and enabling
use with <code>io.BufferedReader</code> without type errors. (<a
href="https://redirect.github.com/urllib3/urllib3/issues/3764">urllib3/urllib3#3764</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/urllib3/urllib3/blob/main/CHANGES.rst">urllib3's
changelog</a>.</em></p>
<blockquote>
<h1>2.7.0 (2026-05-07)</h1>
<h2>Security</h2>
<p>Addressed high-severity security issues.
Impact was limited to specific use cases detailed in the accompanying
advisories; overall user exposure was estimated to be marginal.</p>
<ul>
<li>
<p>Decompression-bomb safeguards of the streaming API were bypassed:</p>
<ol>
<li>When <code>HTTPResponse.drain_conn()</code> was called after the
response had been
read and decompressed partially.</li>
<li>During the second <code>HTTPResponse.read(amt=N)</code> or
<code>HTTPResponse.stream(amt=N)</code> call when the response was
decompressed
using the official <code>Brotli
&lt;https://pypi.org/project/brotli/&gt;</code>__ library.</li>
</ol>
<p>See <code>GHSA-mf9v-mfxr-j63j
&lt;https://github.com/urllib3/urllib3/security/advisories/GHSA-mf9v-mfxr-j63j&gt;</code>__
for details.</p>
</li>
<li>
<p>HTTP pools created using
<code>ProxyManager.connection_from_url</code> did not strip
sensitive headers specified in
<code>Retry.remove_headers_on_redirect</code> when
redirecting to a different host.
(<code>GHSA-qccp-gfcp-xxvc
&lt;https://github.com/urllib3/urllib3/security/advisories/GHSA-qccp-gfcp-xxvc&gt;</code>__)</p>
</li>
</ul>
<h2>Deprecations and Removals</h2>
<ul>
<li>Used <code>FutureWarning</code> instead of
<code>DeprecationWarning</code> for better
visibility of existing deprecation notices. Rescheduled the removal of
deprecated features to version 3.0.
(<code>[#3763](urllib3/urllib3#3763)
&lt;https://github.com/urllib3/urllib3/issues/3763&gt;</code>__)</li>
<li>Removed support for end-of-life Python 3.9.
(<code>[#3720](urllib3/urllib3#3720)
&lt;https://github.com/urllib3/urllib3/issues/3720&gt;</code>__)</li>
<li>Removed support for end-of-life PyPy3.10.
(<code>[#4979](urllib3/urllib3#4979)
&lt;https://github.com/urllib3/urllib3/issues/4979&gt;</code>__)</li>
<li>Bumped the minimum supported pyOpenSSL version to 19.0.0.
(<code>[#3777](urllib3/urllib3#3777)
&lt;https://github.com/urllib3/urllib3/issues/3777&gt;</code>__)</li>
</ul>
<h2>Bugfixes</h2>
<ul>
<li>Fixed a bug where <code>HTTPResponse.read(amt=None)</code> was
ignoring decompressed
data buffered from previous partial reads.
(<code>[#3636](urllib3/urllib3#3636)
&lt;https://github.com/urllib3/urllib3/issues/3636&gt;</code>__)</li>
<li>Fixed a bug where <code>HTTPResponse.read()</code> could cache only
part of the
response after a partial read when <code>cache_content=True</code>.</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/urllib3/urllib3/commit/9a950b92d999f906b6020bb2d1076ee56cddd5d2"><code>9a950b9</code></a>
Release 2.7.0</li>
<li><a
href="https://github.com/urllib3/urllib3/commit/5ec0de499b9166ca71c65ab04f2a7e4eb0d66fcc"><code>5ec0de4</code></a>
Merge commit from fork</li>
<li><a
href="https://github.com/urllib3/urllib3/commit/2bdcc44d1e163fb5cc48a8662425e35e15adfe6a"><code>2bdcc44</code></a>
Merge commit from fork</li>
<li><a
href="https://github.com/urllib3/urllib3/commit/f45b0df09d8620ac6ed0491eb9362c8c87b7bc2c"><code>f45b0df</code></a>
Fix a misleading example for <code>ProxyManager</code> (<a
href="https://redirect.github.com/urllib3/urllib3/issues/4970">#4970</a>)</li>
<li><a
href="https://github.com/urllib3/urllib3/commit/577193ca029872384f82c133449e0935f6d8a64b"><code>577193c</code></a>
Switch to nightly PyPy3.11 in CI for now (<a
href="https://redirect.github.com/urllib3/urllib3/issues/4984">#4984</a>)</li>
<li><a
href="https://github.com/urllib3/urllib3/commit/e90af45bb006c3a452a3a21644a2681523f5c7fc"><code>e90af45</code></a>
Avoid infinite loop in <code>HTTPResponse.read_chunked</code> when
<code>amt=0</code> (<a
href="https://redirect.github.com/urllib3/urllib3/issues/4974">#4974</a>)</li>
<li><a
href="https://github.com/urllib3/urllib3/commit/67ed74fdaec6659a6534621ec8e3aaaa6f976210"><code>67ed74f</code></a>
Bump dev dependencies (<a
href="https://redirect.github.com/urllib3/urllib3/issues/4972">#4972</a>)</li>
<li><a
href="https://github.com/urllib3/urllib3/commit/3abd481097b54d87b574ac7ea593c3f40938a84d"><code>3abd481</code></a>
Upgrade mypy to version 1.20.2 (<a
href="https://redirect.github.com/urllib3/urllib3/issues/4978">#4978</a>)</li>
<li><a
href="https://github.com/urllib3/urllib3/commit/2b8725dfcac4f21d4d93cc0cc3a64a33af08f890"><code>2b8725d</code></a>
Drop support for EOL PyPy3.10 (<a
href="https://redirect.github.com/urllib3/urllib3/issues/4979">#4979</a>)</li>
<li><a
href="https://github.com/urllib3/urllib3/commit/2944b2a0a6c573f5548a39cfd17196f98ee21b33"><code>2944b2a</code></a>
Upgrade <code>setup-chrome</code> and <code>setup-firefox</code> to fix
warnings (<a
href="https://redirect.github.com/urllib3/urllib3/issues/4973">#4973</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/urllib3/urllib3/compare/2.6.3...2.7.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=urllib3&package-manager=uv&previous-version=2.6.3&new-version=2.7.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/microsoft/teams.py/network/alerts).

</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
## Summary

Removes the `@experimental("ExperimentalTeamsReactions")` decorator and
the `.. warning:: Preview` docstring from `ReactionClient`. The
reactions feature is in sync across all three SDKs and the Teams service
— no longer preview.

Also fixes the sample's `unreact` command, which previously called
`ctx.api.reactions.delete()` on an incoming message that had no
reaction. It now adds the reaction first, waits 2 seconds, then deletes
— so the demo visibly shows the full add/delete cycle.

## Cross-SDK coordination

Part of the cross-SDK Reactions-GA pass. Sibling PRs:
- microsoft/teams.ts — Mark reactions API as GA
- microsoft/teams.net — Mark reactions API as GA (Libraries + core)
- microsoft/teams-sdk — drop .NET opt-in tip from the reactions guide

## Test plan

- [x] `uv run ruff check` — all checks passed
- [x] `uv run ruff format --check` — 403 files already formatted
- [x] `uv run pyright` — 0 errors, 0 warnings
- [x] `uv run pytest` — 596 passed
- [ ] Smoke run of `examples/reactions` showing the cycle in Teams

## Versioning

No `version.json` change in this PR. Bump happens as part of the release
flow per RELEASE.md.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Updates the `targeted-messages` example to demonstrate the
slash-commands opt-in per the docs spec (microsoft/teams-sdk#2843,
MicrosoftDocs/msteams-docs#14182).

## Changes

- **`examples/targeted-messages/appPackage/manifest.json` (new)** —
shipped at `manifestVersion: "devPreview"` because the slash-commands
opt-in fields are only defined in the devPreview schema today:
- `bots[].supportsTargetedMessages: true` opts the bot into receiving
slash-command-style targeted messages.
- `bots[].commandLists[].triggers: ["slash"]` declares `test send` /
`test update` / `test delete` / `test public` / `test inbound` as slash
commands surfaced in the Teams `/` picker (scoped to `team` and
`groupChat`).
- **`.gitignore`** — narrowly-scoped exception so this one example's
manifest can be tracked. The general `examples/**/appPackage/` exclusion
remains in place for other examples.
- **`examples/targeted-messages/src/main.py`** — new `test inbound`
handler that reads `activity.recipient.is_targeted` and reports whether
the inbound message was delivered as a targeted message (the signal
slash commands arrive with).
- **`examples/targeted-messages/README.md`** — refreshed commands table,
new "Manifest configuration" section documenting the new fields.

## Test plan

- [x] `python3 -m py_compile examples/targeted-messages/src/main.py`
clean
- [x] `pyright examples/targeted-messages/src/main.py` clean
- [x] `examples/targeted-messages/appPackage/manifest.json` validates
against the Teams devPreview schema (placeholder `${{...}}` tokens
excepted)
- [x] Sample bot's `test inbound` handler verified live in Teams:
broadcast branch fires when the inbound is not targeted (the targeted
branch will fire once slash commands start delivering with
`recipient.is_targeted = True`)

🤖 Generated with [Claude Code](https://claude.com/claude-code)
…ion (#425)

## Summary
- Add a warn-level log on the missing-or-malformed Bearer token branch,
replacing a previously silent 401.
- Cross-SDK consistency fix: same diagnostic gap exists in teams.ts
(companion PR: microsoft/teams.ts#568).

## Test plan
- [x] `uv run poe check` (ruff format + ruff check, all pass)
- [x] `uv run pyright src/microsoft_teams/apps/http/http_server.py` (0
errors)
- [x] `uv run poe test` (580/580 pass)
- [ ] Reviewer eyeball: confirm log message wording

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
Bumps [idna](https://github.com/kjd/idna) from 3.11 to 3.15.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/kjd/idna/blob/master/HISTORY.md">idna's
changelog</a>.</em></p>
<blockquote>
<h2>3.15 (2026-05-12)</h2>
<ul>
<li>Enforce DNS-length cap on individual labels early in
<code>check_label</code>,
short-circuiting contextual-rule processing for oversized input
while staying compatible with UTS 46 usage.</li>
<li>Tidy core helpers: hoist bidi category sets to module-level
frozensets (avoiding per-codepoint list construction), simplify
length checks, and reuse the shared <code>_unicode_dots_re</code> from
<code>idna.core</code> in the codec module.</li>
<li>Use <code>raise ... from err</code> for proper exception chaining
and
switch internal string formatting to f-strings.</li>
<li>Allow <code>flit_core</code> 4.x in the build backend.</li>
<li>Expand the ruff lint set (flake8-bugbear, flake8-simplify,
pyupgrade, perflint) and apply the surfaced fixes; pin lint CI
to Python 3.14.</li>
<li>Add Dependabot configuration for GitHub Actions.</li>
<li>Convert README and HISTORY from reStructuredText to Markdown.</li>
<li>Reference CVE-2026-45409 for the 3.14 advisory in place of the
initial GHSA identifier.</li>
</ul>
<p>Thanks to Felix Yan, Stan Ulbrych, and metsw24-max for
contributions to this release.</p>
<h2>3.14 (2026-05-10)</h2>
<ul>
<li>Removed opportunity to process long inputs into quadratic
time by rejecting oversize inputs up-front. Closes a bypass
of the CVE-2024-3651 mitigation. [CVE-2026-45409]</li>
</ul>
<p>Thanks to Stan Ulbrych for reporting the issue.</p>
<h2>3.13 (2026-04-22)</h2>
<ul>
<li>Correct classification error for codepoint U+A7F1</li>
</ul>
<h2>3.12 (2026-04-21)</h2>
<ul>
<li>Update to Unicode 17.0.0.</li>
<li>Issue a deprecation warning for the transitional argument.</li>
<li>Added lazy-loading to provide some performance improvements.</li>
<li>Removed vestiges of code related to Python 2 support, including
segmentation of data structures specific to Jython.</li>
</ul>
<p>Thanks to Rodrigo Nogueira for contributions to this release.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/kjd/idna/commit/af30a092e158181d0b35ac66dfa813788126bdd8"><code>af30a09</code></a>
Release 3.15</li>
<li><a
href="https://github.com/kjd/idna/commit/30314d4628744ca14cf2b5820564e5127a9f86f2"><code>30314d4</code></a>
Pre-release 3.15rc0</li>
<li><a
href="https://github.com/kjd/idna/commit/05d4b219aa9eddc47371fcbd2000f0301016f3e9"><code>05d4b21</code></a>
Merge pull request <a
href="https://redirect.github.com/kjd/idna/issues/237">#237</a> from
kjd/convert-docs-to-markdown</li>
<li><a
href="https://github.com/kjd/idna/commit/2987fdba1962bbb2358399e0084ba062b98a0bee"><code>2987fdb</code></a>
Convert README and HISTORY from reStructuredText to Markdown</li>
<li><a
href="https://github.com/kjd/idna/commit/59fa8002d514bf4a5ce7b58f67b9ec587d53fa9c"><code>59fa800</code></a>
Merge pull request <a
href="https://redirect.github.com/kjd/idna/issues/236">#236</a> from
kjd/dependabot/github_actions/actions-f3e34333ea</li>
<li><a
href="https://github.com/kjd/idna/commit/def69834ced5d4b3c50439d8b99c4c856ec19ca2"><code>def6983</code></a>
Merge branch 'master' into
dependabot/github_actions/actions-f3e34333ea</li>
<li><a
href="https://github.com/kjd/idna/commit/bbd8004a797185d8c56bb555cd5c88fde05e0631"><code>bbd8004</code></a>
Merge pull request <a
href="https://redirect.github.com/kjd/idna/issues/234">#234</a> from
StanFromIreland/patch-1</li>
<li><a
href="https://github.com/kjd/idna/commit/edd07c05024344a6ccb517414ccb36683aee99fc"><code>edd07c0</code></a>
Bump github/codeql-action from 3.35.2 to 4.35.2 in the actions
group</li>
<li><a
href="https://github.com/kjd/idna/commit/5557db030c11bdec50d62aa5f631d705d33ba123"><code>5557db0</code></a>
Merge branch 'master' into patch-1</li>
<li><a
href="https://github.com/kjd/idna/commit/f11746cf4981d25123ef7830d3ee60f07de8ae3d"><code>f11746c</code></a>
Merge pull request <a
href="https://redirect.github.com/kjd/idna/issues/235">#235</a> from
StanFromIreland/patch-2</li>
<li>Additional commits viewable in <a
href="https://github.com/kjd/idna/compare/v3.11...v3.15">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=idna&package-manager=uv&previous-version=3.11&new-version=3.15)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/microsoft/teams.py/network/alerts).

</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
## Summary

Documents the layered authentication model the SDK uses for inbound JSON
Web Tokens. Python half of a 3-SDK PR set.

## Why

Security scan finding "JsonWebToken No Signature Verification" flagged
the `JsonWebToken` accessor class for decoding tokens without verifying
signatures (uses `verify_signature=False`). A cross-SDK audit confirmed
this is intentional architecture: signature verification runs at the
HTTP boundary in `TokenValidator.validate_token`
(`packages/apps/src/microsoft_teams/apps/auth/token_validator.py`), and
the accessor exists as a typed view over already-validated payloads.
Every consumer of decoded claims is downstream of a validator pass.

This PR makes the architectural invariant explicit at the constructor
site so future readers (and the scanner on its next pass) see the design
intent locally.

## What

Contract docstring at `JsonWebToken.__init__` explaining that it
performs no signature verification, where verification actually happens,
and the rule that callers must not construct from raw network input.

## What this does not change

- No runtime behavior change. No signature verification added or
removed.
- No API surface change. `JsonWebToken` keeps its current name (verified
public on `microsoft_teams.api`, so a rename would have been breaking).
- No effect on the activity pipeline. JWT validation continues to happen
via `TokenValidator.validate_token` exactly as before.

## Related PRs

- TypeScript: microsoft/teams.ts#586
- .NET: microsoft/teams.net#517
- Documentation: microsoft/teams-sdk#2850
Bumps [qs](https://github.com/ljharb/qs) from 6.15.0 to 6.15.2.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ljharb/qs/blob/main/CHANGELOG.md">qs's
changelog</a>.</em></p>
<blockquote>
<h2><strong>6.15.2</strong></h2>
<ul>
<li>[Fix] <code>stringify</code>: skip null/undefined entries in
<code>arrayFormat: 'comma'</code> + <code>encodeValuesOnly</code>
instead of crashing in <code>encoder</code></li>
<li>[Fix] <code>stringify</code>: use configured <code>delimiter</code>
after <code>charsetSentinel</code> (<a
href="https://redirect.github.com/ljharb/qs/issues/555">#555</a>)</li>
<li>[Fix] <code>stringify</code>: apply <code>formatter</code> to
encoded key under <code>strictNullHandling</code> (<a
href="https://redirect.github.com/ljharb/qs/issues/554">#554</a>)</li>
<li>[Fix] <code>stringify</code>: skip null/undefined filter-array
entries instead of crashing in <code>encoder</code> (<a
href="https://redirect.github.com/ljharb/qs/issues/551">#551</a>)</li>
<li>[Fix] <code>parse</code>: handle nested bracket groups and add
regression tests (<a
href="https://redirect.github.com/ljharb/qs/issues/530">#530</a>)</li>
<li>[readme] fix grammar (<a
href="https://redirect.github.com/ljharb/qs/issues/550">#550</a>)</li>
<li>[Dev Deps] update <code>@ljharb/eslint-config</code></li>
<li>[Tests] add regression tests for keys containing percent-encoded
bracket text</li>
</ul>
<h2><strong>6.15.1</strong></h2>
<ul>
<li>[Fix] <code>parse</code>: <code>parameterLimit: Infinity</code> with
<code>throwOnLimitExceeded: true</code> silently drops all
parameters</li>
<li>[Deps] update <code>@ljharb/eslint-config</code></li>
<li>[Dev Deps] update <code>@ljharb/eslint-config</code>,
<code>iconv-lite</code></li>
<li>[Tests] increase coverage</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/ljharb/qs/commit/9aca4076fe788338c67cf7e115f0be6bc58d85a8"><code>9aca407</code></a>
v6.15.2</li>
<li><a
href="https://github.com/ljharb/qs/commit/5e33d33447ed0bf1ddab9abc41d27dea4687d992"><code>5e33d33</code></a>
[Dev Deps] update <code>@ljharb/eslint-config</code></li>
<li><a
href="https://github.com/ljharb/qs/commit/21f80b33e5c8b3f7eba1034fff0da4a4a37a1d41"><code>21f80b3</code></a>
[Fix] <code>stringify</code>: skip null/undefined entries in
<code>arrayFormat: 'comma'</code> + `e...</li>
<li><a
href="https://github.com/ljharb/qs/commit/a0a81ea2071acce3eff41a040f719ac8f5c4f64c"><code>a0a81ea</code></a>
[Fix] <code>stringify</code>: use configured <code>delimiter</code>
after <code>charsetSentinel</code></li>
<li><a
href="https://github.com/ljharb/qs/commit/e3062f78f5233b338ceeb8e8dfa5a07dea4b32a8"><code>e3062f7</code></a>
[Fix] <code>stringify</code>: apply <code>formatter</code> to encoded
key under <code>strictNullHandling</code></li>
<li><a
href="https://github.com/ljharb/qs/commit/0c180a40adb8c6703fffc85b2ff06ca209f5c1e0"><code>0c180a4</code></a>
[Fix] <code>stringify</code>: skip null/undefined filter-array entries
instead of crashi...</li>
<li><a
href="https://github.com/ljharb/qs/commit/3a8b94aec19bd664720f6f6b1e66c4a0dfe4b656"><code>3a8b94a</code></a>
[Tests] add regression tests for keys containing percent-encoded bracket
text</li>
<li><a
href="https://github.com/ljharb/qs/commit/96755abd357c0e534dd3442a84a04d08864bfe0d"><code>96755ab</code></a>
[readme] fix grammar</li>
<li><a
href="https://github.com/ljharb/qs/commit/a419ce5bbfcdb98a299f1a0bb47ea055baef20e6"><code>a419ce5</code></a>
[Fix] <code>parse</code>: handle nested bracket groups and add
regression tests</li>
<li><a
href="https://github.com/ljharb/qs/commit/3f5e1c528c967d915096787efbffa73cf6044170"><code>3f5e1c5</code></a>
v6.15.1</li>
<li>Additional commits viewable in <a
href="https://github.com/ljharb/qs/compare/v6.15.0...v6.15.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=qs&package-manager=npm_and_yarn&previous-version=6.15.0&new-version=6.15.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/microsoft/teams.py/network/alerts).

</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
## Summary

- Add a startup warning in `HttpServer.initialize()` when no `CLIENT_ID`
/ `CLIENT_SECRET` / `TENANT_ID` is configured, so customers running
anonymously know their bot accepts unauthenticated requests on
`/api/messages`.
- 2 new unit tests in `test_http_server.py` covering: warning fires when
no creds, warning does not fire when creds present.

## Why

Part of the DevTools deprecation rollout. The recommended local-testing
path with Microsoft 365 Agents Playground is anonymous mode (no creds
configured). The new warning makes that mode explicit at startup, so
customers don't ship anonymous-mode bots to production by accident, and
so the migration from DevTools to Playground produces a clear signal.

Behavior is unchanged. This is pure observability.

## Test plan

- [x] `pytest tests/test_http_server.py` (22/22 passing)
- [x] Confirmed warning text matches the wording used in teams.ts and
teams.net for cross-SDK consistency
- [x] Verified at runtime by initializing `App()` without credentials.
Output:
  ```
[WARNING] microsoft_teams.apps.http.http_server: No credentials
configured (CLIENT_ID / CLIENT_SECRET / TENANT_ID). Bot will accept
unauthenticated requests on /api/messages.
  ```
Note: Uvicorn's `dictConfig` replaces the default root-logger handler at
server-startup, so consumers running through Uvicorn need their own
logging config (or `logging.basicConfig(level=WARNING)`) to see this
warning. Customers using the standard Agents templates already have
logging configured.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Adds support for `suggestedActions/submit` invoke activity - dispatched
by the platform when a user clicks an `Action.Submit` suggested-action
click.

- New `SuggestedActionSubmitInvokeActivity` model and
`on_suggested_action_submit` handler.
- New `CardActionType.SUBMIT` enum value for constructing outbound
suggested-action chips.
- Marked `@experimental("ExperimentalTeamsSuggestedAction")` until the
platform feature stabilizes.
- New `examples/suggested-actions` sample app.


<img width="1017" height="243" alt="image"
src="https://github.com/user-attachments/assets/6a55d339-9cef-4d88-ae9d-0654388b1335"
/>
## Summary
Make `ctx.send()` and `ctx.reply()` stay private by default when the
inbound Teams message was targeted.

## Why
This matches the TS SDK behavior and saves app authors from manually
wiring `with_recipient(..., is_targeted=True)` for the common private
slash-command response path.

## Interesting bits
- Explicit public replies still work by passing a non-targeted
recipient.
- Sends to a different conversation do not inherit targeted routing.
- Added typed `quotedReply` and `targetedMessageInfo` entities so the
targeted reply metadata is modeled instead of shoved in as dict soup.
- Updated the targeted messages example with `send private` / `send
public` commands.

## Tips for reviewers
Start with
`packages/apps/src/microsoft_teams/apps/routing/activity_context.py`,
then the new tests in `packages/apps/tests/test_activity_context.py`.

## Test plan

<img width="680" height="332" alt="image"
src="https://github.com/user-attachments/assets/f9ea6559-96d5-490f-959d-f734e2e20b82"
/>
…#441)

## Summary

`uvx pip-audit` flagged a critical CVE in `starlette` 1.0.0 (transitive
via `fastapi`). This PR bumps it to **1.1.0** via `uv lock
--upgrade-package starlette` (uv picked 1.1.0, well above the 1.0.1
fix).

- **PYSEC-2026-161** / **CVE-2026-48710** / **GHSA-86qp-5c8j-p5mr** —
*BadHost*
  - Disclosed 2026-05-22 by X41 D-Sec
  - Severity: 9.8 critical
- Starlette reconstructs the request URL from the `Host` header without
validation. Attackers can inject path segments via the host part,
causing `request.url.path` to diverge from the actual routed path. Auth
checks that rely on `request.url.path` can be bypassed while routing
still hits the protected route.
  - Fix: starlette 1.0.1+; we landed on 1.1.0

Lock-only change. `fastapi 0.135.2`'s starlette constraint already
allowed the bump, so no `pyproject.toml` edits.

## Vulnerabilities not addressed in this PR

`pip-audit` and Dependabot alert #5 also flag **jsonpickle 1.4.2**
(CVE-2020-22083, GHSA-j66q-qmrc-89rx).

- Transitive via `botbuilder-core 4.17.0`, which pins
`jsonpickle<1.5,>=1.2`. We cannot bump jsonpickle without overriding an
upstream constraint on an archived library.
- The advisory itself is disputed: *"This CVE is disputed by the project
author as intended functionality."* It describes the documented
pickle-deserialization-is-dangerous property, not a code defect. First
patched version: none.
- Recommendation: treat as accepted risk for now; track separately
whether to override the constraint or remove the botbuilder integration.

## Test plan

- [x] `uvx pip-audit -r <exported requirements> --disable-pip --no-deps`
— starlette no longer in findings; only jsonpickle remains
- [x] `poe check` (ruff format + lint) — clean
- [x] `poe test` — 609 passed
- [x] `pyright` — 0 errors, 0 warnings

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
@corinagum corinagum changed the title Release 2.0.12: merge main into release (QR included) Release 2.0.12: merge main into release May 27, 2026
@corinagum
corinagum merged commit 0652350 into release May 27, 2026
4 checks passed
@corinagum
corinagum deleted the cg/prep-release-2.0.12 branch May 27, 2026 22:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants