Skip to content

Commit 3aea328

Browse files
authored
Merge pull request #9 from Helmi/bugfix/false-notifications
fix: prevent false error notifications for NotebookEdit and spurious input alerts
2 parents 4bc2f0b + 03b7908 commit 3aea328

1 file changed

Lines changed: 43 additions & 18 deletions

File tree

src/ccnotify/notify.py

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)