186 lines
9.8 KiB
Markdown
186 lines
9.8 KiB
Markdown
# TECH.md — Rename Oz to Warp Agent in settings and onboarding
|
|
|
|
Issue: https://github.com/warpdotdev/warp-external/issues/1063
|
|
Product spec: `specs/GH1063/product.md`
|
|
|
|
## Context
|
|
|
|
This is a rename of the in-app agent from "Oz" to "Warp Agent" across user-facing
|
|
strings, the internal enum variants that back those strings, and all call-sites
|
|
that referenced the old variant. "Oz" remains reserved for the cloud agent
|
|
orchestration platform, so the rename must not touch any cloud surfaces.
|
|
|
|
Relevant code (prior state):
|
|
|
|
- `app/src/settings_view/mod.rs` — `SettingsSection::Oz` variant displayed as
|
|
`"Oz"` in the sidebar. `FromStr` mapped `"Oz"` to `SettingsSection::Oz`.
|
|
Default-subpage fallback and `is_ai_subpage` / `ai_subpages()` all referenced
|
|
`SettingsSection::Oz`.
|
|
- `app/src/settings_view/ai_page.rs` — `AISubpage::Oz` variant, heading literal
|
|
`"Oz"`, and multiple description strings referencing "Oz" or "Oz agent".
|
|
- `crates/onboarding/src/slides/agent_slide.rs` — header title
|
|
`"Customize your Agent, Oz"` and checkbox label `"Disable Oz"`.
|
|
- Approximately 15 additional files contained `SettingsSection::Oz` usages
|
|
for navigation actions and settings page dispatch.
|
|
|
|
Out-of-scope references that must be preserved as "Oz" (verified by grep):
|
|
|
|
- `app/src/settings_view/mod.rs` — `SettingsSection::OzCloudAPIKeys` display
|
|
`"Oz Cloud API Keys"` and its `FromStr` round-trip.
|
|
- `app/src/terminal/view/ambient_agent/harness_selector.rs:62` — `Harness::Oz`
|
|
display name "Oz" in the cloud agent harness menu.
|
|
- `app/src/ai/blocklist/agent_view/zero_state_block.rs:388, 404` — "New Oz cloud
|
|
agent conversation" / "New Oz agent conversation". Zero-state copy is not
|
|
covered by issue #1063 and must not be touched in this PR.
|
|
- "Oz changelog" toggle labels in `ai_page.rs` (`OtherAIWidget`) are kept as
|
|
"Oz changelog" because they refer to Oz platform release notes, not the
|
|
in-app agent.
|
|
|
|
## Proposed changes
|
|
|
|
1. `app/src/settings_view/mod.rs`
|
|
- Rename `SettingsSection::Oz` variant to `SettingsSection::WarpAgent`.
|
|
- In the `Display` impl, the `WarpAgent` arm writes `"Warp Agent"`.
|
|
- In the `FromStr` impl, accept both `"Oz"` (backward-compat legacy name)
|
|
and `"Warp Agent"` as parseable forms that map to
|
|
`SettingsSection::WarpAgent`, per Behavior #8 in `product.md`.
|
|
- Update `is_ai_subpage`, `ai_subpages()`, and the two default-subpage
|
|
fallbacks (`SettingsSection::AI => SettingsSection::WarpAgent`) to use the
|
|
new variant name.
|
|
- Leave `SettingsSection::OzCloudAPIKeys` and its `"Oz Cloud API Keys"`
|
|
display untouched. Do not alter the `"Agents"` umbrella name or subpage
|
|
order.
|
|
- Update the doc-comment on `SettingsSection::AI` to reference `WarpAgent`.
|
|
|
|
2. `app/src/settings_view/ai_page.rs`
|
|
- Rename `AISubpage::Oz` variant to `AISubpage::WarpAgent`; update
|
|
`AISubpage::from_section` and the `build_page` match arm accordingly.
|
|
- In `GlobalAIWidget::render`, replace `Text::new_inline("Oz", ...)` with
|
|
`Text::new_inline("Warp Agent", ...)`. Keep every other argument, style,
|
|
alignment, and layout constant.
|
|
- In `GlobalAIWidget::search_terms`, keep existing terms (including `"oz"`
|
|
for legacy muscle memory, allowed by Behavior #7) and keep `"warp agent"`
|
|
so the new label is directly searchable.
|
|
- Replace all remaining user-visible description strings that referenced
|
|
"Oz" or "Oz agent" with "the Warp Agent" / "Warp Agent" as appropriate.
|
|
Specifically: command denylist/allowlist descriptions, base model
|
|
description, codebase context description, MCP zero-state and
|
|
allowlist/denylist descriptions, Rules description, Warp Drive context
|
|
description, API keys description, and MCP servers description.
|
|
- Preserve the two "Oz changelog" toggle labels in `OtherAIWidget` and
|
|
`SettingActionPairDescriptions` unchanged — these refer to Oz platform
|
|
release notes, not the in-app agent.
|
|
|
|
3. `crates/onboarding/src/slides/agent_slide.rs`
|
|
- `render_header`: change paragraph text from `"Customize your Agent, Oz"`
|
|
to `"Customize your Warp Agent"`. Keep font size, weight, layout, and
|
|
surrounding subtitle unchanged.
|
|
- `render_disable_oz_section`: change checkbox label from `"Disable Oz"` to
|
|
`"Disable Warp Agent"`. Keep styling, spacing, `disable_oz_mouse` state
|
|
handle, and the dispatched `AgentSlideAction::ToggleDisableOz` action
|
|
unchanged.
|
|
- Internal identifiers (`disable_oz_mouse`, `disable_oz` field on
|
|
`AgentDevelopmentSettings`, `AgentSlideAction::ToggleDisableOz`,
|
|
`render_disable_oz_section` function name) are kept as-is to avoid
|
|
migration risk for persisted settings and telemetry.
|
|
|
|
4. Navigation call-sites (approximately 15 files)
|
|
- All `SettingsSection::Oz` references in navigation actions, workspace
|
|
dispatch, settings page helpers, and editable bindings are updated to
|
|
`SettingsSection::WarpAgent`. Affected files include:
|
|
`app/src/ai/blocklist/agent_view/agent_input_footer/mod.rs`,
|
|
`app/src/ai/blocklist/block.rs`,
|
|
`app/src/ai/blocklist/block/cli.rs`,
|
|
`app/src/ai/blocklist/block/view_impl.rs`,
|
|
`app/src/ai/blocklist/block/view_impl/common.rs`,
|
|
`app/src/ai/blocklist/block/view_impl/output.rs`,
|
|
`app/src/ai/blocklist/prompt/prompt_alert.rs`,
|
|
`app/src/settings_view/billing_and_usage_page.rs`,
|
|
`app/src/terminal/input.rs`,
|
|
`app/src/terminal/input/inline_history/view.rs`,
|
|
`app/src/terminal/input/models/data_source.rs`,
|
|
`app/src/terminal/input/models/view.rs`,
|
|
`app/src/terminal/profile_model_selector.rs`,
|
|
`app/src/terminal/view.rs`,
|
|
`app/src/workspace/mod.rs`,
|
|
`app/src/workspace/view.rs`.
|
|
|
|
## Testing and validation
|
|
|
|
Runtime checks:
|
|
|
|
- `cargo fmt` and `cargo clippy --workspace --all-targets --all-features --tests
|
|
-- -D warnings` must pass (per `WARP.md` PR workflow).
|
|
- `cargo nextest run -p warp_app --no-fail-fast` or the relevant subset covering
|
|
`settings_view::mod_test` must pass. The Display test asserts
|
|
`SettingsSection::WarpAgent.to_string() == "Warp Agent"`. The `FromStr` test
|
|
covers both `"Oz"` and `"Warp Agent"` resolving to
|
|
`SettingsSection::WarpAgent`, exercising Behavior #8. All helper tests
|
|
(`is_ai_subpage`, `ai_subpages_list_contains_all_ai_subpage_variants`,
|
|
filter/visibility tests) are updated to reference `SettingsSection::WarpAgent`.
|
|
Existing tests for `OzCloudAPIKeys` are left untouched to guard against
|
|
accidentally renaming the cloud subpage.
|
|
- `cargo nextest run -p onboarding` (if a test crate exists for the onboarding
|
|
slide strings; otherwise, this rename is a pure string change and manual
|
|
verification below suffices).
|
|
|
|
Behavior-to-verification mapping (from `product.md`):
|
|
|
|
- Behavior #1, #2, #3, #9: manually open the settings UI and confirm the
|
|
sidebar entry reads "Warp Agent", the subpage renders unchanged content, the
|
|
heading above the global toggle reads "Warp Agent", and the "Oz Cloud API
|
|
Keys" entry under "Cloud platform" still reads "Oz Cloud API Keys".
|
|
- Behavior #4: toggle the global AI switch and verify it still enables and
|
|
disables AI features as before.
|
|
- Behavior #5, #6, #10: launch onboarding (or jump to the agent slide via the
|
|
existing onboarding test fixtures) and confirm the title, subtitle, disable
|
|
checkbox label, autonomy options, and step progress are all correct.
|
|
- Behavior #7: search within the settings modal using each of
|
|
`"warp agent"`, `"ai"`, `"agent"`, `"oz"` (should still reach the subpage) and
|
|
`"oz cloud"` (should reach the cloud subpage only).
|
|
- Behavior #8: confirm both `"Oz"` and `"Warp Agent"` resolve to
|
|
`SettingsSection::WarpAgent` via the `FromStr` round-trip test.
|
|
- Behavior #11: no automated accessibility test exists for these labels; manual
|
|
verification on macOS VoiceOver is sufficient since the visible text is the
|
|
accessible label.
|
|
- Behavior #12: toggle the `OpenWarpNewSettingsModes` feature flag and confirm
|
|
the disable row only appears when enabled and always reads "Disable Warp
|
|
Agent" when it does appear.
|
|
|
|
Manual verification artifacts:
|
|
|
|
- Screenshots of (a) settings sidebar with the "Agents" umbrella expanded,
|
|
(b) the AI settings page heading, and (c) the onboarding agent slide in both
|
|
feature-flag states.
|
|
- After implementation, invoke the `verify-ui-change-in-cloud` skill per the
|
|
repository rule for user-facing client changes.
|
|
|
|
## Risks and mitigations
|
|
|
|
- Risk: external deep links or persisted telemetry strings reference `"Oz"` and
|
|
break. Mitigation: `FromStr` accepts both `"Oz"` and `"Warp Agent"` mapping to
|
|
`SettingsSection::WarpAgent`, and the legacy `"oz"` search term is preserved so
|
|
`oz`-based search still lands on the subpage.
|
|
- Risk: accidentally renaming cloud Oz surfaces. Mitigation: grep for `"Oz"`
|
|
literals confirms `harness_selector.rs`, `zero_state_block.rs`, and
|
|
`OzCloudAPIKeys` are untouched. The "Oz changelog" toggle labels are
|
|
explicitly preserved.
|
|
- Risk: stale comments inside `agent_slide.rs` that still reference "Disable Oz"
|
|
mislead future readers. Mitigation: internal identifiers (`disable_oz_mouse`,
|
|
`AgentSlideAction::ToggleDisableOz`, etc.) intentionally retain the `oz` name;
|
|
comments describing them are acceptable to leave as-is per `WARP.md`.
|
|
|
|
## Follow-ups
|
|
|
|
- `SettingsSection::Oz` and `AISubpage::Oz` enum variant renames have been
|
|
completed as part of this implementation.
|
|
- Internal identifiers (`disable_oz` setting field,
|
|
`AgentSlideAction::ToggleDisableOz`, `render_disable_oz_section`,
|
|
`disable_oz_mouse`, and related settings/telemetry keys) are intentionally
|
|
kept as-is. They require more care around persisted settings, telemetry event
|
|
names, and potentially GraphQL/analytics schemas.
|
|
- The broader zero-state and blocklist strings that still say "Oz agent" (e.g.,
|
|
in `zero_state_block.rs`) should be revisited in a follow-up issue once
|
|
product confirms which of those belong to the in-app agent vs. the cloud agent
|
|
orchestration platform.
|