Commit graph

297 commits

Author SHA1 Message Date
Armin Ronacher
f1927c2d56 feat(tui,coding-agent): configurable fullscreen wheel scrolling with auto acceleration
Adds fullscreenWheelScrollLines ("auto" or 1-100). Auto keeps one line
per event in local macOS terminals and scales with wheel velocity
elsewhere, capped at six lines per event.

closes #9758
2026-09-29 09:57:53 +02:00
Armin Ronacher
b485fa3128 fix(tui,coding-agent): reduce render cost of theme changes and streaming
Theme previews re-render the whole transcript, and streaming re-renders
every frame, so per-line and per-session work dominated in long sessions.

- visibleWidth: fast path for ANSI-styled ASCII, allocation-free escape scanning
- Box: compare unpadded child lines and skip a second width measurement
- Markdown: reuse parsed tokens across invalidation
- footer: cache usage totals and context usage per session state
- bash results: cache the collapsed preview including the expand hint
- sanitizeBinaryOutput: single regex replace
2026-09-29 08:23:46 +02:00
Armin Ronacher
bf8e4b9531
feat(coding-agent,tui): System theme (#10067)
* feat(coding-agent,tui): add system theme derived from terminal colors

The new default system theme builds pi's colors from the terminal's reported foreground, background, and ANSI palette. Tokens take their hue and relative saturation from a palette slot; lightness is placed by OKLab lightness difference and WCAG 2 contrast minimums. Terminals that report only a background get built-in hues, and terminals that report nothing get ANSI indices with faint secondary text.

The TUI queries OSC 10, 11, and 4 in one burst ended by DA1, so replies complete in one round trip, and reports replies that arrive after the timeout. Startup never waits: the system theme starts in grayscale and updates when colors arrive. Light/dark detection now uses the reported colors instead of the ?996 query; mode 2031 notifications trigger a new query.

* fix(coding-agent): wait for terminal colors before building the startup header

The header and startup notices bake theme colors into their text. When the color replies arrived after they were built, as in Windows Terminal, they stayed grayscale. Startup now waits for the first color query, which ends at the DA1 reply or after 100 ms.

* fix(coding-agent): rebuild header and notices on theme changes

The startup header, loaded resources, and chat notices baked theme colors into their text, so they kept the old colors after a theme switch or when the system theme received the terminal's colors. They now use ThemedText, which rebuilds its text from a function whenever the UI is invalidated.

* fix(tui): keep focus on components that forward mouse events to children

A component that forwards a mouse event to a child it hosts, such as SettingsList with an open submenu, left keyboard focus on the child. When the host removed the child, focus stayed on a detached component and all keys were lost. The forwarding component now keeps focus, like delegating containers do.

* feat(coding-agent): describe the system theme in the theme selector

* feat(coding-agent): list the system theme above automatic in the theme selector

* refactor(coding-agent,tui): remove leftovers of the light/dark startup detection

Theme detection only reports dark or light now; the source and confidence fields only served saving the detected theme. The first-time setup no longer shows the detected appearance. Removes the TUI's unused queryTerminalColorScheme(), queryTerminalBackgroundColor(), queryTerminalForegroundColor(), and parseOsc11BackgroundColor(); queryTerminalColors() covers them.

* feat(coding-agent): match the reviewed system and light/dark theme design

The system theme now follows the reviewed design: color families with OKHSL saturation curves, palette slots per family, contrast rules per token and panel, relaxation for mid-gray backgrounds, and the terminal foreground for body text. Each contrast level is a target-lightness curve fitted to the reviewed output. The built-in dark and light themes use the reviewed Pi dark and light colors.

* feat(coding-agent): show the pi logo in the startup header

A two-line pixel logo replaces the app name. Its first line carries the version, its second line the first line of key hints.

* feat(tui,coding-agent): support OKHSL colors in themes

parseColor() accepts okhsl(H S L), and okhslColor() and colorToOkhsl() construct and read OKHSL colors. OKHSL saturation is relative to the sRGB gamut, so every value is in gamut. Theme files accept okhsl() values; HTML exports convert them to hex. The OKHSL code moves from coding-agent into pi-tui, where colors.ts now shares its Oklab conversion instead of keeping a second copy.

* refactor(coding-agent): write the built-in themes in OKHSL

The built-in dark and light themes use okhsl() values, with variables for colors that several roles share, so they read as color families and serve as editable templates. Near-identical values collapsed into one; no color changes visibly.

* refactor(coding-agent,tui): simplify terminal color and theme code

Share the terminal color query between startup and the theme controller, merge the query's resolve/late-reply state into one callback, keep a single global for terminal colors, use oklab.ts arrays directly in colors.ts, and drop leftover helpers and exports.

* fix(coding-agent): use one terminal light/dark decision everywhere

Theme pairs, the system theme, and Theme.appearance now share getTerminalTheme(): the reported background decides, then the terminal's light/dark report, then COLORFGBG, then dark.

COLORFGBG is classified by palette index like Vim (0-6 and 8 dark) and only reads the last field, so rxvt's "default" no longer picks up the foreground index.

Simplify the tests added on this branch.

* fix(ai): use an OpenRouter model that still exists in beta test

OpenRouter removed anthropic/claude-3-haiku, which broke type checking in CI after model regeneration.
2026-09-26 13:33:47 +02:00
David Brailovsky
b3487650f6 fix(tui): keep cursor visible when overlays close after stop
Closing the last overlay hid the terminal cursor. If an extension closed
an overlay during session shutdown, this ran after stop() had restored
the cursor, leaving the shell with an invisible cursor.

closes #10026
2026-09-25 13:30:50 +02:00
Armin Ronacher
ca7460d16b feat: build with TypeScript 7 and run sources with plain node
Replace the tsgo native preview with typescript@7.0.2 and port the check scripts to the TS 7 API. Target ES2024, drop useDefineForClassFields: false and unused decorator options, and enable verbatimModuleSyntax. Replace tsx with node plus the source resolver hook, passed to --import as a file URL.

closes #9965
2026-09-25 13:14:33 +02:00
Ramiz Wachtler
7cf037c218
fix(tui): choose Kitty image dimensions by aspect distortion (#9957) 2026-09-24 20:51:10 +02:00
Armin Ronacher
d5629e2048 fix(tui): autocomplete paths after opening wrappers like ( and backticks 2026-09-24 15:08:54 +02:00
Armin Ronacher
5674690966
feat(tui,coding-agent): add color values and theme styling (#8398)
Expose theme colors as values and add theme.style() for combined styling.

- @earendil-works/pi-tui gains a Color type (palette index, sRGB, OKLCH) with parseColor(), mixColors(), colorToHex(), colorToRgb(), styleText() and related helpers.
- Theme JSON accepts #rgb and oklch(...) values and an optional appearance ("dark" or "light"), detected from the theme colors when omitted.
- theme.style() combines tokens or concrete colors with text attributes; theme.colors exposes concrete colors, including the terminal's reported default colors (OSC 10/11) for tokens set to "".
- Terminals with TERM=*-direct are detected as truecolor.
2026-09-24 14:42:22 +02:00
Armin Ronacher
36af9dc48e fix(tui): restore skill prefix autocomplete, closes #9944 2026-09-23 14:32:09 +02:00
Ramiz Wachtler
8c72793785
fix(tui): prevent jump-to-end label from shifting when scrollbar hides (#9842)
- center the label independently of scrollbar visibility
- clip drawing and click bounds before the scrollbar
- fixes #9136
2026-09-21 17:16:06 +02:00
初心Yearth
d7951ec362
fix(tui): rank skill autocomplete by bare name (#9120) 2026-09-20 00:25:43 +02:00
Armin Ronacher
fa0e1f48ac fix(tui): improve LaTeX compatibility and layouts
closes #8827
2026-09-19 23:28:04 +02:00
xu0o0
bfa6862400
fix(tui): handle CJK punctuation in file autocomplete (#9746) 2026-09-19 21:53:26 +02:00
Armin Ronacher
60e7e76bd7 fix(coding-agent): surface clipboard backend failures
closes #9618
2026-09-16 01:29:52 +02:00
Armin Ronacher
caf6dfe731
feat(tui): Simplify clipboard handling (#9163)
Replace the external clipboard dependency with small macOS, Windows,
and X11 helpers and integrate them into coding-agent.

Run native clipboard operations on worker threads and make command
fallbacks asynchronous. Preserve incremental X11 transfers, legacy text
encodings, native image formats, and existing Wayland and platform tools.

Include native prebuilds with ARM64 page alignment, packaging updates,
and regression coverage.
2026-09-05 23:52:32 +02:00
Alexey Zaytsev
ab9e6f89b4
feat(tui): accelerate Alt-modified wheel scrolling (#9166) 2026-09-05 13:14:11 +02:00
Armin Ronacher
9841914c71 fix(tui): keep list selection unchanged on mouse hover 2026-09-05 00:46:34 +02:00
Armin Ronacher
2d41163332 fix(tui): make fullscreen transcript search scale linearly 2026-09-04 10:22:04 +02:00
Cristina Poncela Cubeiro
457ae8c79c
feat(tui): alt mode scrollbar but prettier (#8801) 2026-09-04 00:05:47 +02:00
Armin Ronacher
79680533c6 feat(tui): add clickable jump-to-end indicator to fullscreen transcript
Adds TuiAltScreenOptions.scrollToEndIndicator, composited onto the last
row of the follow-end primary scroll view while it is scrolled up. A left
press on the label resumes end-following. Minimal rebuild of #9080.
2026-09-03 22:54:59 +02:00
Cristina Poncela Cubeiro
1d9787c11f
feat(tui): prettier Working... spinner (#8799) 2026-09-03 20:34:04 +02:00
Cristina Poncela Cubeiro
7d399e7be8
feat(tui): search improvements (#8800) 2026-09-03 15:09:51 +02:00
Anton Geraschenko
c505f4c198
fix(tui): remove coding-agent config reads from pi-tui
Fixes #8698
2026-09-03 11:59:14 +02:00
xu0o0
f0592205f8
feat(tui): render relational algebra join symbols & fix(coding-agent): type error in test (#9050)
* feat(tui): render relational algebra join symbols

* fix(coding-agent): update interactive mode test fixture
2026-09-03 10:45:02 +02:00
David Brailovsky
487af8e168 Merge remote-tracking branch 'origin/main' into dev 2026-09-01 14:48:57 +00:00
Bartłomiej Kida
605a1b0385
fix(tui): wrap SIGWINCH self-signal so restricted seccomp policies do not crash startup (#8898) 2026-09-01 14:16:21 +02:00
Sviatoslav Abakumov
6492144773
fix(tui): detect Zed terminal capabilities (#8828) 2026-09-01 11:03:34 +02:00
Mario Zechner
d24c99f44d feat(tui): add large transcript render benchmark 2026-09-01 02:17:43 +02:00
Cristina Poncela Cubeiro
758a0ee9b7 Merge branch 'main' into dev
# Conflicts:
#	packages/agent/CHANGELOG.md
#	packages/ai/scripts/generate-models.ts
#	packages/ai/src/providers/cloudflare-ai-gateway.ts
#	packages/ai/test/zai-coding-plan-models.test.ts
#	packages/coding-agent/src/modes/interactive/interactive-mode.ts
#	packages/tui/src/tui-alt-screen.ts
2026-08-28 13:19:43 +02:00
Cristina Poncela Cubeiro
4e49492999
feat(tui): allow disable copy on fullscreen, ctrl + x copies selection (#8731) 2026-08-27 18:07:54 +02:00
Armin Ronacher
e86823096c feat(tui): add terminal capability overrides closes #8665 2026-08-26 17:40:36 +02:00
Cristina Poncela Cubeiro
1ac6128e66
fix(tui): make alt screen not segment on - and / (#8676)
* fix(tui): make alt screen not segment on - and /

* cleanup
2026-08-26 14:33:47 +02:00
Vegard Stikbakke
6c4f360264 fix(tui): chunk large main-screen renders closes #8028 2026-08-26 13:08:48 +02:00
Cristina Poncela Cubeiro
b37ebb7f22
fix(tui): autocomplete orders nested results (#8669) 2026-08-26 12:03:41 +02:00
Mario Zechner
2470ea4404 fix(tui): let drag select text over the editor
The editor consumed left mouse presses to position the cursor, which made
the alternate screen route the whole gesture to it and never start its
screen-level text selection. Handle the synthesized click event instead so
press/drag/release stay available for selection and copy.
2026-08-26 11:59:50 +02:00
David Brailovsky
8798b7996d Merge remote-tracking branch 'origin/main' into dev 2026-08-24 07:50:17 +00:00
Armin Ronacher
27b7a626de fix(coding-agent): use Windows-friendly keybinding defaults
closes #8372
2026-08-23 23:30:16 +02:00
Armin Ronacher
7d4c0e05dd
feat(coding-agent): bundle Node runtime (#8474) 2026-08-22 21:19:38 +02:00
Ramiz Wachtler
8f2ae3fadd
fix(tui): prevent wrapped table link color leaks (#8363) 2026-08-20 15:58:47 +02:00
David Brailovsky
ee6a5d29f2 Merge remote-tracking branch 'origin/main' into dev 2026-08-17 13:20:15 +00:00
Armin Ronacher
374e56e553 fix(tui): avoid duplicate VS Code right-click paste
closes #8186
2026-08-17 11:40:38 +02:00
Mario Zechner
71026970a0 feat(tui): add reusable mouse interaction support 2026-08-14 15:26:27 +02:00
Panoplos
4caa3c440b
fix(tui): route selection copy through the host clipboard (#8110)
TuiAltScreen.copySelectionToClipboard() wrote a bare OSC 52 sequence and
flashed "Copied!" unconditionally. Terminals that ignore OSC 52 clipboard
writes (macOS Terminal.app, VTE terminals, tmux without OSC 52 passthrough)
left the system clipboard untouched while the toast reported success.

Add an injectable copySelection option to TuiAltScreenOptions (an async
handler returning whether the copy succeeded) and use it when provided,
falling back to the existing OSC 52 write otherwise. The coding agent now
injects its native clipboard implementation (clipboard addon + pbcopy /
wl-copy / xclip / xsel), so selection copy reaches the real clipboard and
the toast only fires on verified success, with "Copy failed" otherwise.

Closes #7761

Co-authored-by: 富永 誠 <makoto@credify.one>
2026-08-14 11:46:46 +02:00
Mario Zechner
83aed2ba58 fix(tui): handle generic SGR mouse releases
closes #7963
2026-08-14 10:11:15 +02:00
David Brailovsky
2e4d239594 fix(tui): give focused fullscreen overlays wheel and viewport keys
Skip TuiAltScreen viewport consume for wheel and alt-screen scroll
keys when a visible overlay has focus. Transcript search still owns
those events so the transcript can move while the find box is open.

fixes #7894
2026-08-12 10:02:32 +02:00
Armin Ronacher
534bcbffb7 fix(tui): handle LaTeX control spaces across line endings 2026-08-11 23:19:24 +02:00
David Brailovsky
2a95ef70db fix(tui): apply PI_TUI_ESC_TIMEOUT only to lone ESC
Split StdinBuffer's incomplete-sequence wait from the lone-ESC wait so SSH and PI_TUI_ESC_TIMEOUT can reassemble split Alt+Enter without delaying Escape or mouse/CSI buffering.
2026-08-11 12:53:06 +02:00
Vegard Stikbakke
452923b54a fix(tui): parse multiline LaTeX arguments
Closes #7760
2026-08-11 12:37:45 +02:00
David Brailovsky
9c53c47f80 fix indent 2026-08-11 09:49:08 +00:00
Michael Renner
4a879dd759
fix(tui): avoid repainting idle fullscreen sessions on focus loss (#7892)
* fix(tui): avoid idle focus-loss repaint

* fix(tui): skip zero-width focus-loss repaint

* fix(tui): clarify focus-loss selection check
2026-08-11 11:13:37 +02:00