Replace GitHub URLs with HF equivalents across source code
and install script. Release notes now fetch from CHANGELOG.md
on HF instead of GitHub Releases API.
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
feat(bridge): forward AskUserQuestion to CCR remote
Race the standalone question overlay against a bridge control_request so
remote users (claude.ai) can answer. Map per-question answers from the
remote response, degrade a generic allow to the first option, and tear
down either side's prompt whenever one resolves first.
feat(tool): decouple AskUserQuestion into standalone question channel
Add a dedicated question service and overlay instead of routing
AskUserQuestion through the permission system. Wire tab/arrow keybindings
in the standalone prompt and clarify the tool prompt with an explicit
parameter-structure example to reduce first-try schema errors.
refactor(WebFetchTool): remove dead Python webtools fallback
WebFetch already had a complete pure-TS implementation (turndown +
domino + native fetch). The Python branch spawned scripts/python_webtools.py
which no longer exists, so it always failed and fell back to the TS path.
Remove the dead code and its .venv dependency.
refactor: remove friend feature, local whisper, doubao & anthropic STT; consolidate voice to Groq
Remove the entire /friend desktop companion feature (Tauri frontend, FriendService,
SSE/STT server, skills, tools, routes) and the 11G Tauri build artifacts. Migrate the
edgeTts helper from friend/tts.ts into services/voice/edgeTTS.ts so auto-TTS survives.
Remove local whisper STT (whisperSTT.ts + whisper_server.py/transcribe.py) and the
doubao + anthropic voice_stream backends, since STT now runs exclusively on Groq
Whisper (whisper-large-v3 / -turbo). Shared STT connection types move into groqSTT.ts
and the voiceProvider setting is narrowed to ['groq'] with a default. Also rework
edgeTTS.ts to use the node-edge-tts package instead of a Python subprocess, dropping
the now-unused scripts/speak.py.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
refactor(ImageShowTool): download URLs to temp file, fix concurrency for kitty protocol
URLs now downloaded to /tmp before passing to timg as file path instead of
piped stdin. Disable concurrency safety since kitty protocol sequences are
in-band and concurrent terminal writes corrupt each other.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
refactor(WebSearchTool): disable defer to keep search_images param visible
Tavily lacks image search support, so route search_images requests
to SearXNG unconditionally and use Tavily only for general queries.
Update tests to cover image search and the new routing logic.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update WebSearchTool prompt documentation for image search parameter
- Remove automatic image fetching and inline embedding from WebSearchTool
- Add optional search_images parameter to query image-specific results
- Support SEARXNG_BASE_URL env var for SearXNG endpoint configuration
- Remove Output.images field and related inlineImageUtils import
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix(ImageShowTool): use terminal height instead of width for dimension calculation
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>
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>