发布

  • feat: configurable notifications in the Rust CLI (#793)

    frostbyte_neo 发布于 2025-05-03 02:48:13 +00:00

    With this change, you can specify a program that will be executed to get
    notified about events generated by Codex. The notification info will be
    packaged as a JSON object. The supported notification types are defined
    by the UserNotification enum introduced in this PR. Initially, it
    contains only one variant, AgentTurnComplete:

    pub(crate) enum UserNotification {
        #[serde(rename_all = "kebab-case")]
        AgentTurnComplete {
            turn_id: String,
    
            /// Messages that the user sent to the agent to initiate the turn.
            input_messages: Vec<String>,
    
            /// The last message sent by the assistant in the turn.
            last_assistant_message: Option<String>,
        },
    }
    

    This is intended to support the common case when a "turn" ends, which
    often means it is now your chance to give Codex further instructions.

    For example, I have the following in my ~/.codex/config.toml:

    notify = ["python3", "/Users/mbolin/.codex/notify.py"]
    

    I created my own custom notifier script that calls out to
    terminal-notifier to
    show a desktop push notification on macOS. Contents of notify.py:

    #!/usr/bin/env python3
    
    import json
    import subprocess
    import sys
    
    
    def main() -> int:
        if len(sys.argv) != 2:
            print("Usage: notify.py <NOTIFICATION_JSON>")
            return 1
    
        try:
            notification = json.loads(sys.argv[1])
        except json.JSONDecodeError:
            return 1
    
        match notification_type := notification.get("type"):
            case "agent-turn-complete":
                assistant_message = notification.get("last-assistant-message")
                if assistant_message:
                    title = f"Codex: {assistant_message}"
                else:
                    title = "Codex: Turn Complete!"
                input_messages = notification.get("input_messages", [])
                message = " ".join(input_messages)
                title += message
            case _:
                print(f"not sending a push notification for: {notification_type}")
                return 0
    
        subprocess.check_output(
            [
                "terminal-notifier",
                "-title",
                title,
                "-message",
                message,
                "-group",
                "codex",
                "-ignoreDnD",
                "-activate",
                "com.googlecode.iterm2",
            ]
        )
    
        return 0
    
    
    if __name__ == "__main__":
        sys.exit(main())
    

    For reference, here are related PRs that tried to add this functionality
    to the TypeScript version of the Codex CLI:

    下载附件