Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
a106d61
refactor(task): positive_pid accepts ASCII digits only, drop the thre…
ReagentX Oct 7, 2026
6203579
refactor(client): render picks a base/overlay pair, one tab_hint, Edi…
ReagentX Oct 7, 2026
d633ada
refactor(harness): one registry lookup, drop the type re-exports, aft…
ReagentX Oct 7, 2026
0dfe0d8
refactor(wire): Lifecycle and PreviewSource labels as methods, FLEETC…
ReagentX Oct 7, 2026
964b242
test(integration): base64 crate for b64, one Scratch tree in common, …
ReagentX Oct 7, 2026
f8e3385
refactor(protocol): drop the pre-v3 control-frame hello arm and the v…
ReagentX Oct 7, 2026
f745b29
refactor(core,terminal): ScreenFacts implemented on Emulator, TermSiz…
ReagentX Oct 7, 2026
aa4f4c4
refactor(harness,terminal): drop omp's model_label override, one live…
ReagentX Oct 7, 2026
05400a0
test(testutil): shared screen, rows, hook_json and with_shell helpers…
ReagentX Oct 7, 2026
dd17883
test(harness,daemon): summary_tests aliases the shared rows helper, d…
ReagentX Oct 7, 2026
70f7192
test(app): drop no-op post-spawn pumps, merge mirror and section-orde…
ReagentX Oct 7, 2026
f16b0eb
test(core): snapshot/watch/wait_exited/straggler fixtures in supervis…
ReagentX Oct 7, 2026
2053132
refactor: pub replaces pub(crate) crate-wide, clippy::redundant_pub_c…
ReagentX Oct 7, 2026
c31f2df
fix: update reference in contents function documentation from Emulato…
ReagentX Oct 7, 2026
ccbffc9
refactor: improve documentation clarity in harness module and tests
ReagentX Oct 7, 2026
3a5cc51
refactor: enhance documentation clarity in emulator and golden modules
ReagentX Oct 7, 2026
efcfb28
refactor: improve documentation clarity in daemon-related tests and c…
ReagentX Oct 7, 2026
3bc7458
refactor: enhance documentation clarity across multiple modules and t…
ReagentX Oct 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
authors = ["Christopher Sardegna <fleetcom@reagentx.net>"]
categories = ["command-line-interface", "command-line-utilities"]
description = "A fleet-view supervisor for concurrent shell commands."
description = "A fleet-view supervisor for shell commands and managed agents."
edition = "2024"
exclude = [".github", "docs", "tests", ".gitignore", ".gitattributes"]
keywords = ["cli", "tui", "pty", "supervisor", "process"]
Expand Down
2 changes: 1 addition & 1 deletion docs/agent-resume.md
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ Implement `Harness` in [`src/harness/mod.rs`](../src/harness/mod.rs) for each to
- `shape`: supply the program word and resume selector. Use the word to identify the tool on the Agent page and in session files. In `harness::intent_args`, place the selector and ID first in resume argv.
- `session_flag`: specify the flag for pinning a session ID on a fresh launch, or return `None` (the default) for tool-assigned IDs. In `harness::plan`, build the conversation-selection argv from this flag and the resume selector.
- `overlay`: return argv elements to append after conversation selection, environment entries, and any launch notice. Pass the elements directly to the binary and report the notice through the supervisor after a successful spawn.
- `parse_capture`: read an ID from the capture file's contents. The task leader's PID and the launch-time home are supplied; when other processes can reach the capture channel, use them to refuse a payload the task's own process did not write.
- `parse_capture`: read an ID from the capture file's contents. The task leader's PID is supplied; when other processes can reach the capture channel, use it to refuse a payload the task's own process did not write.
- `live_session_id`: read the ID published on disk for a live session. Return `None` by default when no registry is available.
- `live_blocked_status`: read that registry for blocked-on-user status. Return preview text, never an ID; return `None` by default.
- `resolve_home`: resolve configuration needed by instrumentation, capture parsing, or the live registry. Return `None` by default.
Expand Down
28 changes: 11 additions & 17 deletions src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ pub struct App {
pub agent_sel: usize,
/// Id of the attached task, if any: by id (not index) so it survives the
/// task list changing underneath it.
pub focused_id: Option<u64>,
focused_id: Option<u64>,
/// Return destination for `Ctrl-]`. Set on attachment only if the target
/// is marked as flagship in the current snapshot. Retain after the
/// flagship's exit so the user can still return. Clear on every exit from
Expand Down Expand Up @@ -291,7 +291,8 @@ pub struct App {
pub session_page: SessionPage,
/// Selection in the recovery list, clamped independently of `session_sel`.
pub recovery_sel: usize,
/// Transient one-line notice (save/load result), dismissed on the next key.
/// One-line status message for daemon events, reconnect and paste outcomes, or
/// the ignored-scrollback warning. Clear it on the next key.
pub status: Option<String>,
/// Ephemeral notice text, priority, and creation time.
notice: Option<(String, NoticeLevel, Instant)>,
Expand Down Expand Up @@ -638,7 +639,7 @@ impl App {
}

/// Flattened section order: the sequence the selection cursor moves through.
pub fn display_order(&self) -> Vec<usize> {
fn display_order(&self) -> Vec<usize> {
self.sections().into_iter().flat_map(|(_, v)| v).collect()
}

Expand Down Expand Up @@ -1176,7 +1177,7 @@ impl App {
}

/// Return whether nonempty input matches no existing group.
pub(crate) fn group_is_new(&self) -> bool {
pub fn group_is_new(&self) -> bool {
!self.group_input.is_empty() && self.group_candidates.len() < 2
}

Expand Down Expand Up @@ -1237,7 +1238,7 @@ impl App {
}

fn on_key(&mut self, out: &mut impl Write, k: KeyEvent) {
// Any key dismisses a lingering save/load notice.
// Clear the previous status notice before handling a key.
self.status = None;
// Global escape hatch, except while attached (Ctrl-C belongs to the child).
// Ctrl-C disconnects: it leaves the daemon and tasks running.
Expand Down Expand Up @@ -1684,22 +1685,22 @@ impl App {
}
}
Mode::Spawn if self.spawn_page == SpawnPage::Agent => {
paste_into(&mut self.agent_input, s);
self.agent_input.paste(s);
self.refresh_agent_candidates();
}
Mode::Spawn | Mode::SaveSession | Mode::Rename(_) => {
paste_into(&mut self.input, s);
self.input.paste(s);
}
Mode::PickDir => {
paste_into(&mut self.dir_input, s);
self.dir_input.paste(s);
self.refresh_dir_candidates();
}
Mode::PickGroup(_) => {
paste_into(&mut self.group_input, s);
self.group_input.paste(s);
self.refresh_group_candidates();
}
Mode::Find => {
paste_into(&mut self.find_input, s);
self.find_input.paste(s);
self.refresh_find_candidates();
}
_ => {}
Expand Down Expand Up @@ -2086,13 +2087,6 @@ fn task_matches(v: &TaskView, needle: &str) -> bool {
.any(|field| field.to_lowercase().contains(needle))
}

/// Insert pasted text at the caret after removing control characters.
fn paste_into(buf: &mut EditBuffer, s: &str) {
for c in s.chars().filter(|c| !c.is_control()) {
buf.insert(c);
}
}

/// Split a typed path into its directory prefix and trailing search fragment. Apply the
/// matching rules for each candidate type to the fragment.
fn split_input(input: &str) -> (&str, &str) {
Expand Down
Loading
Loading