Commit Graph

2730 Commits

Author SHA1 Message Date
Hunter B 5b47d46092 chore: seed v0.8.60 branch from main after v0.8.59
# Conflicts:
#	README.md
#	crates/cli/src/lib.rs
#	crates/config/src/lib.rs
#	crates/config/src/provider.rs
#	crates/tui/src/commands/mod.rs
#	crates/tui/src/localization.rs
#	crates/tui/src/prompts.rs
#	crates/tui/src/tui/ui.rs
#	crates/tui/src/tui/ui/tests.rs
#	crates/tui/src/tui/widgets/tool_card.rs
#	scripts/benchmarks/cli-compare.py
2026-06-12 17:42:22 -07:00
CodeWhale Agent 3d822488fe chore(fmt): apply cargo fmt for CI parity gate 2026-06-12 17:02:17 -07:00
CodeWhale Agent 97f8a98b75 fix(config): align Kimi OAuth credentials with Kimi Code 2026-06-12 16:43:25 -07:00
CodeWhale Agent 738a265197 fix(tui): show Bash for shell work in visible UI 2026-06-12 16:32:32 -07:00
CodeWhale Agent f870eb3e19 fix(tui): keep subagents alive across backgrounded waits 2026-06-12 16:16:39 -07:00
CodeWhale Agent d48373617f fix(tui): clear sidebar hover highlight on exit while loading 2026-06-12 15:54:08 -07:00
CodeWhale Agent b0577057c9 fix(tui): localize notifications and persist sidebar focus 2026-06-12 15:47:44 -07:00
dependabot[bot] 7856d26d64 build(deps): bump tempfile from 3.24.0 to 3.27.0 (#2997)
Bumps [tempfile](https://github.com/Stebalien/tempfile) from 3.24.0 to 3.27.0.
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/compare/v3.24.0...v3.27.0)

---
updated-dependencies:
- dependency-name: tempfile
  dependency-version: 3.27.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 15:44:26 -07:00
dependabot[bot] d818ac4e2a build(deps): bump image from 0.25.9 to 0.25.10 (#3000)
Bumps [image](https://github.com/image-rs/image) from 0.25.9 to 0.25.10.
- [Changelog](https://github.com/image-rs/image/blob/v0.25.10/CHANGES.md)
- [Commits](https://github.com/image-rs/image/compare/v0.25.9...v0.25.10)

---
updated-dependencies:
- dependency-name: image
  dependency-version: 0.25.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 15:44:19 -07:00
dependabot[bot] 45f334828f chore(deps): bump pdf-extract from 0.7.12 to 0.10.0 (#3184)
Bumps [pdf-extract](https://github.com/jrmuizel/pdf-extract) from 0.7.12 to 0.10.0.
- [Commits](https://github.com/jrmuizel/pdf-extract/compare/v0.7.12...v0.10.0)

---
updated-dependencies:
- dependency-name: pdf-extract
  dependency-version: 0.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 15:44:13 -07:00
dependabot[bot] 9373c5d6b2 chore(deps): bump flate2 from 1.1.5 to 1.1.9 (#3185)
Bumps [flate2](https://github.com/rust-lang/flate2-rs) from 1.1.5 to 1.1.9.
- [Release notes](https://github.com/rust-lang/flate2-rs/releases)
- [Commits](https://github.com/rust-lang/flate2-rs/compare/1.1.5...1.1.9)

---
updated-dependencies:
- dependency-name: flate2
  dependency-version: 1.1.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 15:44:06 -07:00
dependabot[bot] ec5b0791be chore(deps): bump objc2 from 0.6.3 to 0.6.4 (#3186)
Bumps [objc2](https://github.com/madsmtm/objc2) from 0.6.3 to 0.6.4.
- [Commits](https://github.com/madsmtm/objc2/compare/objc2-0.6.3...objc2-0.6.4)

---
updated-dependencies:
- dependency-name: objc2
  dependency-version: 0.6.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 15:43:59 -07:00
CodeWhale Agent e4989c0eae feat(tui): add Copy to the sidebar right-click context menu
Removing Paste from the sidebar menu (#3065) left rows with no copy
path at all — sidebar text can't be mouse-selected. Right-clicking a
sidebar row now offers Copy, which writes the row's untruncated text
plus its hover detail to the clipboard via a new
ContextMenuAction::CopyText. Run stays first for clickable rows.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 15:35:20 -07:00
CodeWhale Agent ba1104251a feat(tui): richer Work overflow and Agents hover detail in sidebar
- Work panel: hovering the '+N more checklist items' overflow row now
  reveals the omitted checklist items in the popover, so a
  height-constrained panel no longer hides work items with no way to
  inspect them (#3063).
- Agents panel: the compact agent label row's hover text now carries a
  full dossier — id, role, status, elapsed time, step count, objective
  (new SidebarAgentRow field, from SubAgentAssignment), branch, and
  untruncated progress. Compact rows stay unchanged.
- Detail-row hover keeps the full progress text instead of the
  summarized form.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 15:26:53 -07:00
CodeWhale Agent 2da01367e6 fix(tui): keep sidebar resize live during active turns
The loading mouse filter (should_drop_loading_mouse_motion) dropped all
Drag events while app.is_loading unless a transcript selection or
scrollbar drag was active. A sidebar resize started on the handle
(Down passes the filter) then never received its Drag events, leaving
the resize wedged mid-gesture during live runs (#3063, symptom of the
#3096 subagent-runtime pressure on the TUI).

- Allow Drag events through the loading filter while
  app.sidebar_resizing is set.
- Clear last_sidebar_area / last_sidebar_handle_area and any in-flight
  resize when the sidebar is hidden or doesn't fit, so stale handle
  hit-areas can't capture clicks.
- Tests: resize down/drag/up while loading, mouse-up outside the
  handle still ends the resize.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 15:26:53 -07:00
CodeWhale Agent 3169c459ed docs(changelog): document harvested v0.8.59 features 2026-06-12 14:54:47 -07:00
CodeWhale Agent 7ea05982f2 fix(clippy): resolve rust 1.96 lint errors blocking the release gate
cargo clippy --workspace -D warnings fails on three pre-existing spots
newly flagged by the current toolchain: unnecessary_sort_by in
context_report, question_mark in the provider fallback chain, and
unnecessary_map_or in the empty-state widget check. Apply the
mechanical fixes clippy suggests; no behavior change.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 14:48:42 -07:00
CodeWhale Agent 88ec6b5ea5 Harvest PR #3010: lock slim default prompt with calm-overlay regression test
The release branch already ships the slim-prompt intent in a stronger
form than #3010 — compose_default_static_layers appends no personality
overlay at all (voice/tone guidance is folded into the constitution
preamble), where the PR only emptied the Calm arm. Carry over the PR's
regression test, which derives its assertion from calm.md itself so a
future re-inclusion of the overlay text fails loudly.

Harvested from PR #3010 by @894876246

Co-authored-by: Hanmiao Li <894876246@qq.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 14:43:42 -07:00
CodeWhale Agent 71c45cf92f Harvest PR #2808: thread undo/retry and snapshot restore endpoints
The release branch independently evolved the sessions API from #2808
(POST /v1/sessions creates from a thread, /v1/sessions/{id}/resume-thread
resumes), but the turn-rewind and snapshot-restore endpoints never
landed. Port them onto the current thread model:

- POST /v1/threads/{id}/undo — fork at the Nth-from-last user message
  and return the dropped user text for input pre-population.
- POST /v1/threads/{id}/patch-undo — restore the newest differing
  tool:/pre-turn: workspace snapshot (same target selection as the
  TUI's patch_undo), then fork the conversation; reports the file
  rollback result alongside the forked thread.
- POST /v1/threads/{id}/retry — fork and immediately start a turn
  re-using the dropped user text (or an override prompt), adapted to
  the extended StartTurnRequest (dynamic_tools, environment_id).
- POST /v1/snapshots/{id}/restore — restore a workspace snapshot by id.

fork_at_user_message and its tests were already present; this adds the
HTTP surface plus endpoint tests for undo/patch-undo/retry/restore.

Harvested from PR #2808 by @bengao168

Co-authored-by: Ben Gao <bengao168@msn.com>
Co-authored-by: Hunter Bown <hmbown@gmail.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 14:43:42 -07:00
CodeWhale Agent 9b31621b19 Harvest PR #3051: voice input commands and hotbar integration
Port /voice, /voice-send, and /voice-control into the command strategy
registry as groups/core/voice.rs. The handlers only flip App state
(voice_enabled, voice_send_enabled, voice_control_enabled) and emit the
new AppAction::VoiceCapture; the UI event loop performs the actual
record + transcribe cycle so credentials come from the live Config
(deepseek_api_key/deepseek_base_url) instead of auth fields cached on
App, and no audio is ever recorded by the registry smoke tests.

- voice.toggle hotbar action dispatches the real /voice command and
  reports voice_enabled as its active state, replacing the placeholder.
- Recording uses sox/rec/arecord with RMS-based silence detection;
  transcription posts input_audio blocks to the provider chat
  completions API (async reqwest — the blocking client would panic
  inside the tokio event loop).
- Transcripts insert at the composer cursor via App::insert_str. With
  /voice-send enabled, a transcript ending in "send it" / 发送 strips
  the suffix and submits; a bare "send it" submits the current composer
  content. With /voice-control enabled, transcription runs through the
  AI dictation pipeline that sees the composer text.
- Failures (no recorder, no API key, short recording, network) surface
  as localized status messages and disarm voice input.
- Localized command help and status strings for all seven shipped
  locales; /voice now appears in the command palette.

Harvested from PR #3051 by @huqiantao

Co-authored-by: huqiantao <huqiantao@users.noreply.github.com>
Co-authored-by: Hunter B <hmbown@gmail.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 14:43:27 -07:00
CodeWhale Agent 662a459ee5 Harvest PR #2773: activate provider fallback chain
Harvested from PR #2773 by @idling11

Co-authored-by: Hanmiao Li <894876246@qq.com>
2026-06-12 14:12:51 -07:00
CodeWhale Agent 4200b64365 Harvest PR #2851: command strategy registry
Harvested from PR #2851 by @aboimpinto

Co-authored-by: Paulo Aboim Pinto <aboimpinto@gmail.com>

Co-authored-by: Hunter Bown <hmbown@gmail.com>
2026-06-12 14:04:22 -07:00
CodeWhale Agent 89a9981bf9 Merge PR #2879: Hugging Face provider docs and tests
Harvested from PR #2879 by @mvanhorn

Co-authored-by: mvanhorn <455140+mvanhorn@users.noreply.github.com>
2026-06-12 13:56:03 -07:00
CodeWhale Agent 1dc4c279ac Merge PR #3005: provider metadata registry
Harvested from PR #3005 by @sximelon

Co-authored-by: sximelon <15710511+sximelon@users.noreply.github.com>
2026-06-12 13:52:29 -07:00
CodeWhale Agent 1147655397 Merge commit 'refs/tmp/pr-2995' into work/v0.8.59-listed-pr-harvest 2026-06-12 13:50:25 -07:00
Hunter Bown 368b0b704d Merge pull request #3177 from Hmbown/scratch/v0.8.59-experimental-config
feat(config): surface experimental feature flags
2026-06-12 13:36:57 -07:00
CodeWhale Agent 81265ec71b feat(config): surface experimental feature flags 2026-06-12 13:36:13 -07:00
Hunter Bown 62e7f0e686 Merge pull request #3176 from Hmbown/scratch/v0.8.59-release-finish-gpt55-20260612
fix(release): harden v0.8.59 terminal and file stability
2026-06-12 13:29:34 -07:00
CodeWhale Agent d921b5670d fix(tui): keep Ghostty motion override live 2026-06-12 13:27:29 -07:00
CodeWhale Agent a0724bc5af fix(release): harden Windows shell env and PDF extraction
(cherry picked from commit 2d5f2d235849cd2fa520937a529935759e3782a3)
2026-06-12 12:12:24 -07:00
Hunter Bown bcb8af98d0 fix(cli): add missing verbosity field to ResolvedRuntimeOptions tests (#3175)
Co-authored-by: CodeWhale Agent <codewhale-agent@hmbown.local>
2026-06-12 11:44:45 -07:00
Hunter Bown 4d0c04ea7c chore(fmt): format commands/mod.rs and commands/plugins.rs (#3174)
Co-authored-by: CodeWhale Agent <codewhale-agent@hmbown.local>
2026-06-12 11:39:14 -07:00
Hunter Bown 19c73a7705 chore(fmt): format crates/secrets/src/lib.rs (#3173)
Co-authored-by: CodeWhale Agent <codewhale-agent@hmbown.local>
2026-06-12 11:34:22 -07:00
wavezhang eac4139e52 feat: build static linux x64 binaries with musl (#2903)
* feat: build static linux x64 binaries with musl

Build codewhale-cli and codewhale-tui with x86_64-unknown-linux-musl
target in the CNB tag_push workflow to produce fully static Linux x64
binaries. Install musl-tools instead of libdbus-1-dev; keep toolchain
install and build in a single stage since CNB stages run in isolated
containers without persistent state.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix: gate keyring behind not(target_env = "musl") for static builds

When targeting x86_64-unknown-linux-musl, the keyring crate's
linux-native-sync-persistent feature pulls in libdbus-sys which
cannot link against musl. Gate the OS keyring dependency behind
not(target_env = "musl") so musl builds fall back to the
file-backed secret store instead.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: wavezhang <wavezhang@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-12 10:53:42 -07:00
Turisla 4e3e12eee7 feat(execpolicy): expose matched approval rule metadata (#2971) 2026-06-12 10:53:39 -07:00
Hanmiao Li 5d9b5f67cb feat(bench): improve cli-compare harness with real Harbor integration (#3009)
- Match actual Harbor CLI interface (no invented flags)
- Proper BaseInstalledAgent subclass for Codex
- Robust token extraction from stream JSONL + transcript parsing
- Heuristic answer_len extraction (## Final Answer markers)
- Metadata capture: versions, git commit, platform, timestamp
- --regenerate walks existing run directories
- All missing fields explicit null, never zero
- Support multiple runs per task with run_idx tracking

The harness is designed to run:
    harbor run --dataset terminal-bench@2.0:<task> --agent ... --model ...

for both codex and codewhale agents, then normalize the results.
2026-06-12 10:53:36 -07:00
cyq 38519552fd feat(cli): track provider source and customize unsupported TUI errors (#3011) 2026-06-12 10:53:32 -07:00
cyq b63287e653 feat(config): implement verbosity settings with normal and concise modes (#3052)
* feat(config): implement verbosity settings with normal and concise modes

* fix(config): wrap unsafe env calls in tests and fix clippy/fmt errors for CI

* perf(config): avoid verbosity prompt allocations
2026-06-12 10:53:29 -07:00
Gordon 5be5cd5a79 feat(i18n): localize ToolFamily labels (10 MessageIds) (#2901)
* feat(i18n): localize ToolFamily labels (10 MessageIds)

- localization.rs: Add 10 ToolFamily* MessageId variants + ALL_MESSAGE_IDS + all 7 locales
- tool_card.rs: tool_activity_label_for_name() accepts locale, uses tr() for labels
- footer_ui.rs, ui.rs: thread locale to tool_activity_label_for_name() callers
- Tests: 2 negative i18n tests + updated existing tests for new signatures

* chore: add .claude/ to gitignore

* fixup: make tool_display_label_for_name private + deduplicate family→MessageId mapping

---------

Co-authored-by: gordonlu <gordonlu@users.noreply.github.com>
2026-06-12 10:53:22 -07:00
dependabot[bot] f8e6de926c chore(deps): bump reqwest from 0.13.1 to 0.13.4 (#3001)
Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.13.1 to 0.13.4.
- [Release notes](https://github.com/seanmonstar/reqwest/releases)
- [Changelog](https://github.com/seanmonstar/reqwest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/seanmonstar/reqwest/compare/v0.13.1...v0.13.4)

---
updated-dependencies:
- dependency-name: reqwest
  dependency-version: 0.13.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 10:53:19 -07:00
dependabot[bot] b8785403b2 chore(deps): bump rustls from 0.23.36 to 0.23.40 (#3002)
Bumps [rustls](https://github.com/rustls/rustls) from 0.23.36 to 0.23.40.
- [Release notes](https://github.com/rustls/rustls/releases)
- [Changelog](https://github.com/rustls/rustls/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rustls/rustls/compare/v/0.23.36...v/0.23.40)

---
updated-dependencies:
- dependency-name: rustls
  dependency-version: 0.23.40
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 10:53:17 -07:00
dependabot[bot] 94456d728d chore(deps): bump clap_complete from 4.5.65 to 4.6.5 (#3003)
Bumps [clap_complete](https://github.com/clap-rs/clap) from 4.5.65 to 4.6.5.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.65...clap_complete-v4.6.5)

---
updated-dependencies:
- dependency-name: clap_complete
  dependency-version: 4.6.5
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 10:53:14 -07:00
Hanmiao Li b291214cd2 fix(config): add separate siliconflow_cn provider config field with fallback (#2893) (#2895)
Split SiliconflowCN into its own [providers.siliconflow_cn] TOML section
instead of silently ignoring [providers.siliconflow-CN] config.

- ProvidersToml / ProvidersConfig: add siliconflow_cn field with serde alias
- for_provider / for_provider_mut / provider_config_for: route SiliconflowCN
  to the new field
- resolve_runtime_options_with_secrets: fallback siliconflow_cn → siliconflow
  for api_key / base_url / model when unset
- deepseek_api_key: add config-file fallback for SiliconflowCn
- provider_config_key: update metadata to "siliconflow_cn"
- save_api_key_for: write SiliconflowCn keys to providers.siliconflow_cn
- docs/PROVIDERS.md, config.example.toml, scripts/check-provider-registry.py
2026-06-12 10:53:11 -07:00
Hanmiao Li 5e22753ee1 fix(tui): normalize macOS SUPER (Cmd) to CONTROL for keyboard shortcuts (#2938) (#2943)
* fix(tui): normalize macOS SUPER (Cmd) to CONTROL for keyboard shortcuts (#2938)

On macOS, terminal emulators may report Cmd (SUPER) instead of Ctrl
(CONTROL) for keyboard shortcuts, depending on the terminal app and
its configuration. This caused Ctrl+B, Ctrl+Alt+2, and other shortcuts
to be inconsistent.

Fix:
- Add normalize_macos_modifiers() in composer_ui.rs
- On macOS: map SUPER to CONTROL when CONTROL is not already set
- On other platforms: no-op
- Apply normalization at the key event entry point in ui.rs

Tests:
- normalize_macos_modifiers_maps_super_to_control
- normalize_macos_modifiers_preserves_existing_control
- normalize_macos_modifiers_leaves_alt_unchanged

* fix: strip SUPER from modifiers after normalization per review

* fix: gate macOS-specific modifier tests with #[cfg(target_os = "macos")]
2026-06-12 10:53:09 -07:00
New2Niu 2d81f91ea1 fix: codewhale update error: GitHub release downloads may be blocked or slow on this network (#3006)
Co-authored-by: lei <liulei@8531.cn>
2026-06-12 10:53:06 -07:00
cyq b8be06d9ba docs(prompt): clarify Constitution trust framing (#3008)
* docs(prompt): clarify Constitution trust framing

* docs(prompt): align trust standing wording
2026-06-12 10:53:03 -07:00
gus 24a91499e5 docs: add Upgrading from deepseek-tui section to README (#3053)
Co-authored-by: gus.guo <gus.guo@tec-do.com>
2026-06-12 10:53:01 -07:00
Hunter Bown aa1ce527e7 feat(tui): add /plugins slash command (#3169)
Adds a /plugins [name] command to list discovered script plugin tools
and inspect their metadata (description, input schema, approval level,
path). Includes localization strings and unit tests.

Co-authored-by: CodeWhale Agent <codewhale-agent@hmbown.local>
2026-06-12 10:52:38 -07:00
Reid 1ac32df627 feat(tui): dispatch hotbar slots from number keys (#3056)
Wire hotbar key dispatch into the TUI event loop.

  Bare 1-8 now fires the matching hotbar slot only when the composer is empty.
  Alt+1 through Alt+8 fires the matching slot even when the composer has text.
  Modal and overlay views keep ownership of those keys, and empty slots remain a
  safe no-op.
2026-06-12 10:52:02 -07:00
Nightt 4968983339 fix(tools): apply strict mode per schema (#3062)
* fix: apply strict tool mode per schema

* fix: preserve optional strict schema fields
2026-06-12 10:51:58 -07:00