aboutsummaryrefslogtreecommitdiff
path: root/src/config/model.rs
AgeCommit message (Collapse)Author
2026-07-25feat: switch IME to ASCII in prefix mode on Windows (Korean IME) (#1823)joonhwan
* feat: switch IME to ASCII in prefix mode on Windows Extend switch_ascii_input_source_in_prefix to Windows: detect IME state via WM_IME_CONTROL and toggle to ASCII with SendInput for the Korean IME. Other IME languages are detected and left unchanged. refs #1802 * docs: clarify Windows (Korean IME) support for prefix ASCII switching Follow-up to the Windows prefix ASCII switch, which extended switch_ascii_input_source_in_prefix to Windows but left the surrounding text describing macOS only. - Settings row label: "(macOS)" -> "(macOS/Windows)", plus its test. - Generalize the Windows behavior wording to "switches the IME to English (ASCII) input" in the config-reference.json entry and the model.rs doc comment, and state that Windows support is currently limited to the Korean IME. - Add a :::caution aside noting the Korean-IME-only limitation to the en/ja/zh preview docs, keeping the three translations in sync. refs #1802 * fix: warn when prefix IME toggle injection is incomplete SendInput can queue fewer events than requested (for example when blocked by UIPI), which would otherwise leave the IME silently stuck in ASCII or native mode. Log a warning with the sent and expected counts so the failure is diagnosable. refs #1802 * fix: guard prefix IME restore and correct open-status naming Address maintainer review on the Windows prefix ASCII switch: - Restore only when safe: store the foreground window at switch time and, before toggling back, require that the same window is still focused and the IME is still in English. This stops restore from toggling another application or overriding a manual return to Hangul during prefix mode. - Report injection success from send_vk_tap and only arm restoration when the initial toggle landed; on a partial injection retry the dropped key-up so a key is not left logically held down. The injection policy is split into send_vk_tap_with(inject) so the success, partial, and failure branches are unit-tested without the real SendInput. - Correct the WM_IME_CONTROL sub-command naming: 0x0005 is IMC_GETOPENSTATUS (IME open state), not IMC_GETCONVERSIONMODE. Behavior is unchanged; the constant, comments, and tests now describe the open-status read. refs #1802 * fix: bound IME open-status read with a timeout The prefix IME switch reads IMC_GETOPENSTATUS via WM_IME_CONTROL, which crosses into the terminal-emulator process. A plain SendMessageW would block herdr's client thread until that process responds, indefinitely if it hangs. Read through SendMessageTimeoutW with SMTO_ABORTIFHUNG and a short timeout instead; on timeout the switch is skipped and restore does nothing, so a hung host process can no longer freeze prefix-mode entry or exit. refs #1802 * fix: preserve windows ime restoration after partial injection refs #1802 --------- Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-07-18feat: add optional workspace name promptOgulcan Celik
2026-07-16feat: configure collapsed sidebar startup stateOgulcan Celik
refs #1463
2026-07-13feat: add configurable sidebar metadata tokensOgulcan Celik
2026-07-11feat: add copy-on-select settingOgulcan Celik
2026-07-11feat: add maki agent support (#1302)Tony Solomonik
* feat: add maki detection support Maki always draws a one-line status bar at the bottom of the screen, so the manifest reads just that row: a braille spinner before the `[BUILD]`/`[PLAN]`/`[BASH]` mode label means working, the bare label means idle. Blocked states come from the panels that replace the input box, the `Permission Required` dialog with its `y Allow`/`n Deny` hint rows and the `Plan complete` form. Maki emits no OSC title or progress, so these screen rules are the only evidence. Also wires `maki` through process-name identification, per-agent sound overrides, and the website manifest catalog. * docs: stage maki detection docs
2026-07-10fix: stop windows installer from rewriting configOgulcan Celik
refs #1162
2026-07-02fix: draw host cursor on windowsOgulcan Celik
refs #930
2026-06-30fix: reuse remote ssh connectionOgulcan Celik
refs #888
2026-06-30feat: hide single-tab tab rowOgulcan Celik
refs #448
2026-06-30feat: add hidden collapsed sidebar modeOgulcan Celik
refs #842
2026-06-29feat: generate socket protocol schemaOgulcan Celik
2026-06-22fix: let user keybinds displace defaultsOgulcan Celik
refs #747
2026-06-21fix: add configurable pane gapsOgulcan Celik
refs #271
2026-06-18feat: add background update check togglesOgulcan Celik
refs #677
2026-06-18fix: scope image paste shortcut to remoteOgulcan Celik
refs #647
2026-06-17feat: sort agent panel by priorityOgulcan Celik
refs #318
2026-06-15feat: add devin cli detection and restore support (#622)Eric Yue
* feat: add devin cli detection and restore support refs #606 * fix: keep devin integration session-only --------- Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-06-07fix(update): keep windows installs on previewOgulcan Celik
2026-06-06feat: improve toast ergonomicsOgulcan Celik
refs #486
2026-06-05feat: add pane navigation controlsOgulcan Celik
refs #421 refs #330 related discussions: https://github.com/ogulcancelik/herdr/discussions/422 https://github.com/ogulcancelik/herdr/discussions/438 https://github.com/ogulcancelik/herdr/discussions/442
2026-06-03feat: switch input source during prefix mode (#434)sf-jin-ku
On macOS, opt-in under [experimental], temporarily switch the host input source to the current ASCII-capable layout while prefix mode is active so prefix commands register even when a CJK IME is composing, then restore the previous input source when prefix mode exits or is cancelled. No-op when the current source is already ASCII-capable, on non-macOS platforms, or when any input source call fails. Pane text input is unaffected. Also pin next_resize_poll in next_loop_deadline_includes_selection_autoscroll_deadline so the selection autoscroll deadline stays the earliest; the default resize poll could otherwise beat it and flake the assertion. refs #400 Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-06-02feat: add preview update channelOgulcan Celik
2026-06-01fix: restore agents through pane shellsOgulcan Celik
2026-06-01feat: keep remote bridge alive with an ssh config keepalive fallback (#355)SunskyXH
2026-06-01feat: detect kilo code cliOgulcan Celik
refs #270
2026-06-01feat: add configurable right-click passthroughOgulcan Celik
refs #148
2026-05-30fix: use login shells for macos panesOgulcan Celik
refs #350
2026-05-28feat: add pane copy modeOgulcan Celik
refs #231
2026-05-27feat: configure mobile width threshold (#317)kangal-bot
2026-05-26feat: add global last-pane navigationOgulcan Celik
refs #287
2026-05-25feat: make focus-gain redraw configurableOgulcan Celik
refs #282
2026-05-24feat: persist pane history across restarts (#248)zhugehyuk
refs #217 Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-05-24feat: make navigate movement keybinds configurableOgulcan Celik
refs #193
2026-05-24feat: add session navigatorOgulcan Celik
refs #157
2026-05-23feat: restore agent sessionsOgulcan Celik
refs #233
2026-05-23feat: configure new terminal cwdOgulcan Celik
2026-05-22feat: add git worktree workspace managementOgulcan Celik
refs #137
2026-05-22feat: add configurable mouse scroll linesOgulcan Celik
refs #236
2026-05-21feat: use local keybindings for remote attachOgulcan Celik
2026-05-21fix: keep cjk ime agent allow-list safeOgulcan Celik
refs #149
2026-05-21feat(experimental): add reveal_hidden_cursor_for_cjk_ime opt-in for CJK IME ↵ChihGodlee
tracking When the focused pane requests ?25l (cursor hidden) but paints its own cursor — common in TUIs like Claude Code, pi, and codex — macOS native input methods stop tracking the candidate-window position. CJK users (Chinese / Japanese / Korean) cannot see candidate windows follow as they type. Setting [experimental] reveal_hidden_cursor_for_cjk_ime = true exposes the focused pane's cursor anchor to the outer terminal regardless of the pane's hidden-cursor request, restoring IME tracking for CJK input. [experimental] cjk_ime_agents is an optional allow-list. When empty, the reveal applies to any focused pane. When non-empty (e.g. ["claude", "codex"]), the reveal only applies if the focused pane's detected agent matches one of the listed names. This lets users enable the workaround only for AI-agent TUIs that paint their own cursor, leaving plain shells and other programs untouched. Accepted names: pi, claude, codex, gemini, cursor, cline, opencode, copilot, kimi, kiro, droid, amp, grok, hermes. Unknown names are ignored. When the pane reports no cursor position (cursor_state returns None for some TUIs), the anchor falls back to the pane's top-left so a stable IME hint is always available. [experimental] cjk_ime_cursor_shape (default "steady_block") controls the DECSCUSR shape rendered for the revealed cursor; six variants are accepted: block, steady_block, underline, steady_underline, bar, steady_bar. Trade-off when enabled: a hardware cursor will be visible in the outer terminal for apps that hide the cursor without painting a replacement. Default false preserves the behavior set in 2c95071. Pair the reveal with cjk_ime_agents to scope it to specific TUIs. Manually verified on macOS 26.5 aarch64 with system Pinyin IME against Claude Code: candidate window tracks cursor with flag enabled, returns to anchored-at-start behavior with flag disabled. refs #149
2026-05-20fix: clarify keybinding conflict warningsOgulcan Celik
refs #154
2026-05-20feat: add keybinding v2Ogulcan Celik
refs #154 refs #201 refs #202 refs #219
2026-05-20feat: add configurable default shellOgulcan Celik
refs #196
2026-05-18feat: configure sidebar min/max width via [ui] (#135)CHIH,GODLEE
* feat: configure sidebar min/max width via [ui] Expose the previously hardcoded MIN_SIDEBAR_WIDTH / MAX_SIDEBAR_WIDTH clamps as [ui] sidebar_min_width / sidebar_max_width. Defaults remain 18 / 36 so existing configs are unchanged. Hot-reload is wired through the existing [ui] block; reload re-clamps the live width to the new bounds so tightening takes effect immediately. Reject inverted bounds (min > max) at every entry point so a bad config can never reach u16::clamp(min, max), which panics: App::new falls back to defaults, and apply_live_config treats the whole [ui] section as invalid and returns a partial reload report. refs #132 * test: keep sidebar reload width within bounds refs #132 --------- Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-05-17chore: rename fullscreen keybinding to zoomOgulcan Celik
2026-05-16feat: add immediate new tab optionOgulcan Celik
refs #123
2026-05-16feat: add scrollback editor keybindOgulcan Celik
refs #122
2026-05-15feat: add indexed keybind familiesOgulcan Celik