Skip to content
Open
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
13 changes: 13 additions & 0 deletions Cargo.lock

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

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ fuzzy_match = { path = "crates/fuzzy_match" }
handlebars = { path = "crates/handlebars" }
http_client = { path = "crates/http_client" }
http_server = { path = "crates/http_server" }
i18n = { path = "crates/i18n" }
input_classifier = { path = "crates/input_classifier" }
integration = { path = "crates/integration" }
ipc = { path = "crates/ipc" }
Expand Down
1 change: 1 addition & 0 deletions app/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ jemalloc_pprof = { version = "0.8.1", optional = true, features = [
] }
lsp-types = "0.97.0"
indexmap = { version = "2.0.2", features = ["serde"] }
i18n.workspace = true
input_classifier.workspace = true
instant.workspace = true
ipc.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion app/src/ai/agent/comment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ impl ReviewComment {
.head_title
.as_ref()
.cloned()
.unwrap_or_else(|| "Review Comment".to_string()),
.unwrap_or_else(|| i18n::t("code_review.comments.review_comment")),
}
}
}
Expand Down
10 changes: 10 additions & 0 deletions app/src/ai/agent/conversation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4174,6 +4174,16 @@ impl std::fmt::Display for ConversationStatus {
}

impl ConversationStatus {
pub fn localized_label(&self) -> String {
match self {
ConversationStatus::InProgress => i18n::t("ai.conversation_status.in_progress"),
ConversationStatus::Success => i18n::t("ai.conversation_status.done"),
ConversationStatus::Error => i18n::t("ai.conversation_status.error"),
ConversationStatus::Cancelled => i18n::t("ai.conversation_status.cancelled"),
ConversationStatus::Blocked { .. } => i18n::t("ai.conversation_status.blocked"),
}
}

pub fn render_icon(&self, appearance: &Appearance) -> warpui::elements::Icon {
match self {
ConversationStatus::InProgress => in_progress_icon(appearance),
Expand Down
2 changes: 1 addition & 1 deletion app/src/ai/agent/todos/popup.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ impl AgentTodosPopupView {

let mut header_row = Flex::row().with_cross_axis_alignment(CrossAxisAlignment::Center);
let mut header = Text::new(
"Tasks".to_string(),
i18n::t("ai.todos.tasks"),
appearance.header_font_family(),
styles.detail_font_size + 2.,
)
Expand Down
30 changes: 29 additions & 1 deletion app/src/ai/agent_conversations_model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,7 @@ impl AgentRunDisplayStatus {
.status_message
.as_ref()
.map(|m| m.message.clone())
.unwrap_or_else(|| "Task blocked".to_string()),
.unwrap_or_else(|| i18n::t("ai.agent_conversations.task_blocked")),
},
AmbientAgentTaskState::Cancelled => Self::TaskCancelled,
AmbientAgentTaskState::Unknown => Self::TaskUnknown,
Expand Down Expand Up @@ -482,6 +482,34 @@ impl AgentRunDisplayStatus {
}
}
}

pub fn localized_label(&self) -> String {
match self {
AgentRunDisplayStatus::TaskQueued => i18n::t("ai.conversation_status.queued"),
AgentRunDisplayStatus::TaskPending => i18n::t("ai.conversation_status.pending"),
AgentRunDisplayStatus::TaskClaimed => i18n::t("ai.conversation_status.claimed"),
AgentRunDisplayStatus::TaskInProgress
| AgentRunDisplayStatus::ConversationInProgress => {
i18n::t("ai.conversation_status.in_progress")
}
AgentRunDisplayStatus::TaskSucceeded | AgentRunDisplayStatus::ConversationSucceeded => {
i18n::t("ai.conversation_status.done")
}
AgentRunDisplayStatus::TaskFailed | AgentRunDisplayStatus::TaskUnknown => {
i18n::t("ai.conversation_status.failed")
}
AgentRunDisplayStatus::TaskError | AgentRunDisplayStatus::ConversationError => {
i18n::t("ai.conversation_status.error")
}
AgentRunDisplayStatus::TaskBlocked { .. }
| AgentRunDisplayStatus::ConversationBlocked { .. } => {
i18n::t("ai.conversation_status.blocked")
}
AgentRunDisplayStatus::TaskCancelled | AgentRunDisplayStatus::ConversationCancelled => {
i18n::t("ai.conversation_status.cancelled")
}
}
}
}

impl std::fmt::Display for AgentRunDisplayStatus {
Expand Down
39 changes: 24 additions & 15 deletions app/src/ai/agent_management/agent_management_model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -157,12 +157,16 @@ impl AgentNotificationsModel {
);
}
CLIAgentSessionStatus::Success => {
let title = session_context
.display_title()
.unwrap_or_else(|| format!("{} completed", agent.display_name()));
let title = session_context.display_title().unwrap_or_else(|| {
format!(
"{}{}",
agent.display_name(),
i18n::t("agent_management.notifications.agent_completed_suffix")
)
});
let message = match agent {
CLIAgent::Codex => "Notification from Codex",
_ => "Task completed.",
CLIAgent::Codex => i18n::t("agent_management.notifications.from_codex"),
_ => i18n::t("agent_management.notifications.task_completed"),
};
let metadata = TerminalViewMetadata::lookup(*terminal_view_id, ctx);
self.add_notification(
Expand All @@ -181,15 +185,19 @@ impl AgentNotificationsModel {
);
}
CLIAgentSessionStatus::Blocked { message } => {
let title = session_context
.display_title()
.unwrap_or_else(|| format!("{} needs attention", agent.display_name()));
let title = session_context.display_title().unwrap_or_else(|| {
format!(
"{}{}",
agent.display_name(),
i18n::t("agent_management.notifications.needs_attention_suffix")
)
});
let metadata = TerminalViewMetadata::lookup(*terminal_view_id, ctx);
self.add_notification(
title,
message
.clone()
.unwrap_or_else(|| "Waiting for input.".to_owned()),
message.clone().unwrap_or_else(|| {
i18n::t("agent_management.notifications.waiting_for_input")
}),
NotificationCategory::Request,
NotificationSourceAgent::CLI {
agent: *agent,
Expand Down Expand Up @@ -319,7 +327,8 @@ impl AgentNotificationsModel {
return;
}

let title = latest_query.unwrap_or_else(|| "Agent task".to_owned());
let title =
latest_query.unwrap_or_else(|| i18n::t("agent_management.notifications.agent_task"));
let metadata = TerminalViewMetadata::lookup(terminal_view_id, ctx);
let oz_agent = NotificationSourceAgent::Oz {
is_ambient: metadata.is_ambient,
Expand All @@ -334,7 +343,7 @@ impl AgentNotificationsModel {
let artifacts = self.flush_pending_artifacts(conversation_id);
self.add_notification(
title,
"Task completed.".to_owned(),
i18n::t("agent_management.notifications.task_completed"),
NotificationCategory::Complete,
oz_agent,
origin,
Expand All @@ -348,7 +357,7 @@ impl AgentNotificationsModel {
let artifacts = self.flush_pending_artifacts(conversation_id);
self.add_notification(
title,
"Task was cancelled.".to_owned(),
i18n::t("agent_management.notifications.task_cancelled"),
NotificationCategory::Complete,
oz_agent,
origin,
Expand All @@ -375,7 +384,7 @@ impl AgentNotificationsModel {
let artifacts = self.flush_pending_artifacts(conversation_id);
self.add_notification(
title,
"Something went wrong.".to_owned(),
i18n::t("agent_management.notifications.error"),
NotificationCategory::Error,
oz_agent,
origin,
Expand Down
27 changes: 15 additions & 12 deletions app/src/ai/agent_management/agent_type_selector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ impl AgentTypeSelector {
let theme = appearance.theme();

let title = Text::new(
"Choose your agent".to_string(),
i18n::t("agent_management.agent_type.choose_agent"),
appearance.ui_font_family(),
TITLE_FONT_SIZE,
)
Expand Down Expand Up @@ -186,8 +186,8 @@ impl AgentTypeSelector {
&self,
index: usize,
icon: Icon,
title: &'static str,
description: &'static str,
title: String,
description: String,
is_suggested: bool,
mouse_state: MouseStateHandle,
action: AgentTypeSelectorAction,
Expand Down Expand Up @@ -258,11 +258,14 @@ impl AgentTypeSelector {
.with_child(title_text);

if is_suggested {
let suggested_text =
Text::new("Suggested".to_string(), font_family, OPTION_DESC_FONT_SIZE)
.with_style(Properties::default().weight(Weight::Medium))
.with_color(badge_text_color)
.finish();
let suggested_text = Text::new(
i18n::t("agent_management.agent_type.suggested"),
font_family,
OPTION_DESC_FONT_SIZE,
)
.with_style(Properties::default().weight(Weight::Medium))
.with_color(badge_text_color)
.finish();

let suggested = Container::new(suggested_text)
.with_horizontal_padding(8.)
Expand Down Expand Up @@ -334,8 +337,8 @@ impl AgentTypeSelector {
let cloud_agent_option = self.render_option(
0,
Icon::OzCloud,
"Cloud agent",
"Runs autonomously in a cloud environment you choose. Best for parallel or long-running work.",
i18n::t("agent_management.agent_type.cloud_agent"),
i18n::t("agent_management.agent_type.cloud_agent.desc"),
true,
self.cloud_agent_mouse_state.clone(),
AgentTypeSelectorAction::SelectCloudAgent,
Expand All @@ -345,8 +348,8 @@ impl AgentTypeSelector {
let local_agent_option = self.render_option(
1,
Icon::Oz,
"Local agent",
"Runs on your machine and requires supervision. Best for quick, interactive tasks.",
i18n::t("agent_management.agent_type.local_agent"),
i18n::t("agent_management.agent_type.local_agent.desc"),
false,
self.local_agent_mouse_state.clone(),
AgentTypeSelectorAction::SelectLocalAgent,
Expand Down
Loading