From 269e21f1ded08914408441824ed1cce7a024a02c Mon Sep 17 00:00:00 2001 From: Tiberiu Socaci Date: Wed, 7 Oct 2026 10:58:12 +0300 Subject: [PATCH] fix(teams): show Teams reaction names and IDs in help Signed-off-by: Tiberiu Socaci --- CHANGELOG.md | 4 ++++ FEATURES.md | 7 +++++-- TEST-PLAN.md | 13 +++++++++++-- docs/PLATFORMS.md | 8 +++++--- src/platforms/msteams/help.js | 4 ++-- test/help-text.test.js | 11 ++++++----- 6 files changed, 33 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 358a70e..795f107 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,10 @@ product overview. ## Unreleased +- Teams help now shows Teams reaction IDs and picker names instead of Slack shortcodes. + Heart eyes robot no longer displays the mismatched plain robot glyph, and the guide explains + that reaction codes must be selected through the picker rather than sent as text. + - Teams Stop sign reactions now cancel the selected session’s active and queued requests with author/admin checks. Tick button reactions acknowledge tracked reminders, including escalation notices. Native and Graph intake recognize their Teams IDs; help describes the supported actions. diff --git a/FEATURES.md b/FEATURES.md index 7949191..d40e0ba 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -12,8 +12,11 @@ Examples use Teams controls and explain their permissions and configuration requirements. The authorized native command responds before an engine turn, in the requesting conversation. Quoting the help card in a group chat continues the same session. -- Reaction labels identify `:robot_face:` as Heart eyes robot, `:octagonal_sign:` as Stop sign, - and `:white_check_mark:` as Tick button. Teams intake recognizes the documented robot IDs, +- Reaction labels show Teams picker names and actual IDs: Heart eyes robot (`hearteyesrobot`), + Stop sign (`stopsign`), and Tick button / Checkmark button (`2705_whiteheavycheckmark`). + Heart eyes robot uses its picker name without a misleading plain robot glyph. The guide explains + that typing an ID as a message does not add a reaction. Teams intake recognizes the documented + robot IDs, `stopsign` and `2705_whiteheavycheckmark`, plus Unicode/legacy aliases. Robot starts a request as the reactor. Stop cancels only the selected session’s active and queued work with the same author/admin checks as `/stop`. Channel replies and group quotes resolve to their stored root. diff --git a/TEST-PLAN.md b/TEST-PLAN.md index d46dd39..63d2154 100644 --- a/TEST-PLAN.md +++ b/TEST-PLAN.md @@ -41,6 +41,11 @@ ## Microsoft Teams help guide acceptance (2026-10-07) +- Teams reaction legend correction: 30 focused help/control/card tests passed, zero failures/skips. + The native card and text fallback retain separate reaction rows, Teams picker names and actual + reaction IDs, with no Slack shortcodes or plain robot substituted for Heart eyes robot. + Live desktop/mobile display and the existing private QA registration remain pending. + - Native layout regression: `test/help-text.test.js`, `test/teams-controls.test.js` and `test/teams-native-cards.test.js` verify separate headings/paragraphs, three emoji rows, ten command rows with native monospace runs, complete copy without Markdown markers or @@ -55,7 +60,9 @@ `test/platform-teams-graph-activity.test.js` verify `hearteyesrobot` / `smilerobot` trigger through native and Graph normalization as the reactor, preserving the original target and removed-event suppression. Stop and Tick use explicit controls before an engine turn; plain heart eyes and - heart eyes dog remain ignored. Help regression checks all three shortcode/name pairs. + heart eyes dog remain ignored. Help regression checks all three Teams ID/name pairs, excludes + Slack shortcodes and the mismatched plain robot glyph, and explains that typed IDs do not add + reactions. - Verification of the emoji correction: 54 focused tests passed, zero failures/skips; static checks and secret scanning passed. The expanded guide still fits one Teams message. - [ ] LIVE (Claude and Codex): in separate approved beta Teams QA group/channel sessions with @@ -80,7 +87,9 @@ mention the bot with `/help` in a channel thread; quote the bot's reply in group chat and mention it with `/help`. Pass: each guide appears in its source conversation/thread, reads correctly on desktop/mobile, with a distinct title, section dividers, spaced paragraphs, - separate emoji/command rows and monospace commands. It includes **How to use me** and the + separate reaction/command rows and monospace commands. Check the reaction legend shows + `hearteyesrobot`, `stopsign` and `2705_whiteheavycheckmark` beside their Teams picker names; + no Slack shortcodes or misleading plain robot icon appear. It includes **How to use me** and the complete supported command list, and advertises no Slack-only controls. Quote the group help card with a mentioned `/status`; it must address the original session. No agent turn, runtime change, file browser or proactive personal settings card is started. Engine selection cannot affect this copy or diff --git a/docs/PLATFORMS.md b/docs/PLATFORMS.md index 002f929..2cc52df 100644 --- a/docs/PLATFORMS.md +++ b/docs/PLATFORMS.md @@ -249,9 +249,11 @@ Task-module dialogs and broadcast mentions remain unavailable. connections, skills, memory, reminders, schedules and background work. In channels and group chats, mention the bot with the command; quote the original message or bot reply in a group chat to address that session. Help is returned by the gateway before invoking an engine. - The reaction legend names Heart eyes robot (`:robot_face:`), Stop sign (`:octagonal_sign:`), - and Tick button (`:white_check_mark:`). Robot activation accepts Teams' `hearteyesrobot` and - `smilerobot` event IDs. Microsoft calls the green tick **Checkmark button**, ID + The reaction legend uses Teams picker names and IDs: Heart eyes robot (`hearteyesrobot`), + Stop sign (`stopsign`), and Tick button / Checkmark button (`2705_whiteheavycheckmark`). + Heart eyes robot has no equivalent Unicode glyph, so the guide uses its actual picker name. + Typing an ID as a message does not add a reaction. Robot activation accepts Teams' `hearteyesrobot` + and `smilerobot` event IDs. Microsoft calls the green tick **Checkmark button**, ID `2705_whiteheavycheckmark`; Stop sign is `stopsign`. See the [Teams reactions reference](https://learn.microsoft.com/en-us/microsoftteams/platform/agents-in-teams/teams-reactions-reference). Stop sign cancels the selected session’s active and queued requests, with author/admin checks. diff --git a/src/platforms/msteams/help.js b/src/platforms/msteams/help.js index 7ad5027..99977c6 100644 --- a/src/platforms/msteams/help.js +++ b/src/platforms/msteams/help.js @@ -3,8 +3,8 @@ export const TEAMS_HELP_TEXT = '**How to use me**\n\n' + 'In a personal chat, just send your request. In a channel or group chat, select the bot mention and write `@agent your request`, including for commands such as `@agent /help`. Keep channel follow-ups in the same thread and mention me again. In group chats, quote the original message or my reply and mention me to continue or control that session; a new unquoted group message starts a new session.\n\n' + - '• **Act on a message:** Where Teams reaction events are enabled and delivered to the gateway, react 🤖 (**Heart eyes robot**) to ask me to act on that message. Otherwise, mention me with your request.\n\n' + - '• **Reaction names:**\n\n🤖 `:robot_face:` — Heart eyes robot\n\n🛑 `:octagonal_sign:` — Stop sign\n\n✅ `:white_check_mark:` — Tick button\n\nHeart eyes robot asks me to act on a message. Stop sign stops the selected session’s active and queued work; only its author or an administrator may stop it. Tick button acknowledges a tracked reminder, including a second notice. Removing a reaction does not reopen an acknowledged reminder. Reaction actions require Teams events to be enabled and delivered to the gateway; `/stop` and `/cancel` also remain available.\n\n' + + '• **Act on a message:** Where Teams reaction events are enabled and delivered to the gateway, choose **Heart eyes robot** from the Teams reaction picker to ask me to act on that message. Otherwise, mention me with your request.\n\n' + + '• **Reaction names:**\n\nHeart eyes robot — `hearteyesrobot`\n\n🛑 Stop sign — `stopsign`\n\n✅ Tick button (Checkmark button) — `2705_whiteheavycheckmark`\n\nChoose these names in the Teams reaction picker. The codes above identify the reactions; typing a code as a message does not add a reaction. Heart eyes robot asks me to act on a message. Stop sign stops the selected session’s active and queued work; only its author or an administrator may stop it. Tick button acknowledges a tracked reminder, including a second notice. Removing a reaction does not reopen an acknowledged reminder. Reaction actions require Teams events to be enabled and delivered to the gateway; `/stop` and `/cancel` also remain available.\n\n' + '• **Voice prompts:** Attach a downloadable voice note and mention me in channels/groups; personal chats need no mention. Voice notes require local Whisper to be enabled and installed. Typed text stays as instructions, and raw audio is never sent to Claude or Codex. If transcription is unavailable, send text or ask an administrator to check Whisper.\n\n' + '• **Control a live run:** Send `/stop` or `/cancel`, or react 🛑 (**Stop sign**) to a message in that session, to stop its active and queued work. In a channel, mention me in that thread; in a group chat, quote the original message or my reply and mention me. Only the run author or an administrator may stop a request. New requests for the same session queue while I work.\n\n' + '• **Open files:** Attach a file/image and ask me to read it. Personal-chat uploads download directly; group/channel files require the configured allowed drives and Microsoft permissions. Use `/files [folder]` to browse this conversation’s workspace privately in your personal chat, download files, edit eligible text, or upload files when you have write access. Browser actions require the gateway Public URL. Use `/sendfile ` for a personal file-consent card; accept or decline it there. Native sending supports nonempty files up to 10 MB; larger files use browser download. Open a personal chat with the bot first for private controls.\n\n' + diff --git a/test/help-text.test.js b/test/help-text.test.js index cca7d0a..ce6ceb5 100644 --- a/test/help-text.test.js +++ b/test/help-text.test.js @@ -10,9 +10,10 @@ const { teamsAdapter } = await import('../src/platforms/msteams.js'); test("Teams /help includes practical workflows and its supported commands", () => { for (const expected of [ - '**How to use me**', '`@agent /help`', 'quote the original message', 'react 🤖', - '`:robot_face:` — Heart eyes robot', '`:octagonal_sign:` — Stop sign', - '`:white_check_mark:` — Tick button', 'Tick button acknowledges a tracked reminder', 'Removing a reaction does not reopen', + '**How to use me**', '`@agent /help`', 'quote the original message', 'choose **Heart eyes robot**', + 'Heart eyes robot — `hearteyesrobot`', 'Stop sign — `stopsign`', + 'Tick button (Checkmark button) — `2705_whiteheavycheckmark`', + 'typing a code as a message does not add a reaction', 'Tick button acknowledges a tracked reminder', 'Removing a reaction does not reopen', 'local Whisper', 'Only the run author or an administrator', 'requests for the same session queue', 'allowed drives and Microsoft permissions', '10 MB', 'Public URL', 'personal chat', 'Stored credential values are never shown', 'Composio', 'list skills', 'remember that …', @@ -25,7 +26,7 @@ test("Teams /help includes practical workflows and its supported commands", () = // These are Slack-specific controls; Teams has session queues and its own native console. assert.doesNotMatch(TEAMS_HELP_TEXT, /\/(?:menu|sudo|fork|delete|pending|context|compact|mode|next|update|resume)\b/); - assert.doesNotMatch(TEAMS_HELP_TEXT, /Slack|Steer Conversation|Generate transcript|📂 button/); + assert.doesNotMatch(TEAMS_HELP_TEXT, /Slack|Steer Conversation|Generate transcript|📂 button|:robot_face:|:octagonal_sign:|:white_check_mark:|🤖/); }); test("Teams help survives the platform formatter within its message budget", () => { @@ -55,7 +56,7 @@ test('Teams help card separates headings, paragraphs, emoji and commands without const words = text => text.replace(/[•:]/g, '').split(/\s+/).filter(Boolean); assert.deepEqual(words(card.body.map(item => item.text || plain(item)).join(' ')), words(expected)); assert.equal(rows.filter(item => /^• \/.* — /.test(plain(item))).length, 10); - assert.equal(rows.filter(item => /^[🤖🛑✅]/u.test(plain(item))).length, 3); + assert.equal(rows.filter(item => /^(?:Heart eyes robot|🛑 Stop sign|✅ Tick button).* — /.test(plain(item))).length, 3); assert.ok(rows.some(item => item.inlines.some(run => run.text === '/help' && run.fontType === 'Monospace'))); assert.ok(!JSON.stringify(card).includes('`')); assert.equal(card.actions, undefined);