Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
ef5e216
feat(session): OSC 633;E command-line scanner
kingb Aug 31, 2026
8e6f035
test(session): use repeat_n in the oversized-sequence test
kingb Aug 31, 2026
08e1bb3
feat(session): surface the shell's command line from the merged OSC scan
kingb Aug 31, 2026
7657167
feat(shell-integration): hooks report the command line (OSC 633;E)
kingb Aug 31, 2026
ea2bc3e
fix(shell-integration): gate the bash command-line report on a prompt…
kingb Aug 31, 2026
e43af28
fix(shell-integration): dedupe bash command reports against history s…
kingb Aug 31, 2026
727e41e
feat(app): crash-safe debounced session snapshot writer
kingb Aug 31, 2026
81cf8d6
feat(app): capture window, tab, split, cwd, and last-command state co…
kingb Aug 31, 2026
8ceaf6b
fix(app): mark the session snapshot dirty at every structural mutation
kingb Aug 31, 2026
14e673a
feat(settings): session restore mode, capture toggle, delete saved se…
kingb Aug 31, 2026
cb7e9e8
fix(settings): action rows activate on Enter or Space only, never on …
kingb Aug 31, 2026
cb27b8c
feat(app): session snapshot load, quarantine, and archive rotation
kingb Aug 31, 2026
b391096
fix(app): archive names never collide and quarantine failures are logged
kingb Aug 31, 2026
ed0ded4
feat(app): split_ops rebuild-plan and restore age humanizing
kingb Aug 31, 2026
b43acd4
feat(render): draw the restore-on-launch modal in both render paths
kingb Aug 31, 2026
68bf58c
feat(app): restore modal state machine and full session skeleton rebuild
kingb Aug 31, 2026
fa4ba14
fix(app): replay restored splits at the saved size, close the stale p…
kingb Aug 31, 2026
bd794f0
feat(app): pre-type the last command at the restored prompt, unsent
kingb Aug 31, 2026
804b888
fix(app,session): close command-capture leak, bash exit status, and C…
kingb Aug 31, 2026
16970f3
Merge main: Linux window smoke CI + fmt/clippy gate restoration
kingb Sep 1, 2026
59c4f86
style: rustfmt over the new session-restore test code
kingb Sep 1, 2026
d34472c
style: drop a needless reference in the archive-collision test
kingb Sep 1, 2026
8949d71
fix(restore): spawn the restored shell when no resize event is coming
kingb Sep 1, 2026
aabeeb4
feat(restore): typing through the restore prompt starts fresh and kee…
kingb Sep 2, 2026
d188362
fix(restore): modifier chords pass over the restore prompt instead of…
kingb Sep 2, 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
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/ember-app/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ ember-session.workspace = true
ember-render.workspace = true
ember-platform.workspace = true
winit.workspace = true
serde.workspace = true
serde_json.workspace = true
toml.workspace = true
# The EMBER_FONT_DEBUG logger: surfaces cosmic-text's internal font
Expand Down
1,388 changes: 1,331 additions & 57 deletions crates/ember-app/src/main.rs

Large diffs are not rendered by default.

33 changes: 32 additions & 1 deletion crates/ember-app/src/screenshot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,13 @@ pub struct Opts {
pub hover_tab: Option<usize>,
/// Draw a sample "Close this tab?" confirm modal over the panes.
pub confirm: bool,
/// Draw the restore-on-launch modal's Main screen over the panes, with
/// representative fixture text (Task 8's own headless-verification
/// hook — see `RestoreView`'s doc for what the two screens show).
pub restore_main: bool,
/// Draw the restore-on-launch modal's `Older…` screen over the panes,
/// with a fixture 3-entry archive list.
pub restore_older: bool,
/// Split drop-zone preview on the focused pane: `(horizontal, ratio)`.
pub split_preview: Option<(bool, f32)>,
/// How long to let the shells produce output before capturing.
Expand Down Expand Up @@ -104,6 +111,8 @@ impl Default for Opts {
tab_drag: None,
hover_tab: None,
confirm: false,
restore_main: false,
restore_older: false,
split_preview: None,
settle_ms: 700,
backdrop: false,
Expand Down Expand Up @@ -173,6 +182,8 @@ pub fn parse(args: &[String]) -> Result<Opts, String> {
opts.hover_tab = Some(next()?.parse().map_err(|e| format!("--hover-tab: {e}"))?)
}
"--confirm" => opts.confirm = true,
"--restore-main" => opts.restore_main = true,
"--restore-older" => opts.restore_older = true,
"--help-overlay" => opts.help_overlay = true,
"--settings" => opts.settings = true,
"--tab-drag" => {
Expand Down Expand Up @@ -424,7 +435,9 @@ pub fn run(opts: Opts) -> Result<String, String> {
let mut config = ember_core::Config::default();
config.font.family = opts.font.clone();
config.font.size = opts.font_size;
let rows = ember_core::resolve_rows(&config);
// A headless doc/preview shot has no live session-state dir to
// count, so the "Delete saved sessions" row never appears here.
let rows = ember_core::resolve_rows(&config, 0);
let sel = rows
.iter()
.position(|r| r.label == "Font family")
Expand Down Expand Up @@ -470,6 +483,24 @@ pub fn run(opts: Opts) -> Result<String, String> {
confirm_label: "Close".to_string(),
focused: 0,
}),
restore: if opts.restore_main {
Some(ember_render::RestoreView::Main {
header: "Restore 2 windows, 3 tabs (from 2h ago)?".to_string(),
focused: 0,
})
} else if opts.restore_older {
Some(ember_render::RestoreView::Older {
header: "Restore 2 windows, 3 tabs (from 2h ago)?".to_string(),
rows: vec![
"2h ago · 2 windows, 3 tabs".to_string(),
"1d ago · 1 window, 1 tab".to_string(),
"3 weeks ago · 3 windows, 5 tabs".to_string(),
],
selected: 0,
})
} else {
None
},
hold_ring: opts.hold_ring,
// No offline `--screenshot` flag for these (v0.4.0): both are live
// cross-window-drag/tear-off previews with no meaningful "just render
Expand Down
Loading
Loading