Compare commits

...

1 Commits

Author SHA1 Message Date
Richard Lee
7ef6f7eaad Remove workspace owner usage nudge flag 2026-04-30 17:19:59 -07:00
3 changed files with 4 additions and 81 deletions

View File

@@ -221,7 +221,8 @@ pub enum Feature {
TuiAppServer,
/// Prevent idle system sleep while a turn is actively running.
PreventIdleSleep,
/// Enable workspace-specific owner nudge copy and prompts in the TUI.
/// Removed compatibility flag retained as a no-op now that workspace owner
/// usage nudges are always enabled.
WorkspaceOwnerUsageNudge,
/// Legacy rollout flag for Responses API WebSocket transport experiments.
ResponsesWebsockets,
@@ -1067,7 +1068,7 @@ pub const FEATURES: &[FeatureSpec] = &[
FeatureSpec {
id: Feature::WorkspaceOwnerUsageNudge,
key: "workspace_owner_usage_nudge",
stage: Stage::UnderDevelopment,
stage: Stage::Removed,
default_enabled: false,
},
FeatureSpec {

View File

@@ -2985,18 +2985,7 @@ impl ChatWidget {
self.maybe_send_next_queued_input();
}
fn workspace_owner_usage_nudge_enabled(&self) -> bool {
self.config
.features
.enabled(Feature::WorkspaceOwnerUsageNudge)
}
fn on_rate_limit_error(&mut self, error_kind: RateLimitErrorKind, message: String) {
if !self.workspace_owner_usage_nudge_enabled() {
self.on_error(message);
return;
}
let rate_limit_reached_type = self.codex_rate_limit_reached_type.map(|kind| {
if matches!(error_kind, RateLimitErrorKind::UsageLimit) {
match kind {
@@ -7232,9 +7221,7 @@ impl ChatWidget {
}
fn open_workspace_owner_nudge_prompt(&mut self, credit_type: AddCreditsNudgeCreditType) {
if !self.workspace_owner_usage_nudge_enabled()
|| self.add_credits_nudge_email_in_flight.is_some()
{
if self.add_credits_nudge_email_in_flight.is_some() {
return;
}
@@ -7282,10 +7269,6 @@ impl ChatWidget {
&mut self,
credit_type: AddCreditsNudgeCreditType,
) -> bool {
if !self.workspace_owner_usage_nudge_enabled() {
return false;
}
self.add_credits_nudge_email_in_flight = Some(credit_type);
true
}
@@ -7298,9 +7281,6 @@ impl ChatWidget {
.add_credits_nudge_email_in_flight
.take()
.unwrap_or(AddCreditsNudgeCreditType::Credits);
if !self.workspace_owner_usage_nudge_enabled() {
return;
}
let message = match (credit_type, result) {
(AddCreditsNudgeCreditType::Credits, Ok(AddCreditsNudgeEmailStatus::Sent)) => {
"Workspace owner notified."

View File

@@ -511,57 +511,9 @@ async fn rate_limit_switch_prompt_popup_snapshot() {
assert_chatwidget_snapshot!("rate_limit_switch_prompt_popup", popup);
}
#[tokio::test]
async fn workspace_owner_usage_nudge_flag_disabled_keeps_generic_rate_limit_error() {
{
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
let mut limits = snapshot(/*percent*/ 100.0);
limits.rate_limit_reached_type =
Some(RateLimitReachedType::WorkspaceMemberUsageLimitReached);
chat.on_rate_limit_snapshot(Some(limits));
chat.on_rate_limit_error(
RateLimitErrorKind::UsageLimit,
"Usage limit reached.".to_string(),
);
let rendered = drain_insert_history(&mut rx)
.into_iter()
.map(|lines| lines_to_single_string(&lines))
.collect::<String>();
assert!(
rendered.contains("Usage limit reached."),
"rendered: {rendered}"
);
}
{
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
let mut limits = snapshot(/*percent*/ 100.0);
limits.rate_limit_reached_type =
Some(RateLimitReachedType::WorkspaceMemberUsageLimitReached);
chat.on_rate_limit_snapshot(Some(limits));
chat.on_rate_limit_error(
RateLimitErrorKind::UsageLimit,
"Usage limit reached.".to_string(),
);
let popup = render_bottom_popup(&chat, /*width*/ 100);
assert!(
!popup.contains("Request a limit increase from your owner"),
"popup: {popup}"
);
assert_no_owner_nudge_or_rate_limit_refresh(&mut rx);
}
}
fn enable_workspace_owner_usage_nudge(chat: &mut ChatWidget) {
chat.set_feature_enabled(Feature::WorkspaceOwnerUsageNudge, /*enabled*/ true);
}
#[tokio::test]
async fn workspace_member_credits_depleted_prompts_and_sends_credits() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
enable_workspace_owner_usage_nudge(&mut chat);
let mut limits = snapshot(/*percent*/ 100.0);
limits.rate_limit_reached_type = Some(RateLimitReachedType::WorkspaceMemberCreditsDepleted);
chat.on_rate_limit_snapshot(Some(limits));
@@ -581,7 +533,6 @@ async fn workspace_member_credits_depleted_prompts_and_sends_credits() {
#[tokio::test]
async fn workspace_member_usage_limit_prompts_and_sends_usage_limit() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
enable_workspace_owner_usage_nudge(&mut chat);
let mut limits = snapshot(/*percent*/ 100.0);
limits.rate_limit_reached_type = Some(RateLimitReachedType::WorkspaceMemberUsageLimitReached);
chat.on_rate_limit_snapshot(Some(limits));
@@ -601,7 +552,6 @@ async fn workspace_member_usage_limit_prompts_and_sends_usage_limit() {
#[tokio::test]
async fn header_rate_limit_snapshot_preserves_member_limit_type_for_error_prompt() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
enable_workspace_owner_usage_nudge(&mut chat);
let mut usage_limits = snapshot(/*percent*/ 100.0);
usage_limits.rate_limit_reached_type =
Some(RateLimitReachedType::WorkspaceMemberUsageLimitReached);
@@ -631,7 +581,6 @@ async fn header_rate_limit_snapshot_preserves_member_limit_type_for_error_prompt
#[tokio::test]
async fn usage_limit_error_remaps_stale_member_credits_state_to_usage_limit_prompt() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
enable_workspace_owner_usage_nudge(&mut chat);
let mut limits = snapshot(/*percent*/ 100.0);
limits.rate_limit_reached_type = Some(RateLimitReachedType::WorkspaceMemberCreditsDepleted);
chat.on_rate_limit_snapshot(Some(limits));
@@ -668,7 +617,6 @@ async fn workspace_owner_limit_states_do_not_prompt_for_owner_nudge() {
),
] {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
enable_workspace_owner_usage_nudge(&mut chat);
let mut limits = snapshot(/*percent*/ 100.0);
limits.rate_limit_reached_type = Some(limit_type);
chat.on_rate_limit_snapshot(Some(limits));
@@ -698,7 +646,6 @@ async fn workspace_owner_limit_states_render_state_specific_messages() {
let mut rendered_cases = Vec::new();
for (limit_type, error_kind, expected) in cases {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
enable_workspace_owner_usage_nudge(&mut chat);
let mut limits = snapshot(/*percent*/ 100.0);
limits.rate_limit_reached_type = Some(limit_type);
chat.on_rate_limit_snapshot(Some(limits));
@@ -721,7 +668,6 @@ async fn workspace_owner_limit_states_render_state_specific_messages() {
#[tokio::test]
async fn missing_rate_limit_reached_type_does_not_prompt_or_refresh() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
enable_workspace_owner_usage_nudge(&mut chat);
chat.on_rate_limit_snapshot(Some(snapshot(/*percent*/ 100.0)));
chat.on_rate_limit_error(
@@ -736,7 +682,6 @@ async fn missing_rate_limit_reached_type_does_not_prompt_or_refresh() {
#[tokio::test]
async fn workspace_owner_nudge_default_no_dismisses_without_sending() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
enable_workspace_owner_usage_nudge(&mut chat);
let mut limits = snapshot(/*percent*/ 100.0);
limits.rate_limit_reached_type = Some(RateLimitReachedType::WorkspaceMemberCreditsDepleted);
chat.on_rate_limit_snapshot(Some(limits));
@@ -753,7 +698,6 @@ async fn workspace_owner_nudge_default_no_dismisses_without_sending() {
#[tokio::test]
async fn workspace_owner_nudge_reappears_after_dismissing_no() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
enable_workspace_owner_usage_nudge(&mut chat);
let mut limits = snapshot(/*percent*/ 100.0);
limits.rate_limit_reached_type = Some(RateLimitReachedType::WorkspaceMemberUsageLimitReached);
chat.on_rate_limit_snapshot(Some(limits));
@@ -796,7 +740,6 @@ async fn workspace_owner_credits_nudge_completion_renders_feedback() {
let mut rendered_cases = Vec::new();
for (result, expected) in cases {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
enable_workspace_owner_usage_nudge(&mut chat);
chat.start_add_credits_nudge_email_request(AddCreditsNudgeCreditType::Credits);
chat.finish_add_credits_nudge_email_request(result);
let rendered = drain_insert_history(&mut rx)
@@ -833,7 +776,6 @@ async fn workspace_owner_usage_limit_nudge_completion_renders_feedback() {
let mut rendered_cases = Vec::new();
for (result, expected) in cases {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
enable_workspace_owner_usage_nudge(&mut chat);
chat.start_add_credits_nudge_email_request(AddCreditsNudgeCreditType::UsageLimit);
chat.finish_add_credits_nudge_email_request(result);
let rendered = drain_insert_history(&mut rx)