From 1a095951ee05c97de278a8e3c8d7819298c04dbc Mon Sep 17 00:00:00 2001 From: Josh Oratz Date: Thu, 13 Nov 2025 14:00:43 -0800 Subject: [PATCH 1/5] Add helper functions for creating activity with email response --- .../notifications/agent_notification.py | 14 +++++++++++++- .../notifications/models/email_response.py | 10 ++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py b/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py index 8a5f94de..24d7b82b 100644 --- a/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py +++ b/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py @@ -3,12 +3,13 @@ from collections.abc import Awaitable, Callable, Iterable from typing import Any, TypeVar -from microsoft_agents.activity import ChannelId +from microsoft_agents.activity import Activity, ChannelId from microsoft_agents.hosting.core import TurnContext from microsoft_agents.hosting.core.app.state import TurnState from .models.agent_notification_activity import AgentNotificationActivity, NotificationTypes from .models.agent_subchannel import AgentSubChannel from .models.agent_lifecycle_event import AgentLifecycleEvent +from .models.email_response import EmailResponse TContext = TypeVar("TContext", bound=TurnContext) TState = TypeVar("TState", bound=TurnState) @@ -181,3 +182,14 @@ def _normalize_lifecycleevent(value: str | AgentLifecycleEvent | None) -> str: return "" resolved = value.value if isinstance(value, AgentLifecycleEvent) else str(value) return resolved.lower().strip() + + @staticmethod + def create_email_response_activity( + activity: Activity, email_response_html_body: str + ) -> Activity: + working_activity = activity.create_reply() + email_response = EmailResponse(html_body=email_response_html_body) + if working_activity.entities is None: + working_activity.entities = [] + working_activity.entities.append(email_response) + return working_activity diff --git a/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/models/email_response.py b/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/models/email_response.py index 35b50fff..94dc60e7 100644 --- a/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/models/email_response.py +++ b/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/models/email_response.py @@ -1,7 +1,17 @@ from typing import Literal +from microsoft_agents.activity.activity import Activity from microsoft_agents.activity.entity import Entity class EmailResponse(Entity): type: Literal["emailResponse"] = "emailResponse" html_body: str = "" + + @staticmethod + def create_email_response_activity(email_response_html_body: str) -> Activity: + working_activity = Activity(type="message") + email_response = EmailResponse(html_body=email_response_html_body) + if working_activity.entities is None: + working_activity.entities = [] + working_activity.entities.append(email_response) + return working_activity From 8625dbb61f9b864d62cd51d697f6038954b14457 Mon Sep 17 00:00:00 2001 From: Josh Oratz <43622754+joratz@users.noreply.github.com> Date: Thu, 13 Nov 2025 14:44:25 -0800 Subject: [PATCH 2/5] Update libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../notifications/agent_notification.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py b/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py index 24d7b82b..9fdf3bf5 100644 --- a/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py +++ b/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py @@ -187,6 +187,15 @@ def _normalize_lifecycleevent(value: str | AgentLifecycleEvent | None) -> str: def create_email_response_activity( activity: Activity, email_response_html_body: str ) -> Activity: + """Create a reply Activity with an EmailResponse entity. + + Args: + activity: The source activity to create a reply from. + email_response_html_body: The HTML content for the email response. + + Returns: + A reply Activity with the EmailResponse entity attached. + """ working_activity = activity.create_reply() email_response = EmailResponse(html_body=email_response_html_body) if working_activity.entities is None: From 4adeaea2f3df7ac03761559d387f493bdc49ac0b Mon Sep 17 00:00:00 2001 From: Josh Oratz <43622754+joratz@users.noreply.github.com> Date: Thu, 13 Nov 2025 14:44:41 -0800 Subject: [PATCH 3/5] Update libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/models/email_response.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../notifications/models/email_response.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/models/email_response.py b/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/models/email_response.py index 94dc60e7..6aff69c5 100644 --- a/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/models/email_response.py +++ b/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/models/email_response.py @@ -9,6 +9,14 @@ class EmailResponse(Entity): @staticmethod def create_email_response_activity(email_response_html_body: str) -> Activity: + """Create a new Activity with an EmailResponse entity. + + Args: + email_response_html_body: The HTML content for the email response. + + Returns: + A new Activity instance with type='message' and the EmailResponse entity attached. + """ working_activity = Activity(type="message") email_response = EmailResponse(html_body=email_response_html_body) if working_activity.entities is None: From f4e15913f60a1c2ded12a0175fbca271f38b0a43 Mon Sep 17 00:00:00 2001 From: Josh Oratz Date: Thu, 13 Nov 2025 15:03:20 -0800 Subject: [PATCH 4/5] Remove AgentNotification helper --- .../notifications/agent_notification.py | 25 ++----------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py b/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py index 9fdf3bf5..cd4ef775 100644 --- a/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py +++ b/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py @@ -3,13 +3,12 @@ from collections.abc import Awaitable, Callable, Iterable from typing import Any, TypeVar -from microsoft_agents.activity import Activity, ChannelId +from microsoft_agents.activity import ChannelId from microsoft_agents.hosting.core import TurnContext from microsoft_agents.hosting.core.app.state import TurnState from .models.agent_notification_activity import AgentNotificationActivity, NotificationTypes from .models.agent_subchannel import AgentSubChannel from .models.agent_lifecycle_event import AgentLifecycleEvent -from .models.email_response import EmailResponse TContext = TypeVar("TContext", bound=TurnContext) TState = TypeVar("TState", bound=TurnState) @@ -181,24 +180,4 @@ def _normalize_lifecycleevent(value: str | AgentLifecycleEvent | None) -> str: if value is None: return "" resolved = value.value if isinstance(value, AgentLifecycleEvent) else str(value) - return resolved.lower().strip() - - @staticmethod - def create_email_response_activity( - activity: Activity, email_response_html_body: str - ) -> Activity: - """Create a reply Activity with an EmailResponse entity. - - Args: - activity: The source activity to create a reply from. - email_response_html_body: The HTML content for the email response. - - Returns: - A reply Activity with the EmailResponse entity attached. - """ - working_activity = activity.create_reply() - email_response = EmailResponse(html_body=email_response_html_body) - if working_activity.entities is None: - working_activity.entities = [] - working_activity.entities.append(email_response) - return working_activity + return resolved.lower().strip() \ No newline at end of file From ec6d4b814bb2eb4b6d644de53de7648fcf914b70 Mon Sep 17 00:00:00 2001 From: Josh Oratz Date: Thu, 13 Nov 2025 15:09:13 -0800 Subject: [PATCH 5/5] fix whitespace --- .../microsoft_agents_a365/notifications/agent_notification.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py b/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py index cd4ef775..8a5f94de 100644 --- a/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py +++ b/libraries/microsoft-agents-a365-notifications/microsoft_agents_a365/notifications/agent_notification.py @@ -180,4 +180,4 @@ def _normalize_lifecycleevent(value: str | AgentLifecycleEvent | None) -> str: if value is None: return "" resolved = value.value if isinstance(value, AgentLifecycleEvent) else str(value) - return resolved.lower().strip() \ No newline at end of file + return resolved.lower().strip()