Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "codeg",
"private": true,
"version": "0.21.3",
"version": "0.21.4",
"packageManager": "[email protected]",
"scripts": {
"dev": "next dev --turbopack",
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "codeg"
version = "0.21.3"
version = "0.21.4"
description = "Agent Code Generation App"
authors = ["feitao"]
edition = "2021"
Expand Down
70 changes: 35 additions & 35 deletions src-tauri/src/acp/registry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ pub enum AgentDistribution {
/// Used for ACP agents distributed as Python packages (e.g. Hermes).
Uvx {
version: &'static str,
/// The `uvx --from` package spec, e.g. "hermes-agent[acp,mcp]==0.18.2".
/// The `uvx --from` package spec, e.g. "hermes-agent[acp,mcp]==0.19.0".
package: &'static str,
/// The console-script entry point to run, e.g. "hermes-acp".
cmd: &'static str,
Expand Down Expand Up @@ -194,8 +194,8 @@ pub fn get_agent_meta(agent_type: AgentType) -> AcpAgentMeta {
name: "Claude Code",
description: "ACP wrapper for Anthropic's Claude",
distribution: AgentDistribution::Npx {
version: "0.58.1",
package: "@agentclientprotocol/claude-agent-acp@0.58.1",
version: "0.60.0",
package: "@agentclientprotocol/claude-agent-acp@0.60.0",
cmd: "claude-agent-acp",
args: &[],
env: &[],
Expand Down Expand Up @@ -231,8 +231,8 @@ pub fn get_agent_meta(agent_type: AgentType) -> AcpAgentMeta {
name: "Gemini CLI",
description: "Google's official CLI for Gemini",
distribution: AgentDistribution::Npx {
version: "0.50.0",
package: "@google/gemini-cli@0.50.0",
version: "0.51.0",
package: "@google/gemini-cli@0.51.0",
cmd: "gemini",
args: &["--acp", "--skip-trust"],
env: &[],
Expand Down Expand Up @@ -261,8 +261,8 @@ pub fn get_agent_meta(agent_type: AgentType) -> AcpAgentMeta {
name: "Cline",
description: "Autonomous coding agent CLI",
distribution: AgentDistribution::Npx {
version: "3.0.44",
package: "[email protected].44",
version: "3.0.46",
package: "[email protected].46",
cmd: "cline",
args: &["--acp"],
env: &[],
Expand All @@ -275,34 +275,34 @@ pub fn get_agent_meta(agent_type: AgentType) -> AcpAgentMeta {
name: "OpenCode",
description: "The open source coding agent",
distribution: AgentDistribution::Binary {
version: "1.18.3",
version: "1.18.4",
cmd: "opencode",
args: &["acp"],
env: &[],
platforms: &[
PlatformBinary {
platform: "darwin-aarch64",
url: "https://github.com/anomalyco/opencode/releases/download/v1.18.3/opencode-darwin-arm64.zip",
url: "https://github.com/anomalyco/opencode/releases/download/v1.18.4/opencode-darwin-arm64.zip",
},
PlatformBinary {
platform: "darwin-x86_64",
url: "https://github.com/anomalyco/opencode/releases/download/v1.18.3/opencode-darwin-x64.zip",
url: "https://github.com/anomalyco/opencode/releases/download/v1.18.4/opencode-darwin-x64.zip",
},
PlatformBinary {
platform: "linux-aarch64",
url: "https://github.com/anomalyco/opencode/releases/download/v1.18.3/opencode-linux-arm64.tar.gz",
url: "https://github.com/anomalyco/opencode/releases/download/v1.18.4/opencode-linux-arm64.tar.gz",
},
PlatformBinary {
platform: "linux-x86_64",
url: "https://github.com/anomalyco/opencode/releases/download/v1.18.3/opencode-linux-x64.tar.gz",
url: "https://github.com/anomalyco/opencode/releases/download/v1.18.4/opencode-linux-x64.tar.gz",
},
PlatformBinary {
platform: "windows-aarch64",
url: "https://github.com/anomalyco/opencode/releases/download/v1.18.3/opencode-windows-arm64.zip",
url: "https://github.com/anomalyco/opencode/releases/download/v1.18.4/opencode-windows-arm64.zip",
},
PlatformBinary {
platform: "windows-x86_64",
url: "https://github.com/anomalyco/opencode/releases/download/v1.18.3/opencode-windows-x64.zip",
url: "https://github.com/anomalyco/opencode/releases/download/v1.18.4/opencode-windows-x64.zip",
},
],
dir_entry: None,
Expand All @@ -314,13 +314,13 @@ pub fn get_agent_meta(agent_type: AgentType) -> AcpAgentMeta {
name: "Hermes Agent",
description: "Nous Research's self-improving agent (ACP via uvx)",
distribution: AgentDistribution::Uvx {
version: "0.18.2",
package: "hermes-agent[acp,mcp]==0.18.2",
version: "0.19.0",
package: "hermes-agent[acp,mcp]==0.19.0",
cmd: "hermes-acp",
args: &[],
env: &[],
uv_required: Some("0.5.0"),
// hermes-agent 0.18.2 is `requires-python = ">=3.11,<3.14"`, and
// hermes-agent 0.19.0 is `requires-python = ">=3.11,<3.14"`, and
// its win32 dep `pywinpty` (>=2.0.0,<3) has no Python 3.14 wheel
// (the 2.0.15 source build fails against PyO3's 3.13 ceiling).
// Without this pin uvx grabs the machine's default interpreter
Expand All @@ -336,8 +336,8 @@ pub fn get_agent_meta(agent_type: AgentType) -> AcpAgentMeta {
name: "CodeBuddy",
description: "Tencent Cloud's official AI coding assistant (ACP)",
distribution: AgentDistribution::Npx {
version: "2.124.0",
package: "@tencent-ai/codebuddy-code@2.124.0",
version: "2.125.0",
package: "@tencent-ai/codebuddy-code@2.125.0",
cmd: "codebuddy",
args: &["--acp"],
env: &[],
Expand All @@ -350,8 +350,8 @@ pub fn get_agent_meta(agent_type: AgentType) -> AcpAgentMeta {
name: "Kimi Code",
description: "Moonshot AI's official CLI coding assistant (ACP)",
distribution: AgentDistribution::Npx {
version: "0.27.0",
package: "@moonshot-ai/kimi-code@0.27.0",
version: "0.28.1",
package: "@moonshot-ai/kimi-code@0.28.1",
cmd: "kimi",
args: &["acp"],
env: &[],
Expand Down Expand Up @@ -603,14 +603,14 @@ mod tests {
fn registry_pins_current_acp_agent_versions() {
assert_npx_version(
AgentType::ClaudeCode,
"0.58.1",
"@agentclientprotocol/claude-agent-acp@0.58.1",
"0.60.0",
"@agentclientprotocol/claude-agent-acp@0.60.0",
Some("22.0.0"),
);
assert_npx_version(
AgentType::Gemini,
"0.50.0",
"@google/gemini-cli@0.50.0",
"0.51.0",
"@google/gemini-cli@0.51.0",
Some("20.0.0"),
);
assert_npx_version(
Expand All @@ -621,20 +621,20 @@ mod tests {
);
assert_npx_version(
AgentType::Cline,
"3.0.44",
"[email protected].44",
"3.0.46",
"[email protected].46",
Some("22.0.0"),
);
assert_npx_version(
AgentType::CodeBuddy,
"2.124.0",
"@tencent-ai/codebuddy-code@2.124.0",
"2.125.0",
"@tencent-ai/codebuddy-code@2.125.0",
Some("22.0.0"),
);
assert_npx_version(
AgentType::KimiCode,
"0.27.0",
"@moonshot-ai/kimi-code@0.27.0",
"0.28.1",
"@moonshot-ai/kimi-code@0.28.1",
Some("22.19.0"),
);
assert_npx_version(
Expand All @@ -650,13 +650,13 @@ mod tests {
"@xai-official/[email protected]",
Some("20.0.0"),
);
assert_binary_version(AgentType::OpenCode, "1.18.3", "/releases/download/v1.18.3/");
assert_binary_version(AgentType::OpenCode, "1.18.4", "/releases/download/v1.18.4/");
assert_uvx_version(
AgentType::Hermes,
"0.18.2",
"hermes-agent[acp,mcp]==0.18.2",
"0.19.0",
"hermes-agent[acp,mcp]==0.19.0",
Some("0.5.0"),
// hermes-agent 0.18.2 is requires-python `<3.14`; uvx must pin an
// hermes-agent 0.19.0 is requires-python `<3.14`; uvx must pin an
// interpreter it (and its win32 `pywinpty` dep) supports.
Some("3.13"),
);
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "codeg",
"version": "0.21.3",
"version": "0.21.4",
"identifier": "app.codeg",
"build": {
"beforeDevCommand": "pnpm tauri:before-dev",
Expand Down
63 changes: 32 additions & 31 deletions src/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -2023,7 +2023,9 @@
/* Browser-style tab separators (embedded desktop title-bar tab strips).
Each tab draws a hairline on its LEFT edge; the line is suppressed for the
first tab and around any active / hovered tab (Chrome behavior) using only
adjacent-sibling selectors — no :has(), so it is robust across webviews. */
adjacent-sibling selectors — no :has(), so it is robust across webviews.
Tone: `--border` off-image; boosted to `--ws-chrome-border` under a workspace
background so it matches the tab arch / strip-line border (rule below). */
.browser-tab-item {
position: relative;
}
Expand Down Expand Up @@ -2058,9 +2060,10 @@
the flush-pinned button wrapper begins, has none. Same hairline geometry as
`.browser-tab-item::before` (the wrapper shares the tabs' flex box, so the
`calc(50% - 3px)` nudge centers it on the strip midline identically) and the
same `var(--border)` tone, so it reads as just another inter-tab separator.
Suppressed when the last tab is active or hovered, mirroring how a tab drops
the separators flanking the active/hovered tab. */
same tone (`--border` off-image, `--ws-chrome-border` on — see below), so it
reads as just another inter-tab separator. Suppressed when the last tab is
active or hovered, mirroring how a tab drops the separators flanking the
active/hovered tab. */
.tab-strip-tail::before {
content: "";
position: absolute;
Expand All @@ -2079,6 +2082,16 @@
opacity: 0;
}

/* Under a workspace background image, lift the inter-tab separators (and the
trailing new-conversation divider) to the boosted `--ws-chrome-border` so they
match the tab's own arch / strip-line border color instead of the faint
theme `--border`, which washes out on the frosted strip. Off-image they stay
`--border` (above). Covers both the conversation and file tab strips. */
[data-workspace-bg="on"] .browser-tab-item::before,
[data-workspace-bg="on"] .tab-strip-tail::before {
background: var(--ws-chrome-border);
}

/* Embedded tab label — no ellipsis: fade the right edge so an overflowing title
dissolves instead of hard-cutting with "…". Pairs with `overflow-hidden
whitespace-nowrap` on the label (replaces `truncate`).
Expand Down Expand Up @@ -2167,16 +2180,18 @@
detail header. A dedicated span hosts these because the tab's own surface is
`overflow-hidden` (it would clip the outboard flares) and its ::before is
already the separator hairline. It is rendered for every embedded tab but
stays invisible (opacity 0) until the tab is active OR hovered — so hovering
a tab reveals the same reverse corners. The fill matches the tab surface:
solid `var(--background)` for the active tab, and the translucent hover shade
(`bg-background/60`) for a hovered non-active tab, so the concave never pops
as solid white. The radial-gradient mask carves the concave quarter (no color
seam). Since the item has no horizontal padding, the seat spans the surface
flush (`left/right: 0`) and each flare reaches 0.5rem outward; that fits
exactly within the group's `px-2` padding, so `overflow-hidden` never clips
the first/last tab's flare. The active tab is elevated (`z-10` on the item),
so a hovered neighbour's flare can never paint over the active tab's corner. */
stays invisible (opacity 0) until the tab is ACTIVE. Only the active tab's
solid `var(--background)` body reaches the strip bottom, so its feet flare from
real corners and read cleanly. A hovered non-active tab instead shows a
floating inset pill (`browser-tab-hover`, inset 2/2/8/2) that stops 8px short
of the bottom; revealing the feet under it left two concave nubs disconnected
from the pill at the bottom corners, so hover no longer reveals the seat. The
radial-gradient mask carves the concave quarter (no color seam). Since the item
has no horizontal padding, the seat spans the surface flush (`left/right: 0`)
and each flare reaches 0.5rem outward; that fits exactly within the group's
`px-2` padding, so `overflow-hidden` never clips the first/last tab's flare.
The active tab is elevated (`z-10` on the item), so a hovered neighbour's flare
can never paint over the active tab's corner. */
.browser-tab-seat {
position: absolute;
bottom: 0;
Expand All @@ -2192,8 +2207,7 @@
transition: none;
}
}
.browser-tab-item[data-active="true"] .browser-tab-seat,
.browser-tab-item:hover .browser-tab-seat {
.browser-tab-item[data-active="true"] .browser-tab-seat {
opacity: 1;
}
.browser-tab-seat::before,
Expand All @@ -2205,12 +2219,6 @@
width: 0.5rem;
background-color: var(--background);
}
/* Hovered (non-active) tab: match its translucent hover fill so the concave
corner blends with the hover surface instead of popping solid white. */
.browser-tab-item:not([data-active="true"]):hover .browser-tab-seat::before,
.browser-tab-item:not([data-active="true"]):hover .browser-tab-seat::after {
background-color: color-mix(in oklab, var(--background) 60%, transparent);
}
.browser-tab-seat::before {
left: -0.5rem;
-webkit-mask-image: radial-gradient(
Expand All @@ -2230,19 +2238,12 @@
mask-image: radial-gradient(circle at top right, transparent 7px, #000 8px);
}
/* Workspace 背景图开启:所有 tab 全透明,seat 反向圆角默认不显示(否则透明 tab 会挂
var(--background) 白色小圆角);hover 的非激活 tab 也抑制其填充凹角,保持全透明基调。 */
var(--background) 白色小圆角)。非激活 tab 的 seat 已不随 hover 显示(见上「仅激活」),
激活 tab 的脚在下方用真实 border 重画。 */
[data-workspace-bg="on"] .browser-tab-seat::before,
[data-workspace-bg="on"] .browser-tab-seat::after {
background-color: transparent;
}
[data-workspace-bg="on"]
.browser-tab-item:not([data-active="true"]):hover
.browser-tab-seat::before,
[data-workspace-bg="on"]
.browser-tab-item:not([data-active="true"]):hover
.browser-tab-seat::after {
background-color: transparent;
}
/* 激活 tab 的两个反向圆角脚(bg-on):用**真实 border + border-radius** 画 1px 凹弧描边,
取代旧的 radial-gradient 环带 mask——环带核仅 0.5px + 两侧抗锯齿,实机易出毛边/线头
(用户反馈「底部两角有线跑出来、过渡不自然」)。seat ::before/::after 本就是 gutter 里
Expand Down
2 changes: 1 addition & 1 deletion src/components/layout/branch-dropdown.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -812,7 +812,7 @@ export function BranchDropdown({
</>
)}
<span className={branchAccentClassName}>
{branch ?? head?.short_sha ?? t("noBranch")}
{branch ?? head?.branch ?? head?.short_sha ?? t("noBranch")}
</span>
</span>
</button>
Expand Down
Loading
Loading