summaryrefslogtreecommitdiff
path: root/src/Terminal.zig
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-09-28 20:51:06 -0300
committerGabriel Schneider <[email protected]>2026-10-01 00:12:15 -0300
commit015152bb7e28a26d135fc4bc67b09a5f53d5080b (patch)
treed5ed31d3a0dee08e07c54f045f2fd0c13e2e4d8c /src/Terminal.zig
parent78ee8672307adbdf30a2afffc38efb70217dc212 (diff)
downloadpardes-015152bb7e28a26d135fc4bc67b09a5f53d5080b.tar.gz
pardes-015152bb7e28a26d135fc4bc67b09a5f53d5080b.zip
A shell that exits under a run answers exit N, and the log says exit before del
A dogfood agent ran `exit 3` through pty/run: the reader got ENOENT, and the log went straight to del. The hosts now read a shell's exit status at its pty's end as they do a command's; a run waiting on the line answers `exit 3` with what it printed, the log says `exit <serial> 3` before the pane's `del`, and an open run still stats after its pane is gone (cat fstats its input). Pins cloud9 f35b7ed, whose stat of an open fid names its open. Writes to a gone pane's pty/data, held open or not, fail ENOENT. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Diffstat (limited to 'src/Terminal.zig')
-rw-r--r--src/Terminal.zig9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/Terminal.zig b/src/Terminal.zig
index 19e23624..a390b76b 100644
--- a/src/Terminal.zig
+++ b/src/Terminal.zig
@@ -961,6 +961,15 @@ pub const CommandOutput = struct {
/// What the newest finished command printed: the screen text between its
/// C and D marks, read from at most `max_rows` rows above its end, so a
/// command that printed the whole history costs no more than its tail.
+/// The shell exited in the middle of a command (its `exit 3`): no end mark
+/// will come, so the command's output ends where the cursor is.
+pub fn endOutputHere(pane: *Pane) void {
+ if (comptime !enabled) return;
+ const state = pane.terminal orelse return;
+ const marks = &state.stream.handler;
+ if (marks.phase == .running and marks.out_end == null) marks.pinCursor(&marks.out_end, true);
+}
+
pub fn commandOutput(pane: *Pane, gpa: std.mem.Allocator, max_rows: usize) !CommandOutput {
// Unless there is text to read, whether the nothing it printed is the
// whole of it.