Delayed send
Delayed Send schedules an Enter keypress in an existing terminal after a delay you choose. The terminal must already contain staged command text — Delayed Send does not type the command, it only fires Enter via the native Enter bridge when the timer expires.
What it is
Delayed Send is useful when you want to stage a long-running command, walk away, and have Ghostex press Enter at a specific time — for timed deploys, scheduled test runs, or giving an agent time to finish output before submission.
At expiry Ghostex calls sendTerminalEnter (native Enter bridge), not a literal \r text injection. Only terminal sessions support Delayed Send — browser and editor panes show an error toast.
Opening Delayed Send
| Option | What it does |
|---|---|
Ctrl+Shift+S | Default hotkey (Settings → Hotkeys → Pane Actions) |
Session context menu | Delayed Send |
Command palette | Delayed Send pane action (command mode >) |
Native terminal title bar | Hover action delayedSend |
Sidebar clock icon | Click to reopen modal with remaining time |
Modal UI
| Option | What it does |
|---|---|
Delayed Send | Modal title |
Press Enter in {sessionTitle} after this delay. | Modal description |
Hours / Minutes / Seconds | Duration fields (minutes focused and selected by default) |
Enter a delay between 1 second and 24 days. | Validation hint — max ~2,147,483,647 ms |
Set Timer | Schedule or reschedule (replaces existing timer) |
Cancel Timer | Destructive button when a timer is already active |
Current timer sends in {MM:SS}. | Shown when reopening an active countdown |
Schedule workflow
- Stage command text in the terminal — do not press Enter yet.
- Open Delayed Send via hotkey, context menu, palette, or titlebar action.
- Set Hours, Minutes, Seconds (default focus: 5 minutes selected in the minutes field).
- Click Set Timer → toast: Delayed Send scheduled — Presses Enter in {duration}.
- Countdown appears on the sidebar leading clock icon, pane tab tooltip, and floating terminal badge (updates every 1 s).
- At expiry Ghostex sends Enter once; the timer clears automatically.
Cancel and reschedule
- Reopen the modal while a timer runs — fields prefilled from remaining time.
- Cancel Timer clears the in-memory timeout and persisted delayedSendDeadlineAt.
- Set Timer with a new duration replaces the existing timer.
- Toast on cancel: Delayed Send canceled.
- Toast when canceling with no active timer: No Delayed Send timer is active.
Persistence and restore
delayedSendDeadlineAt is stored on the terminal session record and survives app restart.
- On relaunch, Ghostex restores timers with a 2 s grace period (DELAYED_SEND_RESTORE_FIRE_GRACE_MS) before firing.
- Closing, reloading, or forking a session clears its Delayed Send timer.
- UI projection fields: delayedSendRemainingLabel (e.g. 04:32) and delayedSendRemainingMs.
Sleep interaction
- Sleep Inactive skips terminals with active Delayed Send timers.
- Agent Auto Sleep skips terminals with active Delayed Send timers.
- The focused agent session is always excluded from Agent Auto Sleep regardless.
- Terminals stay awake until the scheduled send fires, then normal sleep rules apply.
The sidebar clock icon takes precedence over tag and pin icons on session cards while a timer is active.
Settings
| Option | What it does |
|---|---|
hotkeys.delayedSend | Rebindable in Settings → Hotkeys → Pane Actions (default: ctrl+shift+s) |
There is no separate Delayed Send on/off toggle — the feature is always available for terminal sessions.
Tips
- Verify staged text before Set Timer — Delayed Send cannot be undone after Enter fires.
- Use the sidebar clock icon to check remaining time without opening the full modal.
- Reschedule instead of cancel+recreate when you only need a few more minutes.
- Delayed Send works in command-pane terminals the same as workspace agent terminals.
- Pair with Agent Auto Sleep disabled or long idle timers so sleep does not interfere before send.