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>
fix: unify error message to "Failed to fetch" and exit on load failureโ
Show a clean "Failed to fetch" message in the UI and call exit() so the
test terminates immediately instead of hanging on unsupported images.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix(jimpURL): validate Content-Type before passing to Jimpโ
Some servers ignore the Accept header and return unsupported formats
(e.g. image/avif). Check the actual Content-Type response header and
reject non-Jimp formats with a clear error message before decoding.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat: add loadImageFromUrl helper and wire it into LocalPicture testโ
Extract URL fetching into a dedicated jimpURL.ts utility that requests
only Jimp-supported image formats via Accept header. LocalPicture.test
now imports and uses it for all URL sources.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat(LocalPicture): support CLI args for path/URL and golden ratio widthโ
Allow passing an image path or URL as a command-line argument. Default
falls back to the original wallpaper. Display width changed from 40% to
16.18% (golden ratio) for a more aesthetically balanced default.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat: pass pixelWidth/pixelHeight from Image props to Kitty rendererโ
Previously the test computed accurate pixel dimensions from the original
image's aspect ratio, but the prop chain never forwarded them through
ImageComponentProps -> ImageRenderer -> KittyImage -> useImage, so
KittyImage always computed pixels from resolved chars ร cell size (losing
aspect ratio information). Now the full chain forwards pixelWidth/
pixelHeight as overrides, letting the test control exact pixel scaling
while width/height still drive Ink layout and Kitty placement bounds.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: reduce blank rows below Kitty images by using placement c=/r= boundsโ
Kitty placement now passes resolved character dimensions (charWidth,
charHeight) to limit the rendered image area. ImageBox uses pixel-derived
charHeight when loaded to avoid reserving too many Yoga rows.
LocalPicture.test.tsx computes pixelWidth/pixelHeight separately from
character dimensions for correct scaling.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: preserve image aspect ratio with cover() and dynamic height calculationโ
Replace non-proportional resize() with cover() in useImage hook, and
compute target height from original aspect ratio in LocalPicture test
instead of hardcoding a terminal-rows-based ratio.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: add Ghostty env-var detection for Kitty graphics in ink-pictureโ
- Add TERM_PROGRAM=ghostty fallback to enable Kitty graphics protocol
- Add COLORTERM=truecolor fallback for color detection
- Create TerminalDetection.test.tsx diagnostic tool for terminal capability debugging
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat: add useStdout and useIsScreenReaderEnabled hooks for ink-pictureโ
- Add StdoutContext.Provider and AccessibilityContext.Provider to App render tree
- Export useStdout/useIsScreenReaderEnabled from src/ink entry point
- Pass writeToStdout from Ink class to App for raw escape sequence output
- Create LocalPicture.test.tsx visual test for local image display
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>
feat: remove result limits on LocationTool place searches (Amap/Google)โ
Add a new LocationTool supporting geocoding, POI search, directions,
and trip planning. Automatically selects Amap (China) or Google Maps
(international) based on region detection.
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
fix: /friend motion โ interrupt hold on new action, drain queue, fix emotion mappingโ
- MotionController: interrupt hold when new playAction arrives instead of
queueing, so LLM text-message actions are not blocked by stale 10s hold
- MotionController: drain action queue in hold timer callback to prevent
silent drop of queued actions
- App.tsx: remove hold=true from emotion-only messages โ action plays once,
emotion timer handles duration independently
- App.tsx: remove awkward emotionโaction mappings (neutralโsalute,
relaxedโsalute, sadโshy) that caused unnatural gestures
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
useAutoTTS now detects session switches (resume) via UUID discontinuity
and treats all loaded messages as history to skip TTS. Only subsequent
real-time assistant replies will trigger speech.
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
chore: remove obsolete test and vendor source, add CLI SDK docsโ
- Remove test_feishu_ws.ts (contained secrets)
- Remove vendor/audio-capture-src/index.ts (replaced by
packages/audio-capture-napi)
- Add docs/cli/ build system documentation
- Add src/cli/ SDK transport and handler modules
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>