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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
//! Internal app events delivered via channel.
//!
//! Background tasks (PTY child watchers, future hook listeners, etc.) send
//! events to the main loop through this channel. No polling needed.
use std::time::Instant;
use crate::detect::{Agent, AgentState};
use crate::layout::PaneId;
use crate::workspace::{GitStatusCacheEntry, WorkspaceGitStatus};
#[derive(Debug)]
pub struct WorktreeAddResult {
pub path: std::path::PathBuf,
pub result: Result<(), String>,
}
#[derive(Debug)]
pub struct WorktreeRemoveResult {
pub workspace_id: String,
pub path: std::path::PathBuf,
pub result: Result<(), String>,
}
/// An event from a background task to the main loop.
#[derive(Debug)]
pub enum AppEvent {
/// A pane's child process exited.
PaneDied { pane_id: PaneId },
/// Fallback detector state changed in a pane.
StateChanged {
pane_id: PaneId,
agent: Option<Agent>,
state: AgentState,
visible_blocker: bool,
visible_working: bool,
process_exited: bool,
observed_at: Instant,
},
/// Hook-authoritative agent state was reported for a pane.
HookStateReported {
pane_id: PaneId,
source: String,
agent_label: String,
state: AgentState,
message: Option<String>,
custom_status: Option<String>,
seq: Option<u64>,
session_ref: Option<crate::agent_resume::AgentSessionRef>,
},
/// Agent session identity was reported without state authority.
AgentSessionReported {
pane_id: PaneId,
source: String,
agent_label: String,
seq: Option<u64>,
session_ref: Option<crate::agent_resume::AgentSessionRef>,
session_start_source: Option<String>,
},
/// Display-only agent metadata was reported for a pane.
HookMetadataReported {
pane_id: PaneId,
source: String,
agent_label: Option<String>,
applies_to_source: Option<String>,
title: Option<String>,
display_agent: Option<String>,
custom_status: Option<String>,
state_labels: std::collections::HashMap<String, String>,
clear_title: bool,
clear_display_agent: bool,
clear_custom_status: bool,
clear_state_labels: bool,
seq: Option<u64>,
ttl: Option<std::time::Duration>,
},
/// Hook authority was explicitly cleared for a pane.
HookAuthorityCleared {
pane_id: PaneId,
source: Option<String>,
seq: Option<u64>,
},
/// The current detected agent gracefully released this pane back to the shell.
HookAgentReleased {
pane_id: PaneId,
source: String,
agent_label: String,
known_agent: Option<Agent>,
seq: Option<u64>,
},
/// A new version is available through the active installation manager.
UpdateReady {
version: String,
install_command: String,
},
/// Remote agent detection manifest update check finished.
AgentDetectionManifestsUpdated {
updated: Vec<crate::detect::manifest_update::ManifestUpdateCommit>,
status: crate::detect::manifest_update::ManifestUpdateStatus,
},
/// A pane child emitted a valid OSC 52 clipboard write. The main loop
/// re-emits it through herdr's own clipboard writer.
ClipboardWrite { content: Vec<u8> },
/// A pane child reported its shell current directory through terminal
/// metadata such as OSC 7.
TerminalCwdReported {
pane_id: PaneId,
cwd: std::path::PathBuf,
},
/// Background git status refresh completed for workspaces.
GitStatusRefreshed {
results: Vec<WorkspaceGitStatus>,
cache_updates: Vec<(std::path::PathBuf, GitStatusCacheEntry)>,
},
/// A plugin action or event command finished.
PluginCommandFinished {
log_id: String,
finished_unix_ms: u64,
exit_code: Option<i32>,
stdout: String,
stderr: String,
error: Option<String>,
},
/// Background `git worktree add` completed.
WorktreeAddFinished(WorktreeAddResult),
/// Background `git worktree remove` completed.
WorktreeRemoveFinished(WorktreeRemoveResult),
}
|