diff --git a/claude-agent-sdk/listeners/actions/feedback.py b/claude-agent-sdk/listeners/actions/feedback.py index eaa0286..0564362 100644 --- a/claude-agent-sdk/listeners/actions/feedback.py +++ b/claude-agent-sdk/listeners/actions/feedback.py @@ -1,16 +1,23 @@ from logging import Logger from slack_bolt import Ack +from slack_bolt.context.async_context import AsyncBoltContext from slack_sdk.web.async_client import AsyncWebClient -async def handle_feedback(ack: Ack, body: dict, client: AsyncWebClient, logger: Logger): +async def handle_feedback( + ack: Ack, + body: dict, + client: AsyncWebClient, + context: AsyncBoltContext, + logger: Logger, +): """Handle thumbs up/down feedback on Casey's responses.""" await ack() try: - channel_id = body["channel"]["id"] - user_id = body["user"]["id"] + channel_id = context.channel_id + user_id = context.user_id message_ts = body["message"]["ts"] feedback_value = body["actions"][0]["value"] diff --git a/claude-agent-sdk/listeners/events/app_home_opened.py b/claude-agent-sdk/listeners/events/app_home_opened.py index c2a804d..ec59cdb 100644 --- a/claude-agent-sdk/listeners/events/app_home_opened.py +++ b/claude-agent-sdk/listeners/events/app_home_opened.py @@ -1,14 +1,17 @@ from logging import Logger +from slack_bolt.context.async_context import AsyncBoltContext from slack_sdk.web.async_client import AsyncWebClient from listeners.views.app_home_builder import build_app_home_view -async def handle_app_home_opened(client: AsyncWebClient, event: dict, logger: Logger): +async def handle_app_home_opened( + client: AsyncWebClient, context: AsyncBoltContext, logger: Logger +): """Publish the App Home view when a user opens the app's Home tab.""" try: - user_id = event["user"] + user_id = context.user_id view = build_app_home_view() await client.views_publish(user_id=user_id, view=view) except Exception as e: diff --git a/claude-agent-sdk/listeners/events/app_mentioned.py b/claude-agent-sdk/listeners/events/app_mentioned.py index 4c0e26c..1442db3 100644 --- a/claude-agent-sdk/listeners/events/app_mentioned.py +++ b/claude-agent-sdk/listeners/events/app_mentioned.py @@ -2,6 +2,7 @@ import re from logging import Logger +from slack_bolt.context.async_context import AsyncBoltContext from slack_bolt.context.say.async_say import AsyncSay from slack_sdk.web.async_client import AsyncWebClient @@ -22,15 +23,19 @@ async def handle_app_mentioned( - client: AsyncWebClient, event: dict, logger: Logger, say: AsyncSay + client: AsyncWebClient, + context: AsyncBoltContext, + event: dict, + logger: Logger, + say: AsyncSay, ): """Handle @Casey mentions in channels.""" try: - channel_id = event["channel"] - team_id = event.get("team") + channel_id = context.channel_id + team_id = context.team_id text = event.get("text", "") thread_ts = event.get("thread_ts") or event["ts"] - user_id = event.get("user") + user_id = context.user_id # Strip the bot mention from the text cleaned_text = re.sub(r"<@[A-Z0-9]+>", "", text).strip() diff --git a/claude-agent-sdk/listeners/events/message.py b/claude-agent-sdk/listeners/events/message.py index d37c6b4..8229877 100644 --- a/claude-agent-sdk/listeners/events/message.py +++ b/claude-agent-sdk/listeners/events/message.py @@ -1,6 +1,7 @@ import random from logging import Logger +from slack_bolt.context.async_context import AsyncBoltContext from slack_bolt.context.say.async_say import AsyncSay from slack_sdk.web.async_client import AsyncWebClient @@ -21,7 +22,11 @@ async def handle_message( - client: AsyncWebClient, event: dict, logger: Logger, say: AsyncSay + client: AsyncWebClient, + context: AsyncBoltContext, + event: dict, + logger: Logger, + say: AsyncSay, ): """Handle direct messages sent to Casey.""" # Skip bot messages and message subtypes (edits, deletes, etc.) @@ -33,11 +38,11 @@ async def handle_message( return try: - channel_id = event["channel"] - team_id = event.get("team") + channel_id = context.channel_id + team_id = context.team_id text = event.get("text", "") thread_ts = event.get("thread_ts") or event["ts"] - user_id = event.get("user") + user_id = context.user_id # Get session ID for conversation context existing_session_id = session_store.get_session(channel_id, thread_ts) diff --git a/claude-agent-sdk/listeners/views/issue_modal.py b/claude-agent-sdk/listeners/views/issue_modal.py index e9acd21..aed5939 100644 --- a/claude-agent-sdk/listeners/views/issue_modal.py +++ b/claude-agent-sdk/listeners/views/issue_modal.py @@ -1,6 +1,7 @@ from logging import Logger from slack_bolt import Ack +from slack_bolt.context.async_context import AsyncBoltContext from slack_sdk.web.async_client import AsyncWebClient from agent import run_casey_agent @@ -9,14 +10,18 @@ async def handle_issue_submission( - ack: Ack, body: dict, client: AsyncWebClient, logger: Logger + ack: Ack, + body: dict, + client: AsyncWebClient, + context: AsyncBoltContext, + logger: Logger, ): """Handle modal submission: open DM, post issue, and run Casey agent.""" await ack() try: - team_id = body["user"]["team_id"] - user_id = body["user"]["id"] + team_id = context.team_id + user_id = context.user_id values = body["view"]["state"]["values"] category = values["category_block"]["category_select"]["selected_option"][ "value" diff --git a/openai-agents-sdk/listeners/actions/feedback.py b/openai-agents-sdk/listeners/actions/feedback.py index ab9d5c6..fd34ab8 100644 --- a/openai-agents-sdk/listeners/actions/feedback.py +++ b/openai-agents-sdk/listeners/actions/feedback.py @@ -1,16 +1,18 @@ from logging import Logger -from slack_bolt import Ack +from slack_bolt import Ack, BoltContext from slack_sdk import WebClient -def handle_feedback(ack: Ack, body: dict, client: WebClient, logger: Logger): +def handle_feedback( + ack: Ack, body: dict, client: WebClient, context: BoltContext, logger: Logger +): """Handle thumbs up/down feedback on Casey's responses.""" ack() try: - channel_id = body["channel"]["id"] - user_id = body["user"]["id"] + channel_id = context.channel_id + user_id = context.user_id message_ts = body["message"]["ts"] feedback_value = body["actions"][0]["value"] diff --git a/openai-agents-sdk/listeners/events/app_home_opened.py b/openai-agents-sdk/listeners/events/app_home_opened.py index b715f97..9ef37ee 100644 --- a/openai-agents-sdk/listeners/events/app_home_opened.py +++ b/openai-agents-sdk/listeners/events/app_home_opened.py @@ -1,14 +1,15 @@ from logging import Logger +from slack_bolt import BoltContext from slack_sdk import WebClient from listeners.views.app_home_builder import build_app_home_view -def handle_app_home_opened(client: WebClient, event: dict, logger: Logger): +def handle_app_home_opened(client: WebClient, context: BoltContext, logger: Logger): """Publish the App Home view when a user opens the app's Home tab.""" try: - user_id = event["user"] + user_id = context.user_id view = build_app_home_view() client.views_publish(user_id=user_id, view=view) except Exception as e: diff --git a/openai-agents-sdk/listeners/events/app_mentioned.py b/openai-agents-sdk/listeners/events/app_mentioned.py index fe41646..4a0bea6 100644 --- a/openai-agents-sdk/listeners/events/app_mentioned.py +++ b/openai-agents-sdk/listeners/events/app_mentioned.py @@ -3,7 +3,7 @@ from logging import Logger from agents import Runner -from slack_bolt import Say +from slack_bolt import BoltContext, Say from slack_sdk import WebClient from agent import CaseyDeps, casey_agent @@ -22,14 +22,16 @@ CONTEXTUAL_EMOJIS = ["+1", "raised_hands", "rocket", "tada", "bulb", "fire"] -def handle_app_mentioned(client: WebClient, event: dict, logger: Logger, say: Say): +def handle_app_mentioned( + client: WebClient, context: BoltContext, event: dict, logger: Logger, say: Say +): """Handle @Casey mentions in channels.""" try: - channel_id = event["channel"] - team_id = event.get("team") + channel_id = context.channel_id + team_id = context.team_id text = event.get("text", "") thread_ts = event.get("thread_ts") or event["ts"] - user_id = event["user"] + user_id = context.user_id # Strip the bot mention from the text cleaned_text = re.sub(r"<@[A-Z0-9]+>", "", text).strip() diff --git a/openai-agents-sdk/listeners/events/message.py b/openai-agents-sdk/listeners/events/message.py index b1d7097..90e4023 100644 --- a/openai-agents-sdk/listeners/events/message.py +++ b/openai-agents-sdk/listeners/events/message.py @@ -2,7 +2,7 @@ from logging import Logger from agents import Runner -from slack_bolt import Say +from slack_bolt import BoltContext, Say from slack_sdk import WebClient from agent import CaseyDeps, casey_agent @@ -21,7 +21,9 @@ CONTEXTUAL_EMOJIS = ["+1", "raised_hands", "rocket", "tada", "bulb", "fire"] -def handle_message(client: WebClient, event: dict, logger: Logger, say: Say): +def handle_message( + client: WebClient, context: BoltContext, event: dict, logger: Logger, say: Say +): """Handle direct messages sent to Casey.""" # Skip bot messages and message subtypes (edits, deletes, etc.) if event.get("bot_id") or event.get("subtype"): @@ -32,11 +34,11 @@ def handle_message(client: WebClient, event: dict, logger: Logger, say: Say): return try: - channel_id = event["channel"] - team_id = event.get("team") + channel_id = context.channel_id + team_id = context.team_id text = event.get("text", "") thread_ts = event.get("thread_ts") or event["ts"] - user_id = event["user"] + user_id = context.user_id # Get conversation history history = conversation_store.get_history(channel_id, thread_ts) diff --git a/openai-agents-sdk/listeners/views/issue_modal.py b/openai-agents-sdk/listeners/views/issue_modal.py index e79513f..6791d35 100644 --- a/openai-agents-sdk/listeners/views/issue_modal.py +++ b/openai-agents-sdk/listeners/views/issue_modal.py @@ -1,7 +1,7 @@ from logging import Logger from agents import Runner -from slack_bolt import Ack +from slack_bolt import Ack, BoltContext from slack_sdk import WebClient from agent import CaseyDeps, casey_agent @@ -9,13 +9,15 @@ from listeners.views.feedback_block import create_feedback_block -def handle_issue_submission(ack: Ack, body: dict, client: WebClient, logger: Logger): +def handle_issue_submission( + ack: Ack, body: dict, client: WebClient, context: BoltContext, logger: Logger +): """Handle modal submission: open DM, post issue, and run Casey agent.""" ack() try: - team_id = body["user"]["team_id"] - user_id = body["user"]["id"] + team_id = context.team_id + user_id = context.user_id values = body["view"]["state"]["values"] category = values["category_block"]["category_select"]["selected_option"][ "value" diff --git a/pydantic-ai/listeners/actions/feedback.py b/pydantic-ai/listeners/actions/feedback.py index ab9d5c6..fd34ab8 100644 --- a/pydantic-ai/listeners/actions/feedback.py +++ b/pydantic-ai/listeners/actions/feedback.py @@ -1,16 +1,18 @@ from logging import Logger -from slack_bolt import Ack +from slack_bolt import Ack, BoltContext from slack_sdk import WebClient -def handle_feedback(ack: Ack, body: dict, client: WebClient, logger: Logger): +def handle_feedback( + ack: Ack, body: dict, client: WebClient, context: BoltContext, logger: Logger +): """Handle thumbs up/down feedback on Casey's responses.""" ack() try: - channel_id = body["channel"]["id"] - user_id = body["user"]["id"] + channel_id = context.channel_id + user_id = context.user_id message_ts = body["message"]["ts"] feedback_value = body["actions"][0]["value"] diff --git a/pydantic-ai/listeners/events/app_home_opened.py b/pydantic-ai/listeners/events/app_home_opened.py index b715f97..9ef37ee 100644 --- a/pydantic-ai/listeners/events/app_home_opened.py +++ b/pydantic-ai/listeners/events/app_home_opened.py @@ -1,14 +1,15 @@ from logging import Logger +from slack_bolt import BoltContext from slack_sdk import WebClient from listeners.views.app_home_builder import build_app_home_view -def handle_app_home_opened(client: WebClient, event: dict, logger: Logger): +def handle_app_home_opened(client: WebClient, context: BoltContext, logger: Logger): """Publish the App Home view when a user opens the app's Home tab.""" try: - user_id = event["user"] + user_id = context.user_id view = build_app_home_view() client.views_publish(user_id=user_id, view=view) except Exception as e: diff --git a/pydantic-ai/listeners/events/app_mentioned.py b/pydantic-ai/listeners/events/app_mentioned.py index 192a27f..acb0860 100644 --- a/pydantic-ai/listeners/events/app_mentioned.py +++ b/pydantic-ai/listeners/events/app_mentioned.py @@ -2,7 +2,7 @@ import re from logging import Logger -from slack_bolt import Say +from slack_bolt import BoltContext, Say from slack_sdk import WebClient from agent import DEFAULT_MODEL, CaseyDeps, casey_agent @@ -21,14 +21,16 @@ CONTEXTUAL_EMOJIS = ["+1", "raised_hands", "rocket", "tada", "bulb", "fire"] -def handle_app_mentioned(client: WebClient, event: dict, logger: Logger, say: Say): +def handle_app_mentioned( + client: WebClient, context: BoltContext, event: dict, logger: Logger, say: Say +): """Handle @Casey mentions in channels.""" try: - channel_id = event["channel"] - team_id = event.get("team") + channel_id = context.channel_id + team_id = context.team_id text = event.get("text", "") thread_ts = event.get("thread_ts") or event["ts"] - user_id = event["user"] + user_id = context.user_id # Strip the bot mention from the text cleaned_text = re.sub(r"<@[A-Z0-9]+>", "", text).strip() diff --git a/pydantic-ai/listeners/events/message.py b/pydantic-ai/listeners/events/message.py index fc666fc..03a757f 100644 --- a/pydantic-ai/listeners/events/message.py +++ b/pydantic-ai/listeners/events/message.py @@ -1,7 +1,7 @@ import random from logging import Logger -from slack_bolt import Say +from slack_bolt import BoltContext, Say from slack_sdk import WebClient from agent import DEFAULT_MODEL, CaseyDeps, casey_agent @@ -20,7 +20,9 @@ CONTEXTUAL_EMOJIS = ["+1", "raised_hands", "rocket", "tada", "bulb", "fire"] -def handle_message(client: WebClient, event: dict, logger: Logger, say: Say): +def handle_message( + client: WebClient, context: BoltContext, event: dict, logger: Logger, say: Say +): """Handle direct messages sent to Casey.""" # Skip bot messages and message subtypes (edits, deletes, etc.) if event.get("bot_id") or event.get("subtype"): @@ -31,11 +33,11 @@ def handle_message(client: WebClient, event: dict, logger: Logger, say: Say): return try: - channel_id = event["channel"] - team_id = event.get("team") + channel_id = context.channel_id + team_id = context.team_id text = event.get("text", "") thread_ts = event.get("thread_ts") or event["ts"] - user_id = event["user"] + user_id = context.user_id # Get conversation history history = conversation_store.get_history(channel_id, thread_ts) diff --git a/pydantic-ai/listeners/views/issue_modal.py b/pydantic-ai/listeners/views/issue_modal.py index be670fc..35c591f 100644 --- a/pydantic-ai/listeners/views/issue_modal.py +++ b/pydantic-ai/listeners/views/issue_modal.py @@ -1,6 +1,6 @@ from logging import Logger -from slack_bolt import Ack +from slack_bolt import Ack, BoltContext from slack_sdk import WebClient from agent import DEFAULT_MODEL, CaseyDeps, casey_agent @@ -8,13 +8,15 @@ from listeners.views.feedback_block import create_feedback_block -def handle_issue_submission(ack: Ack, body: dict, client: WebClient, logger: Logger): +def handle_issue_submission( + ack: Ack, body: dict, client: WebClient, context: BoltContext, logger: Logger +): """Handle modal submission: open DM, post issue, and run Casey agent.""" ack() try: - team_id = body["user"]["team_id"] - user_id = body["user"]["id"] + team_id = context.team_id + user_id = context.user_id values = body["view"]["state"]["values"] category = values["category_block"]["category_select"]["selected_option"][ "value"