Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
7 changes: 5 additions & 2 deletions FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
13 changes: 11 additions & 2 deletions TEST-PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
8 changes: 5 additions & 3 deletions docs/PLATFORMS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 2 additions & 2 deletions src/platforms/msteams/help.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 6 additions & 5 deletions test/help-text.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 …',
Expand All @@ -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", () => {
Expand Down Expand Up @@ -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);
Expand Down
Loading