1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
use std::io;
use tracing::{debug, warn};
use crate::protocol::NotifyKind;
use super::shell;
pub(super) fn handle_shell_notification_effects(
effects: Vec<shell::ClientShellNotificationEffect>,
sound_config: &crate::config::SoundConfig,
) {
for effect in effects {
match effect {
shell::ClientShellNotificationEffect::Sound { sound, agent } => {
let agent = agent.as_deref().and_then(crate::detect::parse_agent_label);
if sound_config.allows(agent) {
crate::sound::play(sound, sound_config);
}
}
shell::ClientShellNotificationEffect::Terminal { title, body } => {
if let Err(err) = crate::terminal_notify::show_notification(&title, body.as_deref())
{
warn!(err = %err, "failed to emit terminal notification");
}
}
shell::ClientShellNotificationEffect::System { title, body } => {
if let Err(err) =
crate::platform::show_desktop_notification(&title, body.as_deref())
{
warn!(err = %err, "failed to emit system notification");
}
}
}
}
}
pub(super) fn handle_notify(
kind: NotifyKind,
message: &str,
body: Option<&str>,
sound_config: &crate::config::SoundConfig,
) {
handle_notify_with_notifiers(
kind,
message,
body,
sound_config,
crate::terminal_notify::show_notification,
crate::platform::show_desktop_notification,
);
}
pub(super) fn handle_notify_with_notifiers(
kind: NotifyKind,
message: &str,
body: Option<&str>,
sound_config: &crate::config::SoundConfig,
mut show_terminal_notification: impl FnMut(&str, Option<&str>) -> io::Result<bool>,
mut show_system_notification: impl FnMut(&str, Option<&str>) -> io::Result<bool>,
) {
match kind {
NotifyKind::Sound => {
let Some(sound) = sound_from_notify_message(message) else {
warn!(
message = message,
"received unknown sound notification from server"
);
return;
};
if sound_config.enabled {
crate::sound::play(sound, sound_config);
}
}
NotifyKind::Toast => {
debug!(
message = message,
"received terminal toast notification from server"
);
if let Err(err) = show_terminal_notification(message, body) {
warn!(err = %err, "failed to emit terminal notification");
}
}
NotifyKind::SystemToast => {
debug!(
message = message,
"received system toast notification from server"
);
if let Err(err) = show_system_notification(message, body) {
warn!(err = %err, "failed to emit system notification");
}
}
}
}
pub(super) fn sound_from_notify_message(message: &str) -> Option<crate::sound::Sound> {
match message {
"agent done" => Some(crate::sound::Sound::Done),
"agent attention" => Some(crate::sound::Sound::Request),
_ => None,
}
}
|