Commit Graph
140 Commits
Author SHA1 Message Date
Vu Anh Nguyenandcan1357 81fd90ecc0 Fix Mermaid markdown rendering on non-image terminals 2026-04-24 06:47:56 +02:00
can1357 b60c0cc3ce refactor: migrated tab width resolution to pi-utils with EditorConfig caching
- Extracted tab width resolution from pi-natives to pi-utils with EditorConfig caching support.
- Made tabWidth parameter required in native text functions (visibleWidth, truncateToWidth, wrapTextWithAnsi, sliceWithWidth, extractSegments).
- Removed process-wide tab width state management from pi-natives text module.
- Consolidated wrapper node promotion logic in chunk classification with abbreviated string representations.
- Removed path-clean and pathdiff dependencies from pi-natives.
- Updated all consuming packages to import tab width functions from pi-utils and pass explicit tabWidth parameters.
2026-04-10 14:18:36 +02:00
can1357 9b78a6fa85 refactor(natives): migrated native bindings to NAPI-RS with auto-generated types
- Migrated native bindings from TypeScript wrappers to NAPI-RS generated modules with auto-generated type definitions and runtime enums.
- Replaced chunk tree API with stateful ChunkState class supporting render, edit, and resolve operations with improved error handling.
- Converted callback signatures to error-first pattern (error, result) for shell, PTY, glob, and grep operations.
- Introduced type-safe enums for MacOSAppearance, GrepOutputMode, KeyEventType, ImageFormat, and AstMatchStrictness replacing string literals.
- Refactored chunk tree implementation with dedicated modules for edit, indent, resolve, and state management with comprehensive validation.
- Moved clipboard utilities from native bindings to coding-agent package with improved OSC 52 and Termux compatibility.
2026-04-07 02:00:59 +02:00
can1357 8e5cc87f00 revert: 535 due to TUI regressions 2026-03-26 19:56:49 +01:00
can1357 44dc0a9387 refactor(coding-agent): restructured screenshot and prompt utilities into focused helpers
- Extracted screenshot formatting logic into dedicated `formatScreenshot()` function with options support.
- Consolidated prompt source deduplication into `dedupePromptSource()` helper to prevent rule duplication.
- Refactored editor text sanitization to use `replaceTabs()` utility for consistent tab width handling.
- Added test coverage verifying editor respects configured tab width when loading text programmatically.
2026-03-26 19:23:55 +01:00
can1357 212fede427 style: format merged PR fixes 2026-03-26 19:16:48 +01:00
can1357 306ea795dc Merge review/pr-535-fix 2026-03-26 19:14:23 +01:00
can1357 f351ac636e fix(tui): avoid blank scrollback regressions 2026-03-26 19:12:50 +01:00
can1357 d841c3b778 fix(ask): restore prompt-style enter handling 2026-03-26 19:12:50 +01:00
Vu Anh Nguyen 99ce9a0fee Merge origin/main into omp-506 2026-03-26 16:22:21 +07:00
Vu Anh Nguyen 99dabb7c18 fix(ask): keep multiline custom input in prompt gutter 2026-03-26 16:14:52 +07:00
Vu Anh Nguyen 6c095245c6 fix(tui): reseed after terminal resume 2026-03-26 15:37:34 +07:00
Vu Anh Nguyen 60b6e51b25 fix(coding-agent,tui): address review regressions 2026-03-26 15:01:28 +07:00
Vu Anh Nguyen 1ca78fa041 fix(tui): redraw sparse height increases atomically 2026-03-26 10:50:44 +07:00
Vu Anh Nguyen f187e759af fix(tui): fix exit gaps, content shrink drift, and overlay cursor recovery
- Rewrite stop() to use viewport-relative cursor positioning instead of
  content-length, preventing blank gaps when content is shorter than viewport
