diff --git a/docs/agents/deepseek-official.md b/docs/agents/deepseek-official.md new file mode 100644 index 0000000000..12fabcd391 --- /dev/null +++ b/docs/agents/deepseek-official.md @@ -0,0 +1,21 @@ +# Official DeepSeek Harness ACP in Codeg + +This built-in is the first-party DeepSeek Harness (DSH) ACP profile. It is a **separate** agent (`deepseek_official`) from Codeg's existing `deepseek` integration using the community `deepseek-acp` bridge. Previously saved DeepSeek sessions and existing custom `dsh` registrations remain distinct. + +## Requirements + +Install Node.js **24.9.0+** and configure DSH's model-provider credentials (for example `DEEPSEEK_API_KEY`) with DSH itself or Codeg's agent environment editor. Codeg can install the pinned npm release through its normal agent installer. To install the same release manually: + +```sh +npm install -g @deepseek-ai/dsh@0.2.1-rc.4 +``` + +Codeg launches `dsh --profile acp` on stdio (it is an ACP server, not an interactive terminal). Choose **DeepSeek Harness (Official ACP)** from the agent picker; the legacy entry continues to launch `deepseek-acp`. + +## Supported features and limits + +The official ACP profile provides `session/new`, `session/list`, `session/resume`, `session/close`, `session/prompt`, cancellation, permissions, model selection and (for supporting models) reasoning effort. Session-scoped MCP servers are supported over stdio and Streamable HTTP, including Codeg's MCP collaboration companion. StdIO MCP commands **must have absolute executable paths**; SSE MCP is unsupported. + +It deliberately omits `session/load` transcript replay, `session/fork`, deletion, additional directories, interactive modes/plans/terminals, and editor-specific presentation cards. Codeg keeps its **own ACP transcript** for sessions started through this built-in. It does not parse or import DSH's private session format into this new agent; existing community-bridge history remains untouched. The legacy DeepSeek-specific model catalog editor and rich editor features belong to the legacy bridge, not to this profile. + +Sources: [DSH CLI](https://github.com/deepseek-ai/deepseek-harness/blob/master/apps/cli/README.md), [ACP contract](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/acp/acp/README.md), [Issue #1057](https://github.com/spacering-net/codeg/issues/1057). diff --git a/src-tauri/src/acp/delegation/companion.rs b/src-tauri/src/acp/delegation/companion.rs index a07065072b..e33c396de8 100644 --- a/src-tauri/src/acp/delegation/companion.rs +++ b/src-tauri/src/acp/delegation/companion.rs @@ -4673,13 +4673,32 @@ mod tests { agents.len(), crate::models::agent::BUILTIN_AGENT_TYPES.len() ); - assert_eq!(agents[0], "claude_code"); - assert_eq!(agents[14], "antigravity"); - assert_eq!(agents[15], "kiro"); - assert_eq!(agents[16], "zcode"); - assert_eq!(agents[17], "trae"); - assert_eq!(agents[18], "command_code"); - assert_eq!(agents[19], "minimax_code"); + assert_eq!( + Value::Array(agents), + serde_json::json!([ + "claude_code", + "codex", + "open_code", + "gemini", + "cline", + "open_claw", + "hermes", + "code_buddy", + "kimi_code", + "pi", + "grok", + "cursor", + "deepseek", + "deepseek_official", + "qoder", + "antigravity", + "kiro", + "zcode", + "trae", + "command_code", + "minimax_code" + ]) + ); } #[tokio::test] diff --git a/src-tauri/src/acp/delegation/tool_schema.json b/src-tauri/src/acp/delegation/tool_schema.json index 13eb0c243b..0eb9036d22 100644 --- a/src-tauri/src/acp/delegation/tool_schema.json +++ b/src-tauri/src/acp/delegation/tool_schema.json @@ -25,6 +25,7 @@ "grok", "cursor", "deepseek", + "deepseek_official", "qoder", "antigravity", "kiro", @@ -117,7 +118,7 @@ }, { "name": "ask_user_question", - "description": "Ask the user one or more multiple-choice questions and BLOCK until they answer. The questions render as interactive cards above the user's input box; this call returns only once the user submits their choices (or dismisses the card). Use ONLY when you are blocked on a decision that is genuinely the user's to make — one you cannot resolve from the request, the code, or sensible defaults (e.g. which approach, which format, which library, which of several files). Do NOT use it to ask 'should I proceed?' or to confirm an obvious default, and do NOT use it for open-ended questions that aren't a small set of discrete choices. The user can always pick 'Other' and type a custom answer, so don't add your own 'Other' option. If you want to recommend a choice, put it first and append ' (Recommended)' to its label. Prefer ONE call with a few related questions over many sequential calls. Once the user has answered \u2014 including picking a recommended option or telling you to proceed \u2014 act on the answer immediately. Do NOT call this tool again to confirm execution or to ask whether you should proceed.", + "description": "Ask the user one or more multiple-choice questions and BLOCK until they answer. The questions render as interactive cards above the user's input box; this call returns only once the user submits their choices (or dismisses the card). Use ONLY when you are blocked on a decision that is genuinely the user's to make — one you cannot resolve from the request, the code, or sensible defaults (e.g. which approach, which format, which library, which of several files). Do NOT use it to ask 'should I proceed?' or to confirm an obvious default, and do NOT use it for open-ended questions that aren't a small set of discrete choices. The user can always pick 'Other' and type a custom answer, so don't add your own 'Other' option. If you want to recommend a choice, put it first and append ' (Recommended)' to its label. Prefer ONE call with a few related questions over many sequential calls. Once the user has answered — including picking a recommended option or telling you to proceed — act on the answer immediately. Do NOT call this tool again to confirm execution or to ask whether you should proceed.", "inputSchema": { "type": "object", "required": [ diff --git a/src-tauri/src/acp/file_system_runtime.rs b/src-tauri/src/acp/file_system_runtime.rs index bd5710c223..50023e77e0 100644 --- a/src-tauri/src/acp/file_system_runtime.rs +++ b/src-tauri/src/acp/file_system_runtime.rs @@ -893,7 +893,8 @@ fn agent_root_slots(agent_type: AgentType) -> &'static [RootSlot] { // 1.86.3, 1.88.0 and 1.88.1). So is MiniMax Code: its tools run // in-process and it sends codeg no `fs/*` or `terminal/*` request // (verified against 0.7.0). - AgentType::Custom(_) + AgentType::DeepSeekOfficial + | AgentType::Custom(_) | AgentType::ZCode | AgentType::Trae | AgentType::CommandCode diff --git a/src-tauri/src/acp/registry.rs b/src-tauri/src/acp/registry.rs index 9d8fa9e659..3b155bc1e6 100644 --- a/src-tauri/src/acp/registry.rs +++ b/src-tauri/src/acp/registry.rs @@ -256,7 +256,7 @@ pub fn current_platform() -> &'static str { } } -/// The twenty built-in agents. Excludes user-registered custom agents — use +/// The twenty-one built-in agents. Excludes user-registered custom agents — use /// [`all_acp_agents`] for the live set. pub fn builtin_acp_agents() -> Vec { vec![ @@ -273,6 +273,7 @@ pub fn builtin_acp_agents() -> Vec { AgentType::Grok, AgentType::Cursor, AgentType::DeepSeek, + AgentType::DeepSeekOfficial, AgentType::Qoder, AgentType::Antigravity, AgentType::Kiro, @@ -283,7 +284,7 @@ pub fn builtin_acp_agents() -> Vec { ] } -/// Every agent codeg can currently drive: the twenty built-ins followed by +/// Every agent codeg can currently drive: the twenty-one built-ins followed by /// the user's registered custom ACP agents (sorted by id). pub fn all_acp_agents() -> Vec { let mut agents = builtin_acp_agents(); @@ -306,6 +307,8 @@ pub fn registry_id_for(agent_type: AgentType) -> &'static str { AgentType::Grok => "grok-build", AgentType::Cursor => "cursor", AgentType::DeepSeek => "deepseek-acp", + // Avoid taking over existing custom:dsh registrations. + AgentType::DeepSeekOfficial => "codeg-deepseek-official", AgentType::Qoder => "qoder-cli", AgentType::Antigravity => "antigravity-acp", AgentType::Kiro => "kiro-cli", @@ -344,6 +347,7 @@ pub fn from_registry_id(id: &str) -> Option { "grok-build" => Some(AgentType::Grok), "cursor" => Some(AgentType::Cursor), "deepseek-acp" => Some(AgentType::DeepSeek), + "codeg-deepseek-official" => Some(AgentType::DeepSeekOfficial), "qoder-cli" => Some(AgentType::Qoder), "antigravity-acp" => Some(AgentType::Antigravity), "kiro-cli" => Some(AgentType::Kiro), @@ -5480,6 +5484,23 @@ pub fn get_agent_meta(agent_type: AgentType) -> AcpAgentMeta { node_required: Some("22.0.0"), }, }, + AgentType::DeepSeekOfficial => AcpAgentMeta { + agent_type, + supports_mcp: true, + name: "DeepSeek Harness (Official ACP)", + description: "First-party DSH automation ACP over stdio", + // The native profile supports ACP session/new, list, resume, close, + // prompts, config options and MCP, but not session/load or fork. + // Keep its Codeg ACP transcripts separate from deepseek-acp logs. + distribution: AgentDistribution::Npx { + version: "0.2.1-rc.4", + package: "@deepseek-ai/dsh@0.2.1-rc.4", + cmd: "dsh", + args: &["--profile", "acp"], + env: &[], + node_required: Some("24.9.0"), + }, + }, AgentType::DeepSeek => AcpAgentMeta { agent_type, supports_mcp: true, @@ -6836,6 +6857,21 @@ mod tests { "deepseek-acp@0.9.0", Some("22.0.0"), ); + assert_npx_version( + AgentType::DeepSeekOfficial, + "0.2.1-rc.4", + "@deepseek-ai/dsh@0.2.1-rc.4", + Some("24.9.0"), + ); + match get_agent_meta(AgentType::DeepSeekOfficial).distribution { + AgentDistribution::Npx { cmd, args, .. } => { + assert_eq!(cmd, "dsh"); + assert_eq!(args, &["--profile", "acp"]); + } + other => panic!("expected official DSH npx distribution, got {other:?}"), + } + assert!(get_agent_meta(AgentType::DeepSeekOfficial).supports_mcp); + assert_eq!(from_registry_id("codeg-deepseek-official"), Some(AgentType::DeepSeekOfficial)); assert_npx_version( AgentType::Qoder, "1.1.75", diff --git a/src-tauri/src/commands/acp.rs b/src-tauri/src/commands/acp.rs index 7e2a47f817..f486516457 100644 --- a/src-tauri/src/commands/acp.rs +++ b/src-tauri/src/commands/acp.rs @@ -9544,7 +9544,7 @@ pub(crate) fn skill_storage_spec(agent_type: AgentType) -> Option Some(SkillStorageSpec { + AgentType::DeepSeek | AgentType::DeepSeekOfficial => Some(SkillStorageSpec { kind: SkillStorageKind::SkillDirectoryOrMarkdownFile, global_dirs: vec![ crate::parsers::deepseek::resolve_dsh_home_dir().join("skills"), @@ -9865,7 +9865,7 @@ fn project_skill_dirs( fn project_skill_bases(agent_type: AgentType, workspace: &str) -> Vec { let workspace = PathBuf::from(workspace); let every_level = match agent_type { - AgentType::DeepSeek | AgentType::KimiCode => false, + AgentType::DeepSeek | AgentType::DeepSeekOfficial | AgentType::KimiCode => false, AgentType::ZCode => true, _ => return vec![workspace], }; @@ -10898,6 +10898,12 @@ fn agent_env_keys(agent_type: AgentType) -> (&'static str, &'static str, &'stati "DEEPSEEK_API_KEY", "DEEPSEEK_ACP_MODEL", ), + // Official DSH selects models through ACP config options, not env. + AgentType::DeepSeekOfficial => ( + "DEEPSEEK_BASE_URL", + "DEEPSEEK_API_KEY", + "DSH_MODEL", // no-op fallback; do not inherit OPENAI_MODEL + ), // Qoder's non-interactive credential is `QODER_PERSONAL_ACCESS_TOKEN` // — "设置后自动使用 PAT 认证" in the 1.1.23 package's own README, and the // only way to authenticate a headless/server/Docker install, where the @@ -11288,6 +11294,9 @@ pub(crate) fn parse_provider_model( trimmed_raw.map(str::to_string), ); } + AgentType::DeepSeekOfficial => { + // Model changes use session/set_config_option, not a provider env var. + } AgentType::Codex => { // The provider stores a structured model config (JSON) or a legacy // plain slug; OPENAI_MODEL is the default slug either way. @@ -11417,7 +11426,7 @@ fn cascade_update_agent_config( // (`acpUpdateAgentEnv`); it does not write provider creds into // ~/.grok/config.toml and does not participate in the cascade. } - AgentType::DeepSeek => { + AgentType::DeepSeek | AgentType::DeepSeekOfficial => { // deepseek-acp authenticates via `DEEPSEEK_API_KEY` (or // `~/.dsh/.credentials.yaml`, which codeg never writes), injected // as a runtime env var through the generic agent settings panel; diff --git a/src-tauri/src/commands/experts.rs b/src-tauri/src/commands/experts.rs index 0f2cb12e59..2f8f90f3de 100644 --- a/src-tauri/src/commands/experts.rs +++ b/src-tauri/src/commands/experts.rs @@ -805,6 +805,7 @@ fn supported_agents() -> Vec { AgentType::Grok, AgentType::Cursor, AgentType::DeepSeek, + AgentType::DeepSeekOfficial, AgentType::Qoder, AgentType::Antigravity, AgentType::Kiro, diff --git a/src-tauri/src/commands/mcp.rs b/src-tauri/src/commands/mcp.rs index d30aeb1033..d558339f1c 100644 --- a/src-tauri/src/commands/mcp.rs +++ b/src-tauri/src/commands/mcp.rs @@ -3707,6 +3707,11 @@ pub fn read_servers_for_agent_type( // unlike Kimi/Grok/Cursor, DeepSeek must stay OFF the forward skip // list in `connection.rs` or these servers never arrive. AgentType::DeepSeek => read_deepseek_servers(), + // The official DSH profile is a separate agent with no Codeg-managed + // MCP store yet. Do not inherit the community bridge's assignments + // from `$DSH_HOME/mcp.json`; the collaboration companion is injected + // separately over the ACP wire. + AgentType::DeepSeekOfficial => Ok(BTreeMap::new()), AgentType::ZCode => read_zcode_servers(), // Qoder reads MCP servers from its own settings.json `mcpServers` // (gemini-schema settings file) at startup — see the Qoder section @@ -8449,6 +8454,36 @@ mod tests { } } + #[test] + fn deepseek_official_does_not_read_legacy_mcp_assignments() { + use crate::models::agent::AgentType; + + let dir = tempfile::tempdir().expect("tempdir"); + let path = dir.path().join("mcp.json"); + let raw = json!({"mcpServers": { + "legacy-only": {"command": "legacy-mcp", "env": {"TOKEN": "fixture"}} + }}) + .to_string(); + fs::write(&path, &raw).unwrap(); + + temp_env::with_var("DSH_HOME", Some(dir.path()), || { + let legacy = read_servers_for_agent_type(AgentType::DeepSeek).unwrap(); + assert_eq!(legacy["legacy-only"]["command"], "legacy-mcp"); + assert!(read_servers_for_agent_type(AgentType::DeepSeekOfficial) + .unwrap() + .is_empty()); + assert_eq!(fs::read_to_string(&path).unwrap(), raw); + + // An unrelated malformed legacy store must not affect official DSH. + fs::write(&path, "{broken").unwrap(); + assert!(read_servers_for_agent_type(AgentType::DeepSeek).is_err()); + assert!(read_servers_for_agent_type(AgentType::DeepSeekOfficial) + .unwrap() + .is_empty()); + assert_eq!(fs::read_to_string(&path).unwrap(), "{broken"); + }); + } + #[test] fn deepseek_mcp_json_round_trips_the_canonical_spec() { // `$DSH_HOME/mcp.json` is codeg's OWN store (deepseek-acp reads no MCP diff --git a/src-tauri/src/commands/office_tools.rs b/src-tauri/src/commands/office_tools.rs index a8c329cce9..88e2406ff1 100644 --- a/src-tauri/src/commands/office_tools.rs +++ b/src-tauri/src/commands/office_tools.rs @@ -1061,6 +1061,7 @@ fn supported_agents() -> Vec { AgentType::Grok, AgentType::Cursor, AgentType::DeepSeek, + AgentType::DeepSeekOfficial, AgentType::Qoder, AgentType::Antigravity, AgentType::Kiro, diff --git a/src-tauri/src/commands/science.rs b/src-tauri/src/commands/science.rs index 9a4d8d8d14..d79ae3ae9e 100644 --- a/src-tauri/src/commands/science.rs +++ b/src-tauri/src/commands/science.rs @@ -628,6 +628,7 @@ fn supported_agents() -> Vec { AgentType::Grok, AgentType::Cursor, AgentType::DeepSeek, + AgentType::DeepSeekOfficial, AgentType::Qoder, AgentType::Antigravity, AgentType::Kiro, diff --git a/src-tauri/src/db/service/agent_setting_service.rs b/src-tauri/src/db/service/agent_setting_service.rs index 1e0ee763f1..e409090ff2 100644 --- a/src-tauri/src/db/service/agent_setting_service.rs +++ b/src-tauri/src/db/service/agent_setting_service.rs @@ -43,6 +43,7 @@ fn default_enabled(agent_type: AgentType) -> bool { | AgentType::Grok | AgentType::Cursor | AgentType::DeepSeek + | AgentType::DeepSeekOfficial | AgentType::Qoder | AgentType::Antigravity | AgentType::Kiro diff --git a/src-tauri/src/db/service/import_service.rs b/src-tauri/src/db/service/import_service.rs index f6267280c6..49c33248b0 100644 --- a/src-tauri/src/db/service/import_service.rs +++ b/src-tauri/src/db/service/import_service.rs @@ -13,7 +13,7 @@ use crate::models::{AgentType, ConversationSummary, ImportResult}; use crate::parsers::{build_agent_parser, path_eq_for_matching, AgentEnv, AgentEnvs, AgentParser}; /// Every locally-parsable agent, in the canonical parser order. -const ALL_PARSER_AGENTS: [AgentType; 20] = [ +const ALL_PARSER_AGENTS: [AgentType; 21] = [ AgentType::ClaudeCode, AgentType::Codex, AgentType::OpenCode, @@ -27,6 +27,7 @@ const ALL_PARSER_AGENTS: [AgentType; 20] = [ AgentType::Grok, AgentType::Cursor, AgentType::DeepSeek, + AgentType::DeepSeekOfficial, AgentType::Qoder, AgentType::Antigravity, AgentType::Kiro, diff --git a/src-tauri/src/models/agent.rs b/src-tauri/src/models/agent.rs index c0a00face7..cb5cb9b32b 100644 --- a/src-tauri/src/models/agent.rs +++ b/src-tauri/src/models/agent.rs @@ -8,7 +8,7 @@ pub const CUSTOM_AGENT_WIRE_PREFIX: &str = "custom:"; /// Which agent backs a conversation. /// -/// The twenty named variants are compile-time built-ins with hand-written +/// The twenty-one named variants are compile-time built-ins with hand-written /// launch metadata (`acp::registry`). Most use a dedicated transcript parser; /// ZCode, TRAE CLI, Command Code and MiniMax Code use the Codeg-owned ACP transcript. /// [`AgentType::Custom`] is the open end: a user-registered @@ -35,6 +35,7 @@ pub enum AgentType { Grok, Cursor, DeepSeek, + DeepSeekOfficial, Qoder, Antigravity, Kiro, @@ -47,7 +48,7 @@ pub enum AgentType { Custom(&'static str), } -/// The twenty compile-time agents, in declaration order. Does NOT include +/// The twenty-one compile-time agents, in declaration order. Does NOT include /// custom agents — use [`crate::acp::registry::all_acp_agents`] for the live /// set that includes them. pub const BUILTIN_AGENT_TYPES: &[AgentType] = &[ @@ -64,6 +65,7 @@ pub const BUILTIN_AGENT_TYPES: &[AgentType] = &[ AgentType::Grok, AgentType::Cursor, AgentType::DeepSeek, + AgentType::DeepSeekOfficial, AgentType::Qoder, AgentType::Antigravity, AgentType::Kiro, @@ -88,6 +90,7 @@ impl AgentType { | AgentType::Trae | AgentType::CommandCode | AgentType::MiniMaxCode + | AgentType::DeepSeekOfficial ) } @@ -128,6 +131,7 @@ impl AgentType { AgentType::Grok => Cow::Borrowed("grok"), AgentType::Cursor => Cow::Borrowed("cursor"), AgentType::DeepSeek => Cow::Borrowed("deepseek"), + AgentType::DeepSeekOfficial => Cow::Borrowed("deepseek_official"), AgentType::Qoder => Cow::Borrowed("qoder"), AgentType::Antigravity => Cow::Borrowed("antigravity"), AgentType::Kiro => Cow::Borrowed("kiro"), @@ -156,6 +160,7 @@ impl AgentType { "grok" => Some(AgentType::Grok), "cursor" => Some(AgentType::Cursor), "deepseek" => Some(AgentType::DeepSeek), + "deepseek_official" => Some(AgentType::DeepSeekOfficial), "qoder" => Some(AgentType::Qoder), "antigravity" => Some(AgentType::Antigravity), "kiro" => Some(AgentType::Kiro), @@ -212,6 +217,7 @@ pub fn is_valid_custom_agent_id(id: &str) -> bool { | "grok" | "cursor" | "deepseek" + | "deepseek_official" | "qoder" | "antigravity" | "kiro" @@ -248,6 +254,7 @@ impl fmt::Display for AgentType { AgentType::Grok => write!(f, "Grok"), AgentType::Cursor => write!(f, "Cursor"), AgentType::DeepSeek => write!(f, "DeepSeek Harness"), + AgentType::DeepSeekOfficial => write!(f, "DeepSeek Harness (Official ACP)"), AgentType::Qoder => write!(f, "Qoder"), AgentType::Antigravity => write!(f, "Google Antigravity"), AgentType::Kiro => write!(f, "Kiro CLI"), @@ -288,6 +295,7 @@ mod tests { (AgentType::Grok, "grok"), (AgentType::Cursor, "cursor"), (AgentType::DeepSeek, "deepseek"), + (AgentType::DeepSeekOfficial, "deepseek_official"), (AgentType::Qoder, "qoder"), (AgentType::Antigravity, "antigravity"), (AgentType::Kiro, "kiro"), @@ -312,6 +320,18 @@ mod tests { assert_eq!(BUILTIN_AGENT_TYPES.len(), expected.len()); } + #[test] + fn official_deepseek_keeps_existing_agent_identities_distinct() { + assert!(AgentType::DeepSeekOfficial.uses_acp_transcript()); + assert!(!AgentType::DeepSeek.uses_acp_transcript()); + assert!(!is_valid_custom_agent_id("deepseek_official")); + assert_eq!(AgentType::DeepSeek.as_wire(), "deepseek"); + assert_eq!(AgentType::DeepSeekOfficial.as_wire(), "deepseek_official"); + for id in ["dsh", "deepseek-harness"] { + assert_ne!(AgentType::custom(id), Some(AgentType::DeepSeekOfficial)); + } + } + #[test] fn custom_agents_round_trip_through_serde() { let agent = AgentType::custom("goose").expect("valid slug"); @@ -457,7 +477,8 @@ mod tests { assert!(AgentType::CommandCode < AgentType::custom("goose").unwrap()); assert!(AgentType::ClaudeCode < AgentType::Cursor); assert!(AgentType::Cursor < AgentType::DeepSeek); - assert!(AgentType::DeepSeek < AgentType::Qoder); + assert!(AgentType::DeepSeek < AgentType::DeepSeekOfficial); + assert!(AgentType::DeepSeekOfficial < AgentType::Qoder); assert!(AgentType::Qoder < AgentType::Antigravity); assert!(AgentType::Antigravity < AgentType::Kiro); assert!(AgentType::Kiro < AgentType::ZCode); diff --git a/src-tauri/src/parsers/mod.rs b/src-tauri/src/parsers/mod.rs index 7638de442a..af259cea99 100644 --- a/src-tauri/src/parsers/mod.rs +++ b/src-tauri/src/parsers/mod.rs @@ -427,7 +427,8 @@ pub fn build_agent_parser(agent_type: AgentType, env: &AgentEnv) -> Box> = { minimax_code: MiniMaxCodeColorIcon, pi: PiColorIcon, deepseek: DeepSeekColorIcon, + deepseek_official: DeepSeekColorIcon, kiro: KiroColorIcon, zcode: ZCodeColorIcon, trae: TraeColorIcon, diff --git a/src/lib/types.ts b/src/lib/types.ts index 0ec29db6a8..88efdc950a 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -14,6 +14,7 @@ export type BuiltinAgentType = | "grok" | "cursor" | "deepseek" + | "deepseek_official" | "qoder" | "antigravity" | "kiro" @@ -1119,6 +1120,7 @@ export const AGENT_DISPLAY_ORDER: BuiltinAgentType[] = [ "grok", "cursor", "deepseek", + "deepseek_official", "qoder", "antigravity", "kiro", @@ -1158,6 +1160,7 @@ export const ALL_AGENT_TYPES: BuiltinAgentType[] = [ "grok", "cursor", "deepseek", + "deepseek_official", "qoder", "antigravity", "kiro", @@ -1474,6 +1477,7 @@ export const AGENT_LABELS: Record = { grok: "Grok", cursor: "Cursor", deepseek: "DeepSeek Harness", + deepseek_official: "DeepSeek Harness (Official ACP)", qoder: "Qoder", antigravity: "Google Antigravity", kiro: "Kiro CLI", @@ -1497,6 +1501,7 @@ export const AGENT_COLORS: Record = { grok: "bg-neutral-900", cursor: "bg-zinc-800", deepseek: "bg-[#4D6BFE]", + deepseek_official: "bg-[#4D6BFE]", qoder: "bg-[#6C4CF1]", antigravity: "bg-[#1A73E8]", kiro: "bg-[#9046FF]",