* feat: add shell mode (`!`) to the CLI Add shell mode, letting users run shell commands directly from the prompt with `!`. Output streams live into the transcript, supports backgrounding (ctrl+b), cancellation (Esc / Ctrl+C), input queuing while running, and enters the conversation context with resume support. * feat(kimi-code): show shell mode label on editor border and add tip Render a "! shell mode" label on the top-left of the editor border while the editor is in `!` bash mode, so the active mode is visible at a glance. Also add a rotating toolbar tip (`! to run a shell command`) to surface the feature. * feat(kimi-code): refine shell mode queue, history, and display - Keep `!` commands out of input history so they never resurface as bare text stripped of their `!`. - Make `!` commands non-steerable: Ctrl-S skips them (they stay queued to run after the current task) and the steer hint is only shown when something is actually steerable. - Render queued `!` commands with a `$` prompt and the shell-mode hue so they read as commands, not as text to send to the model. - Echo executed shell commands with a `$` prompt instead of `!`. * fix(kimi-code): sanitize shell output and harden rendering Captured shell command output can contain terminal control sequences (colours, cursor moves, alternate-screen switches, OSC hyperlinks, carriage-return spinners, bells). pi-tui's Text passes strings straight to the terminal, so any unhandled sequence was executed by the terminal and fought with pi-tui's own cursor control, producing the blank-screen-plus-leftover-characters mess after running commands like pnpm dev or a nested TUI. - Sanitize CSI (incl. private modes), OSC, single-char ESC and C0 control chars (keeping newline and tab) in both the finished/resume view (previously unsanitized) and the running tail. - Make the sanitize, format, and ShellRunComponent render paths never-throw, and cap the live running buffer, so a misbehaving command cannot crash the TUI. - Dispose transcript children on clear so ShellRunComponent's timer is released on /clear or session switch. * fix(kimi-code): render shell command echo with $ instead of sparkles The shell command echo is a 'user' transcript entry, so UserMessageComponent prefixed it with the USER_MESSAGE_BULLET (sparkles), producing 'sparkles $ command'. Add an optional bullet override to UserMessageComponent / TranscriptEntry and set it to an empty string for the shell echo (both live and resume), so the '$ command' content sits at the leading column where the sparkles marker used to be. Normal user messages keep the sparkles bullet. * fix(kimi-code): enter shell mode when pasting a !-prefixed command The bash-mode trigger only handled the single ! keystroke, so a pasted !cmd was inserted as literal text in prompt mode and submitted as a normal message. After pi-tui inserts pasted content, detect an empty-prompt buffer that now starts with !, switch to bash mode, and strip the leading ! so the buffer holds only the command, matching the typed ! path. * fix(kimi-code): restore shell mode when recalling a queued command recallLastQueued() dropped the queued item's mode, and the Up-arrow recall only restored the text. A queued ! command (queued while another command runs, which resets the editor to prompt mode) therefore came back as a normal prompt and was submitted as a message instead of a shell command. Return the full QueuedMessage from recallLastQueued() and restore editor.inputMode (plus the onInputModeChange sync) from the recalled item's mode. * feat(kimi-code): use violet as the shell mode color Replace the claude-code-style magenta/rose shellMode token with a violet that is distinct from plan-mode blue, the user role amber, success green, error red, and the teal accent. Custom themes that omit the token fall back to this new default via the base+overrides merge, so existing custom themes keep working unchanged. * chore: refine the shell mode changeset * docs: document shell mode Add a Shell mode section to the interaction guide and list the ! and Ctrl+B shortcuts in the keyboard reference, in both English and Chinese. * test(protocol): include shell events in volatile classification check shell.output and shell.started were added as volatile event types for shell mode; update the snapshot test's volatile-type list and count accordingly. * fix(agent-core): surface shell command failure reason with no output When a ! shell command fails without producing stdout/stderr (non-zero exit with no output, timeout, spawn failure), the failure reason lived only in the tool result's output and the TUI showed '(no output)'. Fold it into stderr so the live view and replay show what went wrong. * fix(kimi-code): decode CSI-u ! to enter shell mode In terminals with the Kitty keyboard protocol (VSCode integrated terminal, Kitty), pressing ! arrives as a CSI-u sequence, so the raw normalized === '!' comparison never matched and shell mode could not be entered by typing !. Decode with printableChar before comparing, matching every other printable-key check in the TUI. * fix(kimi-code): do not steer while a shell command is running Ctrl-S steers queued input into the running turn, but a shell command is not an agent turn, so steering during streamingPhase === 'shell' would launch a turn before the command output is recorded. Keep Ctrl-S a no-op during shell runs; queued messages stay queued. * fix(agent-core): escape bash tag delimiters in shell output Shell command output is arbitrary text; if it contains a bash tag delimiter such as </bash-stdout>, the recorded pseudo-XML wrapper breaks and replay extracts the wrong slice. Escape the content when wrapping it in agent-core and unescape when extracting during replay, so output survives round-trip intact. * docs: document the shellMode theme token The shellMode color token was added to the palette but not propagated to its mirrors. Add it to the custom-theme docs token table, the theme JSON schema, and the custom-theme skill token list. * feat(agent-core): reset background task deadline on detach Add a resettable deadline timer to BackgroundManager and let tasks register a detach timeout; when a foreground task is moved to the background, its deadline resets to the background default counted from the detach moment. Wire this into shell mode so ! commands run with a 3-minute foreground timeout and get 10 minutes once detached to the background, instead of staying bounded by the original 60-second foreground deadline. * feat(agent-core): lower shell mode foreground timeout to 2 minutes
5.1 KiB
Keyboard Shortcuts
Kimi Code CLI's TUI interactive mode supports a set of keyboard shortcuts. The shortcuts are organized into five groups by usage context: general input, mode switching, during streaming, tool output control, the approval panel, and popup navigation. Type /help in the TUI at any time to open the built-in shortcut reference.
General Shortcuts
The following keys are always available in the input box:
| Shortcut | Function |
|---|---|
Enter |
Submit the current input |
Shift-Enter / Ctrl-J |
Insert a newline in the input |
↑ / ↓ |
Browse input history |
Esc |
Close a popup / cancel completion / interrupt streaming output or context compaction |
Ctrl-C |
Interrupt the current streaming output, or clear the input box |
Ctrl-D |
Exit Kimi Code CLI when the input box is empty |
Ctrl-T |
Expand or collapse the todo list when it is truncated |
Pressing Ctrl-C during streaming cancels immediately — no second confirmation needed.
Exiting the program (pressing Ctrl-C with an empty input box, or pressing Ctrl-D) uses a double-press confirmation mechanism: after the first press, a prompt appears in the status bar; a second press of the same key actually exits. Pressing any other key in between clears the confirmation state.
Mode Switching
| Shortcut | Function |
|---|---|
Shift-Tab |
Toggle Plan mode |
! |
Enter shell mode (in an empty input box) |
Press Shift-Tab to enable or disable Plan mode. When enabled, the Agent prioritizes read-only tools for research and planning and can write to the current plan file; Bash is subject to the current permission mode and regular rules, without any additional separate approval triggered by Plan mode. Simply toggling does not create an empty plan file. Press Shift-Tab again to exit Plan mode.
Type ! in an empty input box to enter shell mode and run terminal commands directly; while a command is running, press Ctrl+B to move it to a background task. See Interaction and input.
Input & Editing
| Shortcut | Function |
|---|---|
Ctrl-G |
Edit the current input in an external editor |
Ctrl-V |
Paste an image or video from the clipboard (Unix / macOS) |
Alt-V |
Paste an image or video from the clipboard (Windows) |
Ctrl-- |
Undo |
Pressing Ctrl-G opens an external editor, selected according to the following priority:
- The editor configured via the
/editorcommand - The
$VISUALenvironment variable - The
$EDITORenvironment variable
After saving and exiting, the edited content replaces the input box; exiting without saving leaves the input unchanged.
When pasting an image or video, a placeholder is shown in the input box — the actual media data is sent to the model when the message is submitted. The system clipboard is read first; on Linux, Wayland and X11 are tried; on WSL, PowerShell is also used as a fallback to read the Windows clipboard.
During Streaming
While streaming output is active, the input box can still receive input and supports the following additional operations:
| Shortcut | Function |
|---|---|
Ctrl-S |
Steer: inject the current input directly into the running turn |
Esc |
Interrupt the current streaming output |
Ctrl-C |
Interrupt the current streaming output |
Pressing Ctrl-S causes the model to see your message at the next interruptible point, without waiting for the current turn to finish.
Tool Output
| Shortcut | Function |
|---|---|
Ctrl-O |
Expand or collapse tool output |
When collapsed tool call results exist in the history, press Ctrl-O to toggle between collapsed and expanded views.
Approval Panel
When the Agent initiates a tool call that requires confirmation, the TUI displays an approval panel. For the full approval workflow, see Interaction & Input. The available keys inside the panel are:
| Shortcut | Function |
|---|---|
↑ / ↓ |
Move the cursor between candidate options |
Enter |
Confirm the currently selected option |
1 ~ 9 |
Directly select the option at the corresponding index |
Esc / Ctrl-C / Ctrl-D |
Reject the current request |
Ctrl-E |
Expand or collapse the full content when the panel contains a diff or file preview |
Ctrl-O |
Toggle the collapsed state of other tool output |
Options that require feedback (such as "Reject" or "Revise") switch to a feedback input state after confirmation: type the feedback text and press Enter to submit; press Esc to exit feedback input and return to the candidate list.
Popup Mode
After opening the help panel with /help, use the following keys to navigate and close it:
| Shortcut | Function |
|---|---|
↑ / ↓ |
Scroll one line at a time |
PageUp / PageDown |
Scroll 10 lines at a time |
Esc / Enter / q / Q |
Close the panel |
Next steps
- Slash Commands — Quick reference for built-in TUI control commands
kimiCommand — Complete reference for startup flags and subcommands