Commit Graph

897 Commits

Author SHA1 Message Date
Hunter Bown 6248dc0508 fix(security): preserve sub-agent approval boundaries 2026-05-08 14:30:14 -05:00
Hunter Bown 9864f64019 fix(security): avoid following symlinked workspace walks 2026-05-08 14:27:07 -05:00
Hunter Bown e6d4eae5d6 fix(security): scrub child process environments 2026-05-08 14:24:07 -05:00
Hunter Bown 8380784308 fix(security): tighten paths and output handling 2026-05-08 14:13:55 -05:00
Hunter Bown 4de726abc5 feat(tui): compact live thinking by default 2026-05-08 14:13:50 -05:00
Hunter Bown 69862467c7 chore(deps): update security-sensitive dependencies 2026-05-08 14:13:46 -05:00
Hunter Bown 8b60275981 chore(release): prepare v0.8.22
Validate redirected fetch targets before following them and prepare v0.8.22.
2026-05-08 13:34:26 -05:00
Hunter Bown 1fc892e604 chore(release): prepare v0.8.21 (#1229) 2026-05-08 11:20:03 -05:00
Hunter Bown 9fecd7a24d docs(readme): use dispatcher path for PR prompt (#1227) 2026-05-08 11:08:11 -05:00
Hunter Bown dcd23464ef fix(tui): render git branch status item (#1226) 2026-05-08 11:04:22 -05:00
Hunter Bown f29d1a3a21 fix(mcp): wait for SSE endpoint before connect returns (#1225) 2026-05-08 11:00:01 -05:00
Hunter Bown 360438f0c9 docs(docker): prefer writable named data volume
## Summary
- Prefer a writable named Docker volume for the container home data path.
- Document the non-root UID/GID ownership requirement for host bind mounts.
- Update README and Docker docs examples to avoid permission-denied first runs.

## Test plan
- git diff --check
- GitHub CI green: version drift, lint, ubuntu, macOS, Windows, npm wrapper smoke, GitGuardian
2026-05-08 10:22:22 -05:00
Hunter Bown 6f1b23e052 fix(tui): make pager exit hint prominent
## Summary
- Move the pager exit hint to the front of the footer so q/Esc is immediately discoverable.
- Preserve the rest of the pager footer metadata and styling.

## Test plan
- cargo test -p deepseek-tui pager --locked
- cargo fmt --all -- --check
- git diff --check
- GitHub CI green: version drift, lint, ubuntu, macOS, Windows, npm wrapper smoke, GitGuardian
2026-05-08 10:21:45 -05:00
Hunter Bown caf77949d9 fix(tui): hide transcript rail before code blocks
## Summary
- carry markdown render metadata through the message renderer so fenced code lines are identified explicitly
- keep normal conversational continuation rails for prose, but replace the rail with alignment spaces before fenced code lines
- add a regression test for assistant code blocks so the visible U+258F rail does not appear inside code output

## Test plan
- cargo test -p deepseek-tui assistant_code_block_lines_do_not_get_transcript_rail --locked
- cargo fmt --all -- --check
- git diff --check origin/main..HEAD
- GitHub CI: lint, version drift, ubuntu/macos/windows tests, npm wrapper smoke, GitGuardian
2026-05-08 10:15:43 -05:00
Hunter Bown 37178ed6b4 fix(tui): make transcript scrollbar inert
## Summary
- remove app-owned transcript scrollbar click/drag state so the right gutter cannot capture mouse drags
- keep wheel scrolling, jump-to-latest, and normal transcript text selection intact
- align the behavior with opencode's session surface: scroll via wheel/key paths, no app-level scrollbar drag affordance

## Test plan
- cargo test -p deepseek-tui transcript_scrollbar_gutter_is_not_draggable --locked
- cargo test -p deepseek-tui left_down_inside_transcript_starts_selection --locked
- cargo fmt --all -- --check
- git diff --check
- GitHub CI: lint, version drift, ubuntu/macos/windows tests, npm wrapper smoke, GitGuardian
2026-05-08 10:05:07 -05:00
Hunter Bown cd8f247fa1 fix(tui): accept uppercase approval shortcuts
## Summary
- accept uppercase Y/A/N/D approval shortcuts in addition to lowercase and numeric input
- keep destructive approvals on the existing two-step confirmation path
- leave #1199 open because the Windows ConHost rendering report is broader than shortcut casing

## Test plan
- cargo test -p deepseek-tui benign_y_one_step_approves --locked
- cargo test -p deepseek-tui benign_a_two_approves_for_session --locked
- cargo test -p deepseek-tui benign_n_d_three_all_deny --locked
- cargo test -p deepseek-tui destructive_y_first_press_stages_then_second_commits --locked
- cargo test -p deepseek-tui destructive_a_first_press_stages_then_second_commits_session --locked
- cargo test -p deepseek-tui destructive_deny_does_not_require_confirmation --locked
- cargo fmt --all -- --check
- git diff --check
- GitHub CI: lint, version drift, ubuntu/macos/windows tests, npm wrapper smoke, GitGuardian
2026-05-08 10:04:30 -05:00
Hunter Bown c0fe2e3360 fix(tui): handle macOS option-v details shortcut
## Summary
- treat the macOS Option+V legacy glyph as the tool-details shortcut instead of inserting text
- show the platform-appropriate details shortcut label in active tool status/footer copy
- add regression coverage for macOS glyph handling and existing tool-details target behavior

## Test plan
- cargo test -p deepseek-tui macos_option_v_glyph_is_treated_as_details_shortcut_only_on_macos --locked
- cargo test -p deepseek-tui detail_target_prefers_visible_tool_card --locked
- cargo test -p deepseek-tui active_tool_status_label_summarizes_live_tool_group --locked
- cargo fmt --all -- --check
- git diff --check
- GitHub CI: Version drift, Lint, Test (ubuntu-latest), Test (macos-latest), Test (windows-latest), npm wrapper smoke, GitGuardian
2026-05-08 09:54:05 -05:00
Hunter Bown a332077410 fix(client): fallback empty tool call names
## Summary
- normalize empty or missing tool-call names to unknown_tool in streaming and non-streaming responses
- include source/id context in fallback warnings
- add regression coverage for empty streaming names and missing non-streaming names

## Test plan
- cargo test -p deepseek-tui decoder_uses_fallback_name_for_empty_streaming_tool_name --locked
- cargo test -p deepseek-tui non_streaming_response_uses_fallback_name_for_missing_tool_name --locked
- cargo fmt --all -- --check
- git diff --check
- GitHub CI: Version drift, Lint, Test (ubuntu-latest), Test (macos-latest), Test (windows-latest), npm wrapper smoke, GitGuardian
2026-05-08 09:17:35 -05:00
Liu-Vince 7d5c411845 fix(tui): preserve code block indentation
## Summary
- Preserve leading whitespace when rendering fenced code blocks.
- Hard-wrap code lines without word-splitting away indentation.
- Account for tab width when wrapping code lines.
- Close #1149.

## Verification
- GitHub CI passed: lint, version drift, ubuntu/macos/windows tests, npm wrapper smoke, GitGuardian.
2026-05-08 09:01:24 -05:00
Reid d2fea408f5 fix(tui): add headers to task list output
## Summary
- Add explicit ID, Status, Time, and Title headers to /task list output.
- Align task rows without changing task storage or execution behavior.

## Verification
- GitHub CI passed: lint, version drift, ubuntu/macos/windows tests, npm wrapper smoke, GitGuardian.
2026-05-08 09:01:14 -05:00
Liu-Vince 66a20ded2e docs(config): document additional environment variables
## Summary
- Document DEEPSEEK_STREAM_OPEN_TIMEOUT_SECS.
- Document DEEPSEEK_FORCE_HTTP1.
- Document DEEPSEEK_HOME and DEEPSEEK_AUTOMATIONS_DIR.

## Verification
- GitHub CI passed: lint, version drift, ubuntu/macos/windows tests, npm wrapper smoke, GitGuardian.
2026-05-08 09:01:03 -05:00
kitty 096cb64504 fix(tools): find gh across common install paths
## Summary
- Probe common Linux and macOS gh CLI paths when DEEPSEEK_GH_BIN is not set.
- Keep the existing /opt/homebrew/bin/gh fallback for compatibility.
- Improve the not-installed error message.

## Verification
- GitHub CI passed: lint, version drift, ubuntu/macos/windows tests, npm wrapper smoke, GitGuardian.
2026-05-08 09:00:54 -05:00
Sun 967236f9ef fix(tui): preserve upstream stream pacing
## Summary
- Preserve upstream SSE delta cadence for normal-motion streaming.
- Keep one-grapheme pacing for low-motion mode.
- Close #1200.

## Verification
- GitHub CI passed: lint, version drift, ubuntu/macos/windows tests, npm wrapper smoke, GitGuardian.
2026-05-08 09:00:43 -05:00
Hunter Bown f183501fbd fix(client): route non-beta paths from beta base to v1 (#1174)
* test: add reproducer for /models 404 on beta base URL

* fix: route non-beta paths to /v1 when base URL ends with /beta

---------

Co-authored-by: Hanmiao Li <894876246@qq.com>
2026-05-08 02:59:56 -05:00
Hunter Bown 236a529a9d fix(deps): extend libc to all Unix targets for FreeBSD compatibility (#1173)
`libc` was declared only for macOS and Linux, causing a build failure on
FreeBSD (#1143). All call sites that use `libc` are already guarded with
`#[cfg(unix)]` or narrower OS-specific guards, so broadening the
dependency to `cfg(unix)` fixes FreeBSD (and other BSDs) with no
behavioural change on macOS or Linux.

Co-authored-by: Vince <liuwenchang.x@qq.com>
2026-05-08 02:57:25 -05:00
ZzzPL 219e15a85f fix(tui): add stale busy-state watchdog (#1170) 2026-05-08 02:48:32 -05:00
Hunter Bown ad31d2bcec docs(competitive-analysis): reflect LSP diagnostics implementation (#1171)
Update competitive analysis to reflect that LSP integration is now
implemented as automatic post-edit diagnostics injection, and adjust
the recommended implementation order accordingly.

Co-authored-by: Stephen Xu <wexu@expediagroup.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-08 02:47:35 -05:00
Hunter Bown ec268e50a1 feat: distinct user message body color (green) (#1168)
Use a dedicated user_body_style() with a green (#4ADE80 / #15803D)
foreground color for user messages instead of sharing the
message_body_style() (TEXT_PRIMARY) used by assistant messages.

This makes user input visually distinguishable from assistant
responses in the transcript.

Changes:
- palette.rs: add USER_BODY and LIGHT_USER_BODY color constants
- palette.rs: adapt_fg_for_palette_mode entry for light-mode mapping
- history.rs: add user_body_style() function
- history.rs: replace message_body_style() with user_body_style()
  in all three User render paths (lines / lines_with_options /
  transcript_lines)

Co-authored-by: Assassin-D007 <ws1554410958@163.com>
2026-05-08 02:44:02 -05:00
Hunter Bown 218d797b0b fix(cli): preserve split prompt words from Windows shims (#1160) 2026-05-08 02:39:09 -05:00
Hunter Bown f91970f092 fix(skills): accept workflow pack archive layouts (#1164)
Teach /skill install to recognize compatible skill directories such as .claude/skills/<name>/SKILL.md, nested packages/.../skills/<name>/SKILL.md, and single nested skill repos while still extracting only the selected subtree.

Also make /init treat an existing AGENTS.md as an idempotent no-op so the TUI matches the dispatcher behavior instead of surfacing a scary error for an already-initialized project.
2026-05-08 02:37:21 -05:00
Hunter Bown 724af9494a fix(tui): keep interactive sessions in alternate screen (#1158) 2026-05-08 02:30:57 -05:00
Sun 73f92bfb5a fix(fetch_url): add proxy DNS opt-in (#1103) 2026-05-08 02:26:12 -05:00
Hunter Bown a89835310f fix(tui): wrap slash menu arrow navigation (#1152)
Co-authored-by: reidliu41 <reid201711@gmail.com>
2026-05-08 02:22:34 -05:00
Aqil Aziz de4ecee41c docs: fix memory skill link (#1096) 2026-05-08 02:21:11 -05:00
Friende 8f39aadf0b docs: fix help keybinding reference (#1095) 2026-05-08 02:20:40 -05:00
jiaren wang 0d7cbe37a8 fix(undo): sync session context after snapshot restore (#1139) (#1150) 2026-05-08 02:14:04 -05:00
Friende f969de91aa fix(memory): report omitted bytes in truncation marker 2026-05-08 01:55:30 -05:00
Reid 71c5dfbfc6 fix(tui): make composer arrows navigate input history (#1117)
Make plain Up/Down navigate composer input history instead of scrolling
  the transcript from an empty composer.

  Keep menu overlays in control of arrow keys, preserve existing transcript
  scroll shortcuts, and support word-wise cursor movement with Ctrl or
  Alt/Option Left/Right.
2026-05-08 01:52:00 -05:00
Sun 2904d817fa fix(rlm): preserve prompt cache usage (#1127)
* fix(rlm): preserve prompt cache usage

* refactor(rlm): share prompt cache usage helper
2026-05-08 01:51:24 -05:00
jiaren wang fa32e7ac53 fix(plan): enforce read-only tool boundaries in Plan mode (#1114) 2026-05-08 01:49:31 -05:00
Hunter Bown f283e56bd1 fix(prompts): prioritize user language for reasoning (#1137) 2026-05-07 23:53:15 -05:00
Hunter Bown b31b93aaae v0.8.19: endpoint, release workflow, IME + viewport fixes (#1128)
* fix(config): keep DeepSeek beta endpoint for legacy cn alias

* fix(ci): filter download-artifact to deepseek* pattern

Prevents the release aggregation job from picking up non-binary
artifacts (e.g. Docker .dockerbuild cache layers) that cause the
checksum manifest to include spurious entries and the Release to
carry files it shouldn't.

* fix(tui): enable focus events to restore IME after app-switch

On macOS, switching away (Cmd+Tab) and back suspends the IME compositor.
Without focus-event handling, the TUI never signals readiness to the
terminal, so CJK input methods (Pinyin, Zhuyin, etc.) stop working.

- EnableFocusChange on startup so the terminal reports FocusGained/FocusLost
- Re-push KeyboardEnhancementFlags on FocusGained (some terminals reset
  the enhanced keyboard mode on focus-loss)
- DisableFocusChange on shutdown for clean terminal handoff

* chore: cargo fmt

* docs: add DataWhale and DeepSeek to acknowledgments

* docs: fix DeepSeek name etymology in acknowledgments

* fix(tui): recapture viewport on focus restore

* docs: thank DeepSeek and DataWhale bilingually
2026-05-07 23:05:39 -05:00
Hunter Bown 3521f1af91 fix(web): drop deepseek-cn from facts-drift cron labelMap (#1125)
Sister fix to #1108 / #1121. The 6-hour facts-drift cron has its own
provider labelMap (lib/facts-drift.ts) that re-derives ApiProvider
from the live source on GitHub and writes to CURATED_KV under
"facts:current". Without this fix, every cron tick repopulates the
KV cache with deepseek-cn even though the published binary's
ProviderArg rejects it — undoing the static facts.generated.ts fix.

Mirror the labelMap that derive-facts.mjs uses (no DeepseekCN entry).

Stale "facts:current" KV entry was deleted manually so this takes
effect immediately rather than after the next 6h cron tick.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 22:04:18 -05:00
Hunter Bown 4eccb1b5cd fix(web): correct China-network install snippet (#1104 follow-up) (#1121)
DeepSeek's official API has a single endpoint, https://api.deepseek.com,
with servers physically in China. There is no separate mainland endpoint,
and api.deepseeki.com is a typo grandfathered into the source.

The /zh/install "国内 API 访问" panel previously suggested users set a
custom base_url to a China endpoint, which doesn't exist. Replace with
the truth: the default works for mainland users; only override
DEEPSEEK_BASE_URL if you have a private mirror.

Also re-runs derive-facts to keep facts.generated.ts at 9 providers.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 21:53:40 -05:00
Hunter Bown b417fc9efa chore(ci): remove deploy-web workflow until Cloudflare token is sorted (#1115)
The current CLOUDFLARE_API_TOKEN secret authenticates but lacks
User -> User Details -> Read, which OpenNext needs to call the
/memberships endpoint during the KV populate step. Until that
permission is added (or the token is regenerated from Cloudflare's
"Edit Cloudflare Workers" template), every push to web/** fails CI.

Removing the workflow file until the token is ready. Re-add when
the secret has the right scopes; the workflow's previous content
is preserved in git history at 6483997480.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 21:17:05 -05:00
Hunter Bown 6483997480 ci(deploy-web): bump Node to 22 for wrangler@4 (#1111)
wrangler 4 requires Node.js >=22; the deploy job was pinned to 20
and failed at `npx wrangler deploy` with "Wrangler requires at
least Node.js v22.0.0".

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 21:03:42 -05:00
Hunter Bown 9e45780ba0 feat(web): community site for deepseek-tui.com (mobile + color refresh) (#1108)
First commit of the Next.js community site that powers
deepseek-tui.com, deployed via Cloudflare Workers / OpenNext.

This commit lands the scaffold and applies the visual + correctness
pass requested by community feedback:

- Palette: drop the cream/Anthropic-feel paper (#F4F1E8) for a
  DeepSeek-aligned cool white + soft gray (#FFFFFF / #F4F6FB), with
  indigo accents kept. Soften default hairlines so a pure-white
  background reads clean instead of harsh.
- Mobile: add a hamburger menu (mobile-menu.tsx) so phones can reach
  Install / Docs / Activity / Roadmap / Contribute — previously the
  link list was hidden on phones with no replacement. Tighter hero,
  flexible button row, viewport-safe code blocks, columnar grids
  collapse cleanly under 768px, and the printed-almanac center rule
  is desktop-only now (it sliced through narrow viewports).
- "How it works" diagram: replace the hand-rolled ASCII art (which
  misaligned under CJK monospace because Han characters take 2
  columns vs Latin's 1, per dhh's note in WeChat) with a real
  mermaid diagram rendered client-side via dynamic import. Uses the
  mermaid.live standard syntax 庄表伟 recommended.
- Issue #1104: the docs listed a `deepseek-cn` provider that the
  v0.8.16 binary doesn't accept (`ProviderArg` in crates/cli only
  has 9 variants; the 10th lives only in the legacy tui/config.rs).
  derive-facts.mjs now omits `deepseek-cn` until that variant is
  wired through the shared ProviderKind, and the install page's
  China-network recipe uses `base_url` / `DEEPSEEK_BASE_URL` (which
  actually works on v0.8.16) instead of the unsupported provider.

Auto-deploys via .github/workflows/deploy-web.yml on push to main.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 21:00:06 -05:00
Hunter Bown b3329f69f1 fix(release): unblock arm64 docker image build
Merge release infrastructure fix for v0.8.18 Docker/GHCR publish.
2026-05-07 20:56:47 -05:00
Hunter B 10c6901b64 fix(release): unblock arm64 docker image build 2026-05-07 20:48:40 -05:00
Hunter Bown 5c573b958b merge: v0.8.18 follow-up
Merge v0.8.18 release branch after local release gates and green CI.
2026-05-07 20:21:39 -05:00