Switch primary dimension from terminal columns to terminal rows so the
image scales proportionally regardless of terminal orientation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix(ImageShowTool): simplify dimensions — use height as primary, compute width from aspect ratio
Derive image dimensions from terminal height instead of width. This better
reflects common portrait image viewing on portrait-ish terminal heights, and
guarantees pixelWidth === width * CELL_WIDTH by back-computing char width
from the pixel target — eliminating rounding gaps between the placeholder
Box and the actual Kitty image.
Also remove the now-unused `imageHeight` prop from ImageBox.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix(ImageShowTool): read local file to buffer before Jimp.read
Jimp v1.x has inconsistent path resolution in some runtimes (Bun, ESM).
Read file to Buffer via fs.readFileSync first, then pass to Jimp.read()
to ensure reliable local file loading.
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
feat(ImageShowTool): use timg for full-res Kitty image, dedup placement
- Replace Jimp-based image loading with timg binary for complete image
processing (decode, scale, encode Kitty protocol) in one subprocess
- Write Kitty sequence directly to terminal fd via fs.writeSync, bypassing
Ink's stdout buffering
- Fix duplicate image placement with three mechanisms:
1. Position dedup: skip write if component hasn't moved
2. Delete-before-write: remove old image with \x1b_Ga=d,d=I,i=ID
3. Remove 500ms polling interval that caused repeated writes
- ImageDisplay now takes pre-generated kittySequence instead of loading
image in the UI component
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
feat: render image directly to terminal fd, keep empty placeholder for TUI layout
Replace ink-picture's Image (ImageBox + Kitty placement via Ink) with a
DirectImageDisplay that writes Kitty protocol directly to process.stdout.fd,
completely bypassing Ink's rendering loop. The Inku TUI renders an empty Box
placeholder for correct layout while the image is drawn on the terminal
framebuffer.
Follows the proven approach from commit 3f3bed3 (old timg): decouple image
rendering from TUI layout so Ink's frame writes never overwrite the picture.
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
KittyImage now uses fs.writeSync(process.stdout.fd) for all Kitty protocol
sequences (transmit, placement, deletion) instead of Ink's stdout.write,
preventing conflicts with Ink's screen refresh cycle inside Codev's TUI.
Also adds 'term.includes("ghostty")' to detectTerminalCaps() to recognize
Kitty support when running inside tmux with TERM=xterm-ghostty.
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
fix: use env-var terminal detection to avoid stdin conflicts in TUI
Replace InkPictureProvider's ANSI escape queryTerminal() with
environment-variable-based detection (TERM, TERM_PROGRAM, KITTY_WINDOW_ID)
to reliably detect Kitty/Sixel/iTerm2 protocol support without hijacking
stdin, which conflicted with Ink's TUI input management.
InkPictureProvider now skips queryTerminal entirely when terminalInfo
overrides are provided, preventing garbled ANSI response leakage into
the input bar.
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
refactor: move ink-picture rendering from call() to UI React tree
- Remove direct stdout ANSI rendering from ImageShowTool.call() (protocol
detection, renderImage, etc.)
- Simplify call() to only load image and return dimensions
- Add ImageDisplay component in UI.tsx using InkPictureProvider + Image
from ink-picture, mounted in Codev's React tree
- Image component reserves a TUI placeholder and renders the actual
image directly to the terminal framebuffer via Kitty/Sixel protocol
(bypassing Ink render cycle)
- Merge standalone.tsx to use ImageDisplay from UI.tsx
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
fix: make ImageShowTool non-deferred so model can discover and call it
- Change shouldDefer from true to false so ImageShowTool is always
available in the model's tool list without requiring ToolSearch
- Previously the model couldn't find ImageShowTool and fell back to
running standalone.tsx via Bash, whose stdout capture garbled the
Kitty protocol output
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
feat: integrate ink-picture rendering into ImageShowTool, remove InlineImage
Convert ImageShowTool from standalone utilities to a full Tool definition
using buildTool(), add prompt.ts for LLM-facing description, and refactor
UI.tsx into tool render functions. Standalone executable moved to
standalone.tsx to avoid side effects on import.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
refactor: extract UI from ImageShowTool into separate component
Split ImageShowTool.ts into utility functions (ImageShowTool.ts) and
React component (UI.tsx), enabling reuse of load/calculate logic.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
refactor: extract UI from ImageShowTool into separate component
Split ImageShowTool.ts into utility functions (ImageShowTool.ts) and
React component (UI.tsx), enabling reuse of load/calculate logic.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
refactor: rewrite ImageShowTool with new architecture
Replace manual fetch/read/detect helpers with Jimp + loadImageFromUrl,
delegating image loading to the same infrastructure used by ink-picture.
Return naturalWidth/naturalHeight from call() so renderToolResultMessage
can compute pixel dimensions from the original aspect ratio via the
pixelWidth/pixelHeight props now supported by the Image component.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
refactor: integrate ink-picture as source directory
- Move ink-picture dependencies from file: reference to direct source integration
- Remove ink-picture's own node_modules, build, package.json, tsconfig.json, biome.json
- Update all ink-picture imports to use src/ink-picture path alias
- Add ink-picture path alias to tsconfig.json
- Add is-unicode-supported, iterm2-version, jimp, node-fetch, sixel as direct deps
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
refactor: replace custom image rendering with ink-picture across all components
Remove external `timg` binary dependency in ImageShowTool by using `jimp`
for image decoding and adapted ink-picture renderers (halfBlock/braille/ascii)
for ANSI text-protocol output. The renderers are pure functions that work
with codev's Ink fork via RawAnsi, avoiding context-incompatibility with
the ink-picture React components.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: simplify ImageShowTool to always render timg blocks within Ink's virtual DOM
Remove Kitty protocol/writeRaw bypass that caused TUI cursor corruption and
image display failures. Always render via timg Unicode blocks through RawAnsi
so Ink knows the image dimensions and the cursor stays in sync.
Clean up terminalImage.ts by removing TimgMode, mode parameter, getImageRowsCount,
and tmux TERM_PROGRAM detection that were added in subsequent broken commits.
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
chore: rename VersperClaw to Codev, update org to chenbhao
Move raw APC/DCS emission from before cell rendering to after, wrapping
with cursor-hide/show sequences to prevent cursor flicker. Remove CUP
positioning from rawWritesAtRow entries since the cursor is already at
the correct position via CR+LF or moveCursorTo. Refactor ImageShowTool
to use writeRaw via TerminalWriteContext context instead of embedding
raw sequences in Ink's virtual DOM RawAnsi.
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
timg Unicode-block output was written to stdout via process.stdout.write(),
bypassing Ink's rendering pipeline. Ink's virtual cursor didn't know about
the image rows, causing subsequent UI (prompt, input bar) to render at wrong
positions — overlapping the image and duplicating input bars.
Now the timg ANSI output is passed through the tool data and rendered via
the RawAnsi component within Ink's virtual DOM. Ink's Yoga layout accounts
for the image's width × height, keeping cursor position in sync.
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
feat: add inline terminal image rendering with Kitty protocol support
Introduce InlineImage component, ImageShow tool, and image caching/detection
utilities for rendering images directly in the terminal via the Kitty graphics
protocol. Falls back to clickable hyperlinks when protocol is unavailable.
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>