#1600: 'r' keybinding in session picker for inline rename.
Enter inline rename mode, type new title, Enter to confirm, Esc to cancel.
Updates the saved session metadata and refreshes the picker list.
#1787: checklist_write, checklist_update, update_plan now trigger
immediate Work sidebar refresh (previously only todo_write did).
npm install -g codewhale now also provides the codew command.
Calls run('codewhale') — same download-and-forward pattern as
the existing codewhale.js and codewhale-tui.js wrappers.
Permanent short-form shim — forwards silently to codewhale.
Six fewer keystrokes, no deprecation warning. Ships alongside
codewhale and the legacy deepseek alias.
- Doctor: add 'State Root' section showing active root, legacy status,
and dual-root detection
- Doctor (text + JSON): use codewhale_config resolver for config path
- deepseek_home_dir(): now resolves to CodeWhale home
- composer_stash: writes to ~/.codewhale/composer_stash.jsonl
- merge_project_config: checks .codewhale/ before .deepseek/
- Text/config paths default to .codewhale/ not .deepseek/
#2011: migrate app state to ~/.codewhale
- Add CodeWhalePaths: codewhale_home(), legacy_deepseek_home(),
resolve_state_dir(), ensure_state_dir() in codewhale-config
- Config: resolve_config_path supports CODEWHALE_CONFIG_PATH env,
default_config_path prefers ~/.codewhale/config.toml
- Project overlay: checks .codewhale/config.toml before .deepseek/
- Sessions: default_sessions_dir uses resolve_state_dir with fallback
- Workspace trust: writes to CodeWhale home via ensure_state_dir
- Init: ensure_deepseek_gitignored adds both .codewhale/ and .deepseek/
- .gitignore: adds .codewhale/
#2010: session artifact hygiene
- /save without path now writes to managed sessions dir instead of cwd
- Boot-time session prune via cleanup_old_sessions (MAX_SESSIONS=50)
- sessions_dir() public accessor for checkpoint path resolution
Fix: load_recent_checkpoint now uses manager.sessions_dir() instead
of hardcoding ~/.deepseek/sessions/checkpoints/
Restructured the homepage so "What it actually is" sits directly before
"100-to-1", putting the spine back-to-back. Cut the redundant "Open
model platform" section (duplicated the provider chip list), the
fabricated "34k+ Stars / 98+ Contributors" cells in the Join block
(now uses real version / providers / license from facts.generated),
defensive "DeepSeek is not deprecated" copy, the speculative Unsloth
roadmap line, the stale hardcoded 2026-05-24 eyebrow, the margin
glyph, and a couple of hero pills. Today's Dispatch moves below the
diagram as a single editorial column (the live ticker already covers
recent activity). Contribute page drops the arbitrary "Section 05"
eyebrow and the double-language h1; recursive-harness intro mirrors
the homepage spine. EN/ZH parity preserved (6 sections home, 5
contribute, identical CTA structure).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fixes the macOS test failure on PR #1988 and the contributor-credit
gate from scripts/release/check-versions.sh.
cell_has_detail_target() was matching HistoryCell::Thinking, which
caused the activity footer to append " · ⌥+V raw" to thinking cells
that have no separate raw detail target. The detail-card flow only
exists for tool / sub-agent cells; thinking renders its own raw text
inline. Removing Thinking from the match arm restores the behavior the
existing
activity_footer_hint_surfaces_visible_thinking_without_raw_tool_hint
test asserts.
The CHANGELOG.md 0.8.43 section now credits the 30 contributors added
to README acknowledgements in this cycle, satisfying the README-vs-
CHANGELOG cross-check in check-versions.sh. crates/tui/CHANGELOG.md is
re-synced so the matching guard passes.
Verified locally on macOS:
- cargo fmt --all -- --check : clean
- cargo clippy --workspace --all-targets --all-features --locked -D warnings : clean
- cargo test --workspace --all-features --locked : 41 suites, 0 failed
- ./scripts/release/check-versions.sh : Version state OK
- ./scripts/release/publish-crates.sh dry-run : all 14 crates OK
- cargo build --release --locked : clean
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- npm/codewhale/README.md: remove DeepSeek-first language
- docs/INSTALL.md: scoop install codewhale (not deepseek-tui)
- Wire decision card overlay rendering in main render loop
- Decision cards now appear centered on transcript when active
Before the turn breaks at the thinking-only checkpoint, drain
any sub-agent completions that arrived between the last hold
check and now. If a child finished while we were running the
final status check, surface its sentinel immediately rather
than delaying it to the next turn.
- Thinking cells now qualify as detail targets alongside tools and sub-agents
- Space key on empty composer toggles the focused cell's collapsed state
- Status message confirms expand/collapse action
- Builds on existing collapsed_cells HashSet from mouse context menu
Implements structured choice cards for the v0.8.43 truth-surface tracker.
When Brother Whale needs user input, it surfaces a bordered card with:
- A question prompt
- Numbered options with (default) marker
- Arrow/j/k navigation and 1-9 number-key shortcuts
- Enter to confirm, Esc to cancel
- Decision results surfaced as status messages
The widget compiles and the keyboard routing is wired into the main
event loop. Rendering overlay wire-up follows in the next commit.
When a turn has been running for > 30 seconds, the footer now shows
a classified stall reason suffix:
- 'waiting for model' — API streaming in progress
- 'tools executing' — active tool calls running
- 'sub-agents working' — child sub-agents in flight
- 'compacting context' — context compaction active
- 'background jobs running' — shell tasks executing
- 'waiting — no recent activity' — turn stalled with no classified work
- Show fuller turn ID prefix (16 chars) for disambiguation in task_read/task_cancel
- Replace ambiguous 'X active (Y running)' with clear per-status breakdown
- Add y/Y yank affordances for copying turn ID and full status from Tasks panel
- Add yank hint text in Tasks panel footer
The previous resolved allocative 0.3.6 which
pulls hashbrown 0.16, conflicting with starlark_map's hashbrown 0.14
dependency. Restore the original lockfile and update only workspace
crates to 0.8.43 via .
- Separate model auto-routing from Plan/Agent/YOLO TUI modes across all
READMEs and docs/MODES.md
- Introduce Fin as the fast thinking-off deepseek-v4-flash seam for
routing, summaries, RLM child calls, and coordination work
- Document /goal as current session tracking (not a TUI mode), with note
that a future Goal work surface should stay distinct from --model auto
- Extend deprecation shim timeline from 'one release cycle' to
through v0.8.x in REBRAND.md and npm READMEs
- Fix selection_to_text test to expect inline thinking preview
(short completed thinking now renders inline without Ctrl+O
affordance)
DeepSeek native accepts reasoning_effort: high | max, with low/medium
compat-mapping to high and xhigh mapping to max. OpenRouter and Novita
use the OpenAI-standard unified scale: none | minimal | low | medium |
high | xhigh.
Mapping (CodeWhale internal → wire):
off → DeepSeek: thinking disabled, OpenRouter: thinking disabled
low → DeepSeek: high, OpenRouter: low
medium → DeepSeek: high, OpenRouter: medium
high → DeepSeek: high, OpenRouter: high
max → DeepSeek: max, OpenRouter: xhigh
Previously the low/medium/high arm sent 'high' for all providers,
and the max arm sent 'max' for all providers — both wrong for
OpenRouter. Split each arm to preserve provider-native semantics.
Sources:
- https://api-docs.deepseek.com/guides/thinking_mode
- https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
OpenRouter and Novita use OpenAI-standard reasoning_effort values
(xhigh|high|medium|low|minimal|none), not DeepSeek-native (max|high).
The xhigh/max/highest arm previously sent 'max' for all providers,
causing HTTP 400 on OpenRouter. Split OpenRouter+Novita into their
own arm that sends 'xhigh' instead.