@@ -918,9 +918,10 @@ def handle_hook(self, hook_data: Dict[str, Any]):
918918 f"PostToolUse response for { tool_name } : { json .dumps (tool_response , indent = 2 ) if isinstance (tool_response , dict ) else tool_response } "
919919 )
920920
921- # Check if response indicates an error (type: "error" or has error field)
921+ # Check if response indicates an error (type: "error" or has non-empty error field)
922922 if isinstance (tool_response , dict ) and (
923- tool_response .get ("type" ) == "error" or "error" in tool_response
923+ tool_response .get ("type" ) == "error"
924+ or (tool_response .get ("error" ) and tool_response .get ("error" ) != "" )
924925 ):
925926 event_type = "error"
926927 error_msg = tool_response .get (
@@ -948,27 +949,51 @@ def handle_hook(self, hook_data: Dict[str, Any]):
948949 notif_type = hook_data .get ("notification_type" , "" )
949950 raw_message = hook_data .get ("message" , "" )
950951
952+ # Debug log to understand what triggers notifications
953+ logger .debug (
954+ f"Notification received - type: { notif_type } , message: { raw_message [:200 ] if raw_message else 'None' } "
955+ )
956+
951957 if "error" in notif_type .lower ():
952958 event_type = "error"
953959 message = hook_data .get ("message" , "An error occurred" )
954- else :
955- # This is likely a permission/confirmation request
956- event_type = "input_needed"
957-
958- # Extract what Claude needs permission for
959- if "permission to use" in raw_message :
960- # Extract tool name from "Claude needs your permission to use [Tool]"
961- tool_match = re .search (r"permission to use (\w+)" , raw_message )
962- if tool_match :
963- tool_requested = tool_match .group (1 )
964- message = f"[{ display_project_name } ] Permission needed for { tool_requested } "
965- custom_tts = f"{ tts_project_name } , needs permission for { tool_requested } "
960+ elif raw_message : # Only process if there's actually a message
961+ # Check if this is truly a permission/confirmation request
962+ permission_keywords = [
963+ "permission to use" ,
964+ "permission needed" ,
965+ "needs your permission" ,
966+ "confirm" ,
967+ "approve" ,
968+ "allow" ,
969+ ]
970+
971+ if any (keyword in raw_message .lower () for keyword in permission_keywords ):
972+ event_type = "input_needed"
973+ # Extract what Claude needs permission for
974+ if "permission to use" in raw_message :
975+ # Extract tool name from "Claude needs your permission to use [Tool]"
976+ tool_match = re .search (r"permission to use (\w+)" , raw_message )
977+ if tool_match :
978+ tool_requested = tool_match .group (1 )
979+ message = (
980+ f"[{ display_project_name } ] Permission needed for { tool_requested } "
981+ )
982+ custom_tts = (
983+ f"{ tts_project_name } , needs permission for { tool_requested } "
984+ )
985+ else :
986+ message = f"[{ display_project_name } ] { raw_message } "
987+ custom_tts = f"{ tts_project_name } , { raw_message } "
966988 else :
967- message = f"[{ display_project_name } ] { raw_message } "
968- custom_tts = f"{ tts_project_name } , { raw_message } "
989+ message = f"[{ display_project_name } ] Input needed "
990+ custom_tts = f"{ tts_project_name } , input needed "
969991 else :
970- message = f"[{ display_project_name } ] Input needed"
971- custom_tts = f"{ tts_project_name } , input needed"
992+ # Not a permission request - log it but don't notify
993+ logger .debug (
994+ f"Notification ignored (not a permission request): { raw_message [:100 ]} "
995+ )
996+ return # Skip notification
972997
973998 # Send notification if we have an event
974999 if event_type and message :
0 commit comments