feat(mcp): enhance multi-platform notification resilience and reactive wakeups

- AgentApiNotifier: Sort candidate process sessions by creation time descending to prioritize the latest active IDE session over stale PIDs. Implement automatic retry across candidate address/token pairs and persist working credentials to shared environment files (~/.gemini/jetski/.jetski_env and ~/.artemis/.artemis_env).
- DesktopNotifier: Enable native OS desktop toast notifications by default on macOS, Linux, and Windows unless explicitly disabled or running in CI. Ensure MCP installer sets ARTEMIS_DESKTOP_NOTIFY=true in generated IDE configurations.
- ScriptNotifier: Add universal command hook adapter (ARTEMIS_NOTIFY_CMD / MCP_NOTIFY_COMMAND) for custom IDE and CLI integration.
- Fault Isolation: Wrap CompositeNotifier and global notify entrypoint in strict try-except blocks to guarantee zero-crash execution even if any individual notifier fails.
- Tests & Docs: Add unit tests for session recovery, fault tolerance, script hook execution, and document multi-platform notification architecture in README.
This commit is contained in:
somew1nd committed 2026-08-19 11:34:46 -07:00
1 parent 4927c4f0b9
commit c1a4b49a21
9 files changed
+468 -110

No files matched your search

+14 -2
View File
@@ -27,14 +27,26 @@ logger = logging.getLogger("mcp_server.notifiers.desktop")
class DesktopNotifier(BaseNotifier):
"""Notifier that displays native desktop notifications when explicitly enabled."""
"""Notifier that displays native desktop notifications across macOS, Linux, and Windows."""
@property
def name(self) -> str:
return "desktop"
def is_available(self) -> bool:
return os.getenv("ARTEMIS_DESKTOP_NOTIFY", "").lower() in ("1", "true", "yes")
try:
val = os.getenv("ARTEMIS_DESKTOP_NOTIFY", "").lower()
if val in ("0", "false", "no", "off"):
return False
if os.getenv("CI", "").lower() in ("1", "true", "yes") and val not in ("1", "true", "yes"):
return False
if sys.platform == "linux" and not shutil.which("notify-send"):
return False
if sys.platform == "darwin" and not shutil.which("osascript"):
return False
return True
except Exception:
return False
def notify(
self,