Jul 6 05:31 refactor: replace custom image rendering with ink-picture across all components chenbhao +1: Claude Big Pickle - ImageShowTool: remove jimp/timg rendering, use ink-picture Image component
with auto-detected protocol (Kitty, Sixel, iTerm2, HalfBlock, Braille, ASCII)
- InlineImage: replace manual kitty escape sequences + writeRaw with ink-picture
- Ink runtime: remove dead rawWritesAtRow APC/DCS handling (no longer needed)
- Delete unused utils/terminalImage.ts and utils/kittyProtocol.ts
- tests: expand ImageShowTool test coverage to 29 tests
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com> 00:51 refactor: replace timg with jimp + ink-picture renderers for image display chenbhao +1: Claude Opus 4.6 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> Jul 5 09:36 fix: simplify ImageShowTool to always render timg blocks within Ink's virtual DOM chenbhao +1: Claude Big Pickle 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> 05:24 chore: rename VersperClaw to Codev, update org to chenbhao chenbhao +1: Claude Big Pickle Rename all references across the codebase: VersperClaw → Codev,
Versper Claw → Codev, versperclaw → codev, VERSPER_CLAW → CODEV,
versperai → chenbhao (GitHub username change).
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com> Jul 4 09:51 Add inline image utilities and integrate image handling into Location, WebFetch, and WebSearch tools. chenbhao +1: Claude Opus 4.6 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> 02:03 error Jul 3 14:51 feat: timg -p kitty 06:09 fix: render timg images within Ink's virtual DOM to prevent cursor desync chenbhao +1: Claude Big Pickle 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> 03:48 feat: add inline terminal image rendering with Kitty protocol support chenbhao +1: Claude Big Pickle 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> Jun 28 07:58 feat: Friend 消息 → 仅使用人设提示词 修改的文件 (5个)
核心流程:Friend 消息 → 仅使用人设提示词
1. src/types/textInputTypes.ts
- 在 QueuedCommand 中添加 overrideSystemPrompt?: string 字段,用于存储替代系统提示词
2. src/skills/bundled/friendPrompt.ts
- 导出 loadPersona() 和 buildVrmSystemPrompt(),供 FriendService 调用
3. src/friend/FriendService.ts
- 在 sendText() 中构建 VRM 人设提示词,作为 overrideSystemPrompt 随消息入队
4. src/utils/handlePromptSubmit.ts
- 在 onQuery 类型中添加 overrideSystemPrompt 参数
- 从 commands[0] 提取并传递给 onQuery
5. src/screens/REPL.tsx
- onQuery 和 onQueryImpl 均接收 overrideSystemPrompt 参数
- 传入 buildEffectiveSystemPrompt(),当该值存在时完全替代默认系统提示词
数据流
FriendService.sendText()
→ buildVrmSystemPrompt() ← 只构建 VRM 人设提示词
→ enqueue({ overrideSystemPrompt, ... })
→ processQueueIfReady()
→ handlePromptSubmit()
→ executeUserInput()
→ onQuery(..., overrideSystemPrompt)
→ onQueryImpl(..., overrideSystemPrompt)
→ buildEffectiveSystemPrompt({ overrideSystemPrompt })
→ 返回 [overrideSystemPrompt] ← 完全绕过 ~900 行 … Jun 21 16:28 feat: /voice use best grop whisper provider free and fast 12:07 feat: inter-process 架构对比
之前: 之后:
CLI TUI CLI TUI (单一进程)
└── /friend start ├── FriendService (in-process, cpal)
├── 服务器子进程 :3456 │ ├── STT via cpal
│ ├── chat-service.ts │ ├── enqueue() → 主 CLI
│ │ └── CLI SDK 子进程│ └── SSE → Tauri
│ ├── arecord 子进程 ├── 轻量 Bun.serve (in-process)
│ └── SSE └── Tauri (thin display only)
└── Tauri (getUserMedia) Jun 19 15:16 feat: /release-notes and what's news /cache/changelog.md Jun 18 10:50 fix: /goal clear but /resume will get old goal /goal clear 只清了内存中的 AppState.goal,但在 reAppendSessionMetadata 退出时把旧缓存 currentSessionGoal 又写回了
transcript。而且 loadTranscriptFile 是 last-wins 逻辑,一条旧的 goal entry 永远不会被清除。
需要两个修复:
1. /goal clear 时写入一条 goal 且带 cleared 标记,或写入 null 来覆盖
2. reAppendSessionMetadata 不要在 goal 已清除时重新写入
最简洁的方案:写入一条 goal: null 的 entry,加载时遇到 null 就视为无 goal 10:34 fix: goal can resuem by /resume 问题根源:Goal 状态只存储在 AppState.goal(内存)中,会话重启时内存丢失。
解决方案:把 Goal 状态持久化到 JSONL transcript 中,resume 时恢复。
改动的文件
src/types/logs.ts
- 新增 GoalEntry 类型(包含 type: 'goal'、所有 Goal 字段)
- GoalEntry 加入 Entry 联合类型
- LogOption 新增 goal?: GoalEntry 字段
src/utils/sessionStorage.ts
- METADATA_TYPE_MARKERS 数组加入 'type:goal'(支持预-compact 边界扫描时恢复)
- Project 类新增 currentSessionGoal: GoalEntry | undefined 缓存
- reAppendSessionMetadata() 中 re-append currentSessionGoal(session 退出时重写最新状态)
- restoreSessionMetadata() 新增 goal?: GoalEntry 参数,会写到 currentSessionGoal 缓存
- appendEntry() 中的 type === 'goal' 分支(不需要,已由 saveGoal 直接写)
- 新增 saveGoal(goal: GoalEntry) 函数:立即写入 transcript + 缓存
- 新增 clearGoal() 函数:清空缓存(用于 /goal clear)
- loadTranscriptFile() 解析 goal 条目,返回值加入 goal
- loadFullLog、getLastSessionLog、loadAllLogsFromSessionFile、loadTranscriptFromFile 均透传 goal
src/utils/conversationRecovery.ts
- loadConversationForResume 返回值新增 goal?: GoalEntry
src/utils/sessionRestore.ts
- ResumeLoadResult … Jun 15 11:07 feat: /goal 新增文件 (12个)
- src/commands/goal/index.ts — 命令入口
- src/commands/goal/goal.tsx — 命令核心逻辑
- src/utils/goal.ts — prompt 构建和工具函数
- src/tools/GoalUpdateTool/ — update_goal 工具 (3个文件)
- src/tools/GoalCreateTool/ — create_goal 工具 (3个文件)
- src/tools/GoalGetTool/ — get_goal 工具 (3个文件)
- src/hooks/useGoalAutoContinue.ts — 自动继续 hook
- src/components/PromptInput/GoalIndicator.tsx — Footer 状态显示
修改文件 (6个)
- src/state/AppStateStore.ts — 添加 GoalStatus / Goal 类型和 goal 字段
- src/commands.ts — 注册 goal 命令
- src/tools.ts — 注册三个 goal 工具
- src/screens/REPL.tsx — 调用 useGoalAutoContinue(queryGuard)
- src/components/PromptInput/PromptInputFooterLeftSide.tsx — 引入并显示 GoalIndicator
- src/bootstrap/state.ts — 添加 getTotalTokensUsed() 函数
功能
- /goal <objective> — 设置长期自治目标
- /goal pause|resume|clear|edit — 管理目标
- agent 在每个 turn 结束后自动 enqueue 继续 prompt(直到目标完成或被阻塞)
- update_goal 工具供 agent 标记目标完成或 3+ 轮阻塞后标记 blocked
- Footer 显示 goal 状态指示器 09:15 feat: markdown-style feishu 04:09 feat: feishu voice tts Jun 13 04:36 feat: add nvidia provider 02:06 chore: rm bak of fix config render 02:01 fix: config render 02:01 feat: voice stt+tts just first have voice Jun 12 17:13 feat: voice add fully-local STT (faster-whisper) + TTS (edge-tts) 06:29 feat: voice mode asr Jun 2 15:44 feat: Agent Team May 23 16:49 feat: desktop cd desktop && bun run tauri dev May 21 17:08 chore: fix prompt identity 16:32 fix: opencode login May 7 16:27 fix: subagent can't created in opencode free model /login no apikey May 6 15:57 feat: better collapsing fetch result when set verbose is false in /config 11:30 fix: /model display name not use fallback 10:05 chore: add free gpt5 nano and big pickle in /model 09:41 fix: refresh model list 09:14 fix: model not display life-free model 09:00 fix: fetch active opencode model 07:20 feat: add new free provider opencode Apr 21 13:43 fix: VersperClaw resume when ctrl c Apr 13 02:18 feat: allow all tools in auto mode without classifier checking Modify isAutoModeAllowlistedTool to always return true, allowing all
tools to bypass the auto mode classifier and execute immediately. 01:10 feat: enable ToolSearch by default for all API providers Remove the restriction that disabled ToolSearch for non-first-party
APIs. This improves compatibility with OpenRouter and other third-party
providers, ensuring that deferred tools like TaskCreate work correctly
regardless of the API provider being used. 00:51 feat: load all openrouter model Apr 6 13:35 feat: open ripgrep with USE_BUILTIN_RIPGREP = '0' Apr 5 10:33 feat: automode 06:33 chore: rename project 03:34 chore: logv2 code/claude to code/versperclaw Apr 4 07:06 feat: /telegram backend load Apr 3 05:15 feat: auto load free openrouter model 04:23 fix: rm default choice 04:06 fix: openrouter 和 local 切换后加载成了 fallback model list 03:54 fix: oprouter model list display 03:49 fix: /login openrouter set will display many error