Skip to content

Default targeted replies for targeted inbound messages#592

Merged
heyitsaamir merged 9 commits into
mainfrom
targeted-replies-default
May 26, 2026
Merged

Default targeted replies for targeted inbound messages#592
heyitsaamir merged 9 commits into
mainfrom
targeted-replies-default

Conversation

@heyitsaamir
Copy link
Copy Markdown
Collaborator

@heyitsaamir heyitsaamir commented May 22, 2026

Summary

  • make send / reply default to targeted when replying to a targeted inbound message
  • keep explicit public sends, different recipients, and different conversation refs public
  • split the targeting logic into helpers so the rules are less spicy
  • keep targetedMessageInfo limited to targeted inbound replies, so normal explicit targeted sends still work
  • add targeted-messages example commands for send private and send public

Note: this also cleans up a pre-existing dead branch from when isTargeted moved onto recipientparams.recipient?.isTargeted already means params.recipient exists.

image

Test plan

  • cd packages/apps && npx jest src/contexts/activity.test.ts --runInBand
  • cd packages/apps && npm run build
  • cd examples/targeted-messages && npm run build

Copilot AI review requested due to automatic review settings May 22, 2026 18:44
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates ActivityContext.send()/reply() behavior so that when the inbound activity is a targeted message, outbound message sends default to targeted as well, while still allowing callers to explicitly send a non-targeted (public) message. It also adds Jest coverage for the new defaulting behavior and the explicit override path.

Changes:

  • Default outbound send() messages to targeted when the inbound activity is targeted (unless an explicit recipient is provided).
  • Update the targeted-reply test to assert the new default recipient targeting behavior.
  • Add tests covering the new default-targeted behavior and the explicit “public send” override.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

File Description
packages/apps/src/contexts/activity.ts Adjusts send() to default outbound messages to targeted when the inbound activity is targeted.
packages/apps/src/contexts/activity.test.ts Adds/updates tests to cover the new defaulting behavior and override case.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/apps/src/contexts/activity.ts Outdated
Comment thread packages/apps/src/contexts/activity.test.ts Outdated
Comment thread packages/apps/src/contexts/activity.ts Outdated
Comment thread packages/apps/src/contexts/activity.ts
Comment thread examples/targeted-messages/src/index.ts
Comment thread packages/apps/src/contexts/activity.ts Outdated
Comment thread examples/targeted-messages/src/index.ts Outdated
Comment thread examples/targeted-messages/README.md Outdated
Comment thread packages/apps/src/contexts/activity.ts
@heyitsaamir heyitsaamir merged commit 5eaeb0e into main May 26, 2026
9 checks passed
@heyitsaamir heyitsaamir deleted the targeted-replies-default branch May 26, 2026 19:31
corinagum added a commit that referenced this pull request May 27, 2026
## Summary

Brings `origin/main` into `release` for the **2.0.12** release. **No
carve-outs this time** — Quoted Replies is included.

`version.json`: `2.0.12-preview.{height}` → `2.0.12`.

Aligns with teams.py 2.0.12 (PR #442 already on PyPI / pending publish).

## What's in this release (delta from 2.0.11)

**Features**
- Quoted Replies + new quotes features — previously held back via the
2.0.11 carve-out (#576)
- SuggestedActionSubmitActivity for `suggestedAction/submit` invoke
(#591)
- Default targeted replies for targeted inbound messages (#592)
- Filter colliding keys before `Object.assign` in `ActivityContext`
(#596)
- Prompt Preview support (#536)
- A2A sample (#584)
- AI/MCPClient (#572)
- Allow passing custom HTTP client via `AppOptions`-equivalent
- Reactions API marked GA (#575), Rename `ReactionClient.remove()` →
`delete()` (#567)

**Security & fixes**
- Security hardening: tighten cross-origin policies (#595)
- Lock JsonWebToken trust-boundary contract (#586)
- `fix(deps)`: npm audit fix — clears all high-severity advisories
(#599)
- `fix(apps)`: log inbound activities at info, warn on missing
Authorization (#568)
- `fix`: App user-agent merging (#573)
- `fix`: Add null checks in `local-memory.ts` to prevent role crash
(#438)
- `fix`: `@microsoft/teams.client` import error in webpack 5 (#566)
- Switch to named imports without subpaths (#561)

**Deprecations / package changes**
- Deprecate `DevtoolsPlugin` in favor of Microsoft 365 Agents Playground
(#593)
- Remove in-repo Teams CLI package (#580) — moved to
`teams-sdk/packages/cli`
- Deprecate AI Libraries (#588)
- Correct imports + return types in misc. packages (#589)

**Dependency bumps**
- turbo 2.8.11 → 2.9.14 (#587)
- qs 6.15.0 → 6.15.2 (#594)
- hono 4.12.14 → 4.12.16 (#562)
- npm audit fix bundle (#599): axios 1.13.5 → 1.16.1, fast-uri 3.1.0 →
3.1.2, ws 8.19.0 → 8.21.0, @azure/msal-node hoisted 5.2.2, uuid 11.1.0 →
11.1.1, @azure/identity 4.13.0 → 4.13.1, express-rate-limit, ip-address,
brace-expansion, etc.

## 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.
- No SDK-side carve-outs needed; this matches the teams.py 2.0.12 (PR
#442) decision.

## Branch structure note

`prep-release/2.0.12` is reset to `origin/main` + a one-line
`version.json` bump. Diff against `release` (this PR) shows the full
delta from 2.0.11. We deliberately did not use a 2-parent merge commit —
the auto-merge tried to interleave non-overlapping hunks from main's QR
additions with release's QR carve-outs in `activity.ts`, producing a
semantically broken file. Reset-to-main + version bump is the clean way
to express "release should equal main."

## Test plan

- [x] `npm install` clean (post-audit-fix lockfile)
- [x] `npm run build` — 33/33 targets clean
- [x] `npm test` — 14/14 task targets, 279+ tests pass
- [x] E2E echo bot smoke test against `cg-test-bot-py` via canary ABS —
done on `cg/audit-deps-ts` (now merged); covers axios + msal-node code
paths
- [ ] Pipeline Build + Test stages green on `release` after merge
- [ ] Publish pipeline run with **Public** → ESRP → npm
`@microsoft/teams.*@2.0.12`
- [ ] Smoke install: `npm view @microsoft/teams.apps@2.0.12` after
publish
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.

3 participants