- Replace trailing \r\n\x1b[2K clear loops in repaintViewport() and
  height-increase path with \r\n\x1b[J to avoid cursor drift past content
- Add 12 TUI regression tests for exit gaps, content shrink, and overlay
  dismiss cursor recovery
- Add 6 coding-agent controller tests for /new and /tree commands
2026-03-26 10:32:28 +07:00
Vu Anh Nguyen 14d1ba8843 fix(tui): preserve terminal scrollback during full redraws
Replace destructive \x1b[3J\x1b[2J\x1b[H full-redraw sequence with
scrollback-preserving repaint helpers:

- seedTranscript: first paint with no prior frame, writes full transcript
  without clearing scrollback
- repaintViewport: trusted-frame repaints that scroll viewport-shift
  delta into scrollback before overwriting visible rows in-place
- Height-increase handler that pushes revealed scrollback back before
  reclaiming the display

Replace requestRender(true) state destruction with a one-shot
without resetting #previousLines or cursor bookkeeping.

Track #previousHeight to detect terminal height increases that pull
scrollback lines into the visible area.

fixes #507
2026-03-26 10:32:28 +07:00
can1357 7d3ff27c64 fix(editor): corrected editor consuming rebound copy keys preventing custom bindings
- Fixed editor consuming user-rebound copy keys, preventing custom keybindings from working.
- Changed copy key detection from generic `tui.input.copy` binding to explicit `ctrl+c` check to avoid swallowing user-rebound keys.
- Added test case verifying editor does not consume keys rebound to copy action.
2026-03-22 21:13:02 +01:00
can1357 7fb18faf4c fix(coding-agent): backported pi-mono changes (1feccfed..b21b42d0)
packages/ai:
- feat: expose provider responseId on AssistantMessage
- feat: lazy-load provider modules for faster startup
- fix: hash foreign Responses API tool call IDs exceeding 64-char limit
- fix: ignore null chunks in openai-completions streams
- fix: keep image tool results inline for Gemini 3+ and Antigravity
- fix: correct Bedrock Claude 4.6 context window to 200k
- fix: support prompt caching for Bedrock application inference profiles
- fix: add OpenRouter reasoning payload format
- fix: ignore placeholder Vertex API keys
- fix: skip AJV validation in restricted runtimes
- fix: Anthropic OAuth client injection and responseId extraction
- fix: Codex incomplete/failed response status handling

packages/agent:
- fix: defer steering until after tool execution completes

packages/tui:
- feat: namespaced keybinding IDs with KeybindingsManager conflict detection
- feat: configurable select list column sizing (#2154 by @markusylisiurunen)
- fix: stream truncateToWidth for large strings
- fix: skip Termux height redraws
- fix: stop evicting unrelated default keybindings
- fix: resolve raw backspace ambiguity on Windows Terminal
- fix: clear stale scrollback on session switch (#2155 by @Perlence)
- fix: remove trailing markdown block spacing (#2152 by @markusylisiurunen)

packages/coding-agent:
- feat: add resizable share sidebar (#2435 by @dmmulroy)
- feat: emit OSC 133 command-executed marker
- feat: reload custom themes from disk watcher
- feat: add --fork session flag
- feat: file mutation queue for serialized writes
- feat: initial message consolidation utility
- fix: keybindings migrated to namespaced IDs
- fix: resolve waitForRetry() race when auto-retry produces tool calls
- fix: handle slash-delimited /model refs
- fix: refresh active model after provider updates
- fix: extended transient error patterns for retry
2026-03-22 18:28:40 +01:00
can1357 855d89cc5e feat(coding-agent): added inline markdown rendering with theme-aware styling
- Added renderInlineMarkdown() utility function to support inline markdown rendering with optional base color styling.
- Refactored ask tool to render questions and option labels with markdown formatting for improved text styling.
- Updated hook-input and hook-selector components to render titles as markdown with theme-aware styling.
- Implemented recursive token processing for nested markdown elements including bold, italic, code, links, and strikethrough.

Fixes #491
2026-03-22 12:38:07 +01:00
Scott HyndmanandGitHub e7376e8dd4 fix(tui): honored custom undo binding (#494)
- Hooked undo handling to the keybindings manager so configured shortcuts are honored.
- Added ctrl+_ to the default undo binding list to preserve legacy shortcuts.
- Extended editor tests with keybinding helpers to cover custom undo bindings.
2026-03-21 16:06:39 +01:00
daanddenandGitHub b7978c9e0d feat: add undo action and fix hotkeys rendering (#438)
* Fix prompt action undo and hotkeys rendering

* Fix prompt action test typechecks

* Simplify undo and hotkeys PR

* Fix editor formatting
2026-03-16 14:05:21 +01:00
e2f87b07ab numpad windows PUA CSI-u codes (#431)
Co-authored-by: Brit <lol@no.com>
2026-03-15 16:38:46 +01:00
can1357 8f18464cd7 feat(config): reorganized settings into 8 focused categories with 15+ new customization options
- Reorganized settings tabs from 12 to 8 focused categories (appearance, model, interaction, context, editing, tools, tasks, providers) with consolidated status line settings.
- Added 15+ new settings for status line customization, sampling parameters, speech-to-text, web search, and edit mode configuration.
- Changed default agent model from `default` to `pi/task` for independent subtask configuration and updated model resolution to support single-pattern inheritance fallback.
- Updated system prompt to use ISO 8601 date format (YYYY-MM-DD) and renamed 25+ UI labels for consistency across settings interface.
- Updated tab icon symbols across unicode, nerd, and ASCII presets to reflect new tab organization.
- Simplified settings definitions and removed unused imports to reduce code complexity.
2026-03-14 13:44:20 +01:00
can1357 b5faa7d4be feat(coding-agent): added cursor navigation to message boundaries
- Added `moveCursorToMessageStart()` and `moveCursorToMessageEnd()` prompt actions for cursor navigation to message boundaries.
- Exposed editor methods for cursor movement to message start and end positions in InputController keybindings.
- Implemented message boundary navigation in Editor class with private helper methods for cursor positioning.
- Removed remote compaction settings test suite to align with feature deprecation.
2026-03-14 13:38:29 +01:00
can1357 ca2860b200 feat: added OpenAI compatibility config and 10 new AI models with reasoning support
- Added support for provider-level OpenAI compatibility configuration enabling reasoning effort mapping and streaming usage fallback across models.
- Added 10 new AI models (DeepSeek V3.2, Llama 3.1 405B, Mistral Large 3, Pixtral Large, and others) with updated pricing and context windows.
- Fixed autocomplete to preserve ./ prefix in relative file/directory path completions and paste marker expansion to handle regex tokens literally.
- Changed system prompt date format to ISO 8601 and tool download timeout from 15s to 120s for improved cross-platform compatibility.
- Refactored OpenAI completions provider to extract token parsing logic and support choice-level usage fallback with improved message serialization.
2026-03-14 13:38:29 +01:00
can1357 2a5968ec47 fix(tui): fixed OSC 11 background color detection and query race conditions
- Fixed OSC 11 background color detection to handle partial escape sequences that arrive mid-buffer, preventing user input from being swallowed.
- Fixed race condition where overlapping OSC 11 queries would be incorrectly cancelled by DA1 sentinels from previous queries by implementing a query queueing mechanism.
- Refactored OSC 11 query handling to use queuing instead of immediate restart, improving robustness of terminal appearance detection.
- Added comprehensive test coverage for terminal appearance detection including partial buffer handling, query queueing, and debouncing behavior.
- Added test cases for theme auto-detection to verify terminal-reported appearance takes precedence over environment variables and platform-specific detection.
2026-03-11 01:11:00 +01:00
486fd4c753 refactor(theme): replace CoreFoundation FFI with OSC 11 for machine-agnostic dark/light detection (#347)
* refactor(theme): replace CoreFoundation FFI + Mode 2031 with OSC 11 for dark/light detection

Replace the 415-line Rust CoreFoundation FFI module and Mode 2031-only
detection with OSC 11 background color queries — the machine-agnostic
method used by Neovim, fish, bat, and terminal-colorsaurus.

Detection stack:
- OSC 11 query + DA1 sentinel at startup (works over SSH, mobile clients)
- Mode 2031 subscribe: re-queries OSC 11 with 100ms debounce (Neovim
  convention) instead of trusting binary dark/light value directly
- 2s OSC 11 poll for terminals without Mode 2031 (Warp, Alacritty,
  WezTerm, iTerm2); self-disables once Mode 2031 fires
- COLORFGBG env var fallback (free, no I/O)
- macOS defaults read fallback (Zellij edge case)

Deleted:
- crates/pi-natives/src/appearance.rs (414 lines of unsafe FFI)
- packages/natives/src/appearance/ (66 lines of TS bindings)
- macOS appearance observer and SIGWINCH coupling in theme.ts

Net: -424 lines. Rust crate lighter, detection works over SSH.

* fix(theme): ignore bogus zellij osc11 dark reading

* fix(theme): scope macOS fallback to broken terminal paths

* fix(tui): swallow DA1 sentinels for OSC 11 probes

---------

Co-authored-by: can1357 <me@can.ac>
2026-03-11 00:58:17 +01:00
can1357 acf4b45062 fix(coding-agent): backported pi-mono changes (5133697..15e0957b0)
packages/ai:
- fix: improve GitHub Copilot OAuth polling and Codex stream recovery
- fix: allow google-vertex authentication via GOOGLE_CLOUD_API_KEY
- fix: send Gemini/Claude provider-specific thinking headers and thought-signature fallbacks correctly
- test: added coverage for Gemini CLI alignment, Codex streaming, and stream edge cases

packages/coding-agent:
- feat: add treeFilterMode setting for the session tree selector default
- fix: prefer later-loaded explicit extensions when commands conflict
- fix: truncate serialized tool results during compaction summarization to prevent overflow
- fix: normalize CRLF in write tool previews
- fix: use shell-based external editor launch on Windows
- test: added compaction serialization and extension runner precedence coverage

packages/tui:
- fix: chain slash-command argument autocomplete after tab-completing the command name
- fix: normalize pasted tabs in Input using configured indentation
- fix: render blockquote lists, tables, and fenced code blocks correctly
- fix: ignore unsupported Kitty CSI-u modifiers and enable modifyOtherKeys fallback cleanup
- test: added editor, input, keys, and markdown regression coverage
2026-03-10 07:27:30 +01:00
can1357 aa18e3f26d feat: add hash prompt actions
Fixes #283
2026-03-09 15:38:39 +01:00
50a9f872de fix(tui): fixed windows numpad input (#339)
* fix(tui): fixed windows numpad input

* numlock handles in kitty CSI p2

* fix(tui): preserved modified numlock keypad nav

* fix(tui): restored autocomplete keystroke triggers

---------

Co-authored-by: Brit <lol@no.com>
2026-03-09 15:14:28 +01:00
can1357 7d5a230e26 fix: lowercased tool names in argument parsing
Fixes #324.
2026-03-07 23:53:16 +01:00
can1357 95df9f6f3e fix(tui): added checks to filter out Kitty release events
- Added checks to filter out Kitty release events (event_type 3) in both matches_key_inner and parse_key_inner functions. Added comprehensive tests for both key matching and input handling to verify release events are ignored while press and repeat events are still processed correctly.
Fixes #325
2026-03-07 23:46:01 +01:00
绫andGitHub d8782684f1 fix(tui): improve input wrapping and Unicode word navigation (#287)
* fix(tui): avoid wasting end-of-line width when wrapping wide tokens in TUI editor

* fix(tui): improve wrapping and Unicode word navigation

* fix(tui): avoid crash when input line exceeds terminal width

* chore(tui): fix code lint and formatting
2026-03-04 15:53:53 +01:00
can1357 8983704b3d fix(tui): corrected cursor positioning when content shrinks to empty
- Corrected cursor positioning when content shrinks to empty without clearOnShrink enabled.
- Added regression test for empty content rendering to prevent future cursor positioning issues.
2026-03-03 06:08:50 +01:00
can1357 7b4ab548c0 fix: corrected URI template expansion and MCP notification epoch handling
- Fixed URI template matching to handle empty string expansions in MCP resource queries.
- Fixed LM Studio URL validation to preserve invalid baseUrl instead of applying localhost fallback.
- Fixed MCP notification epoch handling to prevent unsubscribe calls when old subscriptions resolve after re-enabling.
- Extracted hardcoded LM Studio base URL to named constant for improved maintainability.
- Refactored notification epoch check logic for improved code clarity and readability.
2026-03-03 03:56:30 +01:00
can1357 5afe2b66a9 refactor(tui): simplified cursor positioning and viewport rendering logic
- Removed height tracking and viewport repaint path, consolidating to single fullRender function for all major redraws.
- Simplified cursor movement calculations using relative positioning instead of screen-relative addressing.
- Removed lastCursorSequence deduplication and moveToScreenPosition helper, reducing complexity while maintaining IME cursor positioning.
Fixes #243
2026-03-03 03:55:38 +01:00
28d9de74ce Implement Windows Sixel support and terminal capability checks (#241)
* windows sixel imp

* windows sixel imp, terminal capability check, pessimistic sixel selection

* fix codex suggestions

---------

Co-authored-by: Brit <lol@no.com>
2026-03-01 22:23:05 +01:00
can1357 e8263e0327 fix(tui): correct repaint scrollback accounting
Fixes #228
Fixes #234
2026-03-01 15:27:07 +01:00
can1357 a97d03b7fb test(tui): harden overflow append regression coverage 2026-03-01 11:37:20 +01:00
can1357 7db7eb5a76 fix(tui): corrected append rendering during viewport overflow with offscreen header changes
- Fixed append rendering logic to correctly handle offscreen header changes during content overflow growth, preserving scroll history integrity.
- Fixed visible tail line updates when appending new content during viewport overflow conditions.
- Refactored append detection logic to distinguish pure appends from appends with offscreen changes, improving rendering accuracy.
- Added regression tests for offscreen header changes and tail line updates during content overflow.
2026-03-01 11:30:15 +01:00
can1357 8663794c56 feat(coding-agent): added escaped tab auto-correction and Unicode escape detection
- Added auto-correction for escaped tab indentation in edits via PI_HASHLINE_AUTOCORRECT_ESCAPED_TABS environment variable.
- Added warning detection for suspicious Unicode escape placeholder \uDDDD in edit content.
- Clarified hashline documentation that \t in JSON represents real tab characters, not literal backslash-t strings.
- Added comprehensive test coverage for escaped tab auto-correction and Unicode escape detection.
2026-03-01 10:59:15 +01:00
can1357 625be8618a fix(natives): corrected strikethrough reset logic to preserve colors on line wraps
- Fixed strikethrough reset logic to properly handle combined underline and strike attributes without resetting colors.
- Refactored write_line_end_reset to emit correct ANSI codes (24m for underline, 29m for strike) when both attributes are present.
- Added test case verifying strikethrough resets at line wraps while preserving foreground and background colors.
- Added TypeScript test case for strikethrough styling behavior across wrapped lines.
2026-03-01 10:50:52 +01:00
can1357 75d9b2bbc8 fix(tui): corrected cursor positioning instability during scrollback append
- Fixed cursor positioning instability when appending content under external cursor relocation by using absolute screen addressing instead of relative cursor movement.
- Extracted cursor movement logic into #moveToScreenPosition() helper to ensure consistent absolute positioning across all rendering paths.
- Added regression test verifying scrollback stability during rapid content append with external cursor relocation.
2026-03-01 10:50:26 +01:00
can1357 28289f607b test(tui): added regression tests for viewport stability during resize storms
- Added five new test cases covering viewport consistency across repeated width reflows, aggressive resize storms, height-only resizes with cursor drift, streaming content under resize, and forced renders with cursor relocation.
- Added test for scrollback boundedness during mixed width/height resize storms on static content.
- Added test for scrollback integrity when appending lines during aggressive resize operations.
2026-03-01 09:55:02 +01:00
can1357 71ee90f988 fix(tui): harden viewport rendering and cursor state
Refactor TUI rendering into explicit hard-reset and viewport-repaint paths with safer differential fallbacks for offscreen/overflow cases.

Replace legacy viewport bookkeeping with screen-relative cursor/viewport tracking, force startup render initialization, and clamp stop() cursor movement to prevent overscroll artifacts.

Synchronize cursor dedup cache across all render write paths to avoid stale #lastCursorSequence behavior after full redraws.

Remove PI_TUI_RESIZE_CLEAR_STRATEGY and lock resize behavior to deterministic semantics (width hard reset, height viewport repaint).

Expand terminal regression coverage with new render-regressions tests and substantial overlay/scroll stress scenarios to guard scrollback growth, anchoring drift, and no-op churn.
2026-03-01 08:22:00 +01:00
can1357 c3d0bd9773 feat(coding-agent): deferrable tools, LIFO pending-action stack, custom tool pushPendingAction
- Introduce `deferrable?: boolean` on AgentTool, CustomTool, and ToolDefinition.
  AstEditTool sets it to true; resolve is now injected only when at least one
  active tool is deferrable (previously unconditional).

- Replace single-slot PendingActionStore (set/get/clear) with a LIFO stack
  (push/peek/pop/clear). Multiple deferrable tools can stage independent
  preview actions; resolve always consumes the topmost one first.

- Wire pendingActionStore through discoverAndLoadCustomTools / loadCustomTools /
  CustomToolLoader so custom tools can call pushPendingAction(action) to
  register a resolve-compatible pending action with label, apply callback,
  optional details, and optional sourceToolName.

- Export HIDDEN_TOOLS and ResolveTool from the SDK for manual tool composition.

- Add CustomToolPendingAction type and pushPendingAction to CustomToolAPI.

- Update createAgentSession to re-inject or remove resolve after the deferrable
  audit, consistent with createTools behavior.

- Add LIFO resolve test, update existing tests (set -> push, get -> peek).

- Add docs/resolve-tool-runtime.md covering PendingActionStore internals,
  built-in producer example, and custom tool usage guide.
2026-03-01 02:57:31 +01:00
can1357 fe93866a6a fix(tui): stop duplicate resize rerenders without losing history 2026-03-01 02:45:41 +01:00
can1357 29d8768c70 feat(tui): added viewport-only resize strategy to reduce scrollback pollution
- Added `PI_TUI_RESIZE_CLEAR_STRATEGY` environment variable to control terminal resize behavior: `viewport` (default) renders only visible content to minimize scrollback pollution, or `scrollback` clears all history.
- Changed resize redraw logic to support viewport-only rendering strategy, reducing scrollback accumulation during terminal resizing.
- Added 2 integration tests to verify viewport and scrollback resize strategies work correctly.
2026-03-01 02:35:58 +01:00
can1357 0a49a4a9a7 fix(tui): corrected loader text overflow and terminal clear behavior
- Fixed loader component text overflow by truncating lines exceeding terminal width using column-aware slicing.
- Improved terminal clear logic on resize to use hard clear (\x1b[2J) preventing stale wrapped cells.
- Added test coverage for loader component line clamping to verify rendered lines fit within terminal width.
- Refactored terminal clear conditional logic from ternary to multi-line if-else for improved maintainability.
2026-03-01 02:35:43 +01:00
can1357 6746ddffd8 tui: use home+erase-below instead of clear-screen to avoid scrollback pollution 2026-02-28 06:07:56 +01:00