msteams: add message actions — pin, unpin, read, react, reactions (#53432)

* msteams: add pin/unpin, list-pins, and read message actions

Wire up Graph API endpoints for message read, pin, unpin, and list-pins
in the MS Teams extension, following the same patterns as edit/delete.

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

* msteams: address PR review comments for pin/unpin/read actions

- Handle 204 No Content in postGraphJson (Graph mutations may return empty body)
- Strip conversation:/user: prefixes in resolveConversationPath to avoid Graph 404s
- Remove dead variable in channel pin branch
- Rename unpin param from messageId to pinnedMessageId for semantic clarity
- Accept both pinnedMessageId and messageId in unpin action handler for compat

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

* msteams: resolve user targets + add User-Agent to Graph helpers

- Resolve user:<aadId> targets to actual conversation IDs via conversation
  store before Graph API calls (fixes 404 for DM-context actions)
- Add User-Agent header to postGraphJson/deleteGraphRequest for consistency
  with fetchGraphJson after rebase onto main

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

* msteams: resolve DM targets to Graph chat IDs + expose pin IDs

- Prefer cached graphChatId over Bot Framework conversation IDs for user
  targets; throw descriptive error when no Graph-compatible ID is available
- Add `id` field to list-pins rows so default formatters surface the pinned
  resource ID needed for the unpin flow

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

* msteams: add react and reactions (list) message actions

* msteams: fix reaction count undercount and remove unpin messageId fallback

* msteams: wire pinnedMessageId through CLI/tool schema, add channel pin beta warnings, add list-pins pagination

* msteams: address PR #53432 remaining review feedback

* fix(msteams): route channel actions via teamId/channelId path (#53432)

* msteams: add unpin pinnedMessageId test coverage (#53432)

* fix(msteams): keep graph routing scoped to graph actions

* fix(msteams): align graph routing context types

* msteams: route fetchGraphAbsoluteUrl through fetchWithSsrFGuard

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Brad Groux <3053586+BradGroux@users.noreply.github.com>
This commit is contained in:
sudie-codes
2026-04-10 18:25:57 -07:00
committed by GitHub
parent 6c574d726b
commit 0f19271092
13 changed files with 1211 additions and 83 deletions

View File

@@ -400,6 +400,7 @@ export type ChannelThreadingContext = {
export type ChannelThreadingToolContext = {
currentChannelId?: string;
currentGraphChannelId?: string;
currentChannelProvider?: ChannelId;
currentThreadTs?: string;
currentMessageId?: string | number;

View File

@@ -15,7 +15,11 @@ export function registerMessagePinCommands(message: Command, helpers: MessageCli
.withMessageBase(
helpers.withRequiredMessageTarget(message.command("unpin").description("Unpin a message")),
)
.requiredOption("--message-id <id>", "Message id")
.requiredOption("--message-id <id>", "Message id (or pinned message resource id for MSTeams)")
.option(
"--pinned-message-id <id>",
"Pinned message resource id (MSTeams: from pin or list-pins, not the chat message id)",
)
.action(async (opts) => {
await helpers.runMessageAction("unpin", opts);
}),