Update quoted replies & new quotes features#482
Merged
Conversation
corinagum
force-pushed
the
cg/quoted-replies
branch
from
March 23, 2026 23:28
4e0db45 to
70b2cb5
Compare
corinagum
marked this pull request as ready for review
March 24, 2026 18:19
Contributor
There was a problem hiding this comment.
Pull request overview
This PR updates the SDK’s reply/quote behavior to use Teams “quoted replies” (entity + <quoted .../> placeholder) instead of replyToId/blockquote HTML, adds first-class quoted-reply types/APIs, fixes an ActivityContext constructor enrichment bug, and introduces an example app to exercise the new functionality.
Changes:
- Add
QuotedReplyEntity/QuotedReplyData, plumb intoEntityunion, and addMessageActivity.getQuotedMessages()+addQuotedReply(). - Update
ActivityContext.reply()to stamp quoted-reply metadata + placeholder, and addActivityContext.quoteReply(messageId, ...). - Fix
ActivityContextconstructor ordering bug (enrichment beforeObject.assign) and add regression tests + a new quoted-replies example.
Reviewed changes
Copilot reviewed 16 out of 19 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/apps/src/contexts/activity.ts | Adds quoteReply() API, changes reply() quoting behavior, and fixes constructor activity enrichment ordering. |
| packages/apps/src/contexts/activity.test.ts | Updates tests to assert quoted-reply entity + placeholder behavior for reply() and quoteReply(). |
| packages/apps/src/app.process.spec.ts | Regression test ensuring message activities are enriched with interface methods (e.g., getQuotedMessages). |
| packages/api/src/models/entity/quoted-reply-entity.ts | Introduces QuotedReplyEntity and nested quoted reply data model. |
| packages/api/src/models/entity/index.ts | Exposes QuotedReplyEntity via the Entity union and exports. |
| packages/api/src/activities/message/message.ts | Adds getQuotedMessages() and addQuotedReply() builder API. |
| packages/api/src/activities/message/message.spec.ts | Adds unit tests for quoted-reply parsing and builder behavior. |
| packages/api/src/activities/activity.ts | Removes withReplyToId() builder method. |
| packages/api/src/activities/activity.spec.ts | Updates tests to reflect removal of withReplyToId(). |
| package-lock.json | Adds the new @examples/quoted-replies workspace entry. |
| examples/quoted-replies/** | New runnable example demonstrating reading/sending quoted replies. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
corinagum
force-pushed
the
cg/quoted-replies
branch
from
March 24, 2026 23:09
a85cefa to
1036764
Compare
heyitsaamir
reviewed
Mar 25, 2026
heyitsaamir
reviewed
Mar 25, 2026
heyitsaamir
previously approved these changes
Mar 26, 2026
heyitsaamir
previously approved these changes
Mar 26, 2026
Collaborator
Author
|
Re: Copilot review comments
|
corinagum
force-pushed
the
cg/quoted-replies
branch
from
April 7, 2026 19:16
0596f05 to
d7ffcb2
Compare
corinagum
force-pushed
the
cg/quoted-replies
branch
2 times, most recently
from
April 27, 2026 21:53
d36b8ac to
2734f5b
Compare
corinagum
added a commit
that referenced
this pull request
May 6, 2026
PR #482 left a stale examples/quoted-replies entry (directory was renamed to examples/quoting), and the lockfile predated PR #536's examples/targeted-messages workspace. npm ci enforces lockfile against workspace globs and was failing in CI; npm install tolerated the drift. Regenerated from scratch so both new example workspaces are present and the stale one is gone.
corinagum
force-pushed
the
cg/quoted-replies
branch
from
May 6, 2026 23:10
292f241 to
b8d2c39
Compare
heyitsaamir
approved these changes
May 7, 2026
heyitsaamir
left a comment
Collaborator
There was a problem hiding this comment.
Looks good. Minor NIT.
Also, does package-lock need changing?
corinagum
force-pushed
the
cg/quoted-replies
branch
from
May 7, 2026 17:47
b8d2c39 to
8ce52b6
Compare
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
The lockfile had a stale examples/quoted-replies entry left over from the directory rename to examples/quoting, which caused 'npm ci' to fail in CI (npm install tolerated the drift). Regenerated from scratch so the lockfile matches the actual workspace layout.
corinagum
force-pushed
the
cg/quoted-replies
branch
from
May 7, 2026 17:48
8ce52b6 to
67aaffd
Compare
heyitsaamir
approved these changes
May 7, 2026
5 tasks
corinagum
added a commit
that referenced
this pull request
May 14, 2026
## Summary Brings `main` into `release` for the 2.0.11 release, with quoted-replies (PR #482) excluded. Single squashed commit containing the diff between `release` (2.0.10) and `main`, minus the quoted-replies feature. ## What's in this release - All commits merged to main since 2.0.10 (the previous release), notably: - **Reactions GA** (PR #575) — `[Experimental]` removed; `ReactionClient.remove()` → `delete()` - User-agent fix (PR #573) - Prompt Preview Support (PR #536) - Various dependency bumps and bug fixes ## What's NOT in this release **Quoted-replies feature (PR #482) is excluded:** - `prependQuote()`, `addQuote()` builder methods — absent - `context.quote()` and quote-aware `reply()` behavior — reverted to legacy `replyToId` + blockquote - `examples/quoting` — removed - QR-related tests — removed **Kept intentionally:** - `QuotedReplyEntity` type stays in the `Entity` union so inbound activities carrying `quotedReply` entities still parse - `addTargetedMessageInfo` runtime strip-QR logic (filters `e.type === 'quotedReply'`) — preserves prompt-preview cleanup ## Version `version.json`: `2.0.10` → `2.0.11` ## Test plan - [x] `npm run lint` — 33/33 packages - [x] `npm run build` — 35/35 packages - [x] `npm run test` — 730/730 tests across 61 suites - [x] `npm pack --workspaces` — all tarballs produced; verified `quoted-reply-entity.d.ts` ships in `@microsoft/teams.api`; no `prependQuote`/`addQuote` symbols in bundled `dist/` - [ ] ADO Public publish pipeline (post-merge) 🤖 Generated with [Claude Code](https://claude.com/claude-code) ## CI note skip-test-verification — the `release` branch is out of sync with `main` for three template/example pairs (templates: `ai`; examples: `echo`, `graph`). This PR brings them along as part of the bulk main→release merge but doesn't try to re-pair them, since that's an orthogonal fix and would muddy this PR's "single squashed release diff" intent.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
withReplyToId():replyToIdbody property has no effect on threading (APX only uses it for encryption)QuotedReplyEntitytype with nestedquotedReplydata object (messageIdrequired,senderId/senderName/preview/time/isReplyDeleted/validatedMessageReferenceoptional)getQuotedMessages()onMessageActivityto read inbound quoted reply entitiesaddQuotedReply(messageId, response?)builder onMessageActivityfor constructing outbound quotes (build order = reading order)eply()to stampquotedReplyentity+ <quoted messageId="..."/>placeholder instead of blockquote HTML; removereplyToIdassignmentquoteReply(messageId, activity)onActivityContextfor quoting arbitrary messages@experimentalActivityContextconstructor whereObject.assign(this, rest)ran beforeMessageActivity.from().toInterface(), causing interface methods (getQuotedMessages,stripMentionsText,isRecipientMentioned,getAccountMention) to be missing oncontext.activity. Added regression test.