fix(tui): say agent, Fleet, Permissions, Work and Making room in English copy

Applies the ratified product vocabulary to user-facing English TUI strings
(crates/localization/locales/en.json), leaving approval and footer copy to
their own slice:

- Work, not Act (mode tips, hotbar compatibility row, settings choice).
- agent, not sub-agent/worker (notifications, /agents modal, phase strip
  "agents underway", Operate hints, settings labels); Fleet, not roster or
  team (roster header, role override note, setup labels); Coordinator, not
  operator/leader (model-change and route errors, roster row).
- Permissions, not runtime posture (setup step, report and preset title).
- "Making room in the conversation…" and the queue/busy messages, not
  auto-compacting/compaction.
- Presence "needs you", not "waiting on you" (phase strip).
- Thinking, not Reasoning (settings labels, auto-routing hotbar note).
- The settings screen is titled Settings, not Config.
- A model switch reads "Model is now {new} for this session (was {old}).
  /model save-default keeps it." instead of "Operator model changed".
- A provider's live model list is its "model list", not its roster.

Only English values change; keys and placeholders are untouched, so the
other packs keep parity. The workbar keeps its name here: renaming it to
"Tasks panel" also means renaming the /workbar command, which is a
separate decision.

Tests that pinned the old English copy are updated with it, including the
Settings title in five config/edit-theme goldens.

Checks: cargo test -p codewhale-localization 50 passed; scripts/
check-tui-locale-parity.py PASS; cargo test -p codewhale-tui --lib over
tui::hotbar, commands::, tui::views::, tui::phase_strip, tui::ui::,
settings::, tui::pet_watch, tui::ambient_life: 2551 passed, 14 failed. The
14 failures are all in files other lanes have uncommitted edits in
(footer/frame rows, the approval card, debug cache args, fleet capability
rows); none assert a string this commit changes. The two golden tests
this commit updates pass (2 passed).

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01TvKGZz4LrKfrQiAXip48JS
This commit is contained in:
CodeWhale BotandClaude Opus 5.5 committed 2026-09-22 20:29:26 -07:00
1 parent b9a3f14dc8
commit 4c6f180939
15 files changed
+110 -110

No files matched your search

+76 -76
View File
@@ -206,11 +206,11 @@
"HotbarActionModePlanDescription": "Think through a plan before acting.",
"HotbarActionModeAgentName": "Work mode",
"HotbarActionModeAgentDescription": "Do direct work in the current session.",
"HotbarActionModeYoloName": "Full Access (Act)",
"HotbarActionModeYoloDescription": "Compatibility: Act with Full Access permissions (not a separate mode).",
"HotbarActionModeYoloName": "Full Access (Work)",
"HotbarActionModeYoloDescription": "Compatibility: Work with Full Access permissions (not a separate mode).",
"HotbarActionReasoningCycleName": "Cycle reasoning",
"HotbarActionReasoningCycleDescription": "Step through reasoning levels for the active provider.",
"HotbarActionReasoningCycleAutoDisabled": "Reasoning effort is controlled by auto model routing.",
"HotbarActionReasoningCycleAutoDisabled": "Thinking level is set by auto model routing.",
"HotbarActionSidebarToggleName": "Toggle workbar",
"HotbarActionSidebarToggleDescription": "Show or hide the workbar.",
"HotbarActionFileTreeToggleName": "Toggle file tree",
@@ -219,10 +219,10 @@
"HotbarActionPaletteOpenDescription": "Open the command palette.",
"HotbarActionTrustToggleName": "Toggle trust",
"HotbarActionTrustToggleDescription": "Turn workspace trust on or off.",
"ConfigTitle": "Config",
"ConfigTitle": "Settings",
"ConfigPreviewLabel": "Preview: ",
"ConfigHintExternalCredentials": "Which credential file this provider may read, at what access, and how to revoke it.",
"ConfigModalTitle": " Config ",
"ConfigModalTitle": " Settings ",
"ConfigSearchPlaceholder": "type to filter",
"ConfigNoSettings": " No settings available.",
"ConfigNoMatchesPrefix": " No settings match ",
@@ -278,8 +278,8 @@
"ConfigLabelModel": "Active provider model",
"ConfigLabelFastModel": "Fast model (derived)",
"ConfigLabelDefaultModel": "Legacy fallback model (DeepSeek routes only)",
"ConfigLabelReasoningEffort": "Reasoning level",
"ConfigLabelFleetSpawnDepth": "sub-agent depth",
"ConfigLabelReasoningEffort": "Thinking level",
"ConfigLabelFleetSpawnDepth": "agent depth",
"ConfigLabelApprovalMode": "This session's permission",
"ConfigLabelPermissionPosture": "New sessions' permission",
"ConfigLabelApprovalPolicy": "New sessions' permission (config)",
@@ -309,7 +309,7 @@
"ImageInputRejectedResent": "{model} does not accept images — resent as text; use image_ocr to read them",
"ProviderToolCallMissing": "Provider ended with `{reason}` but supplied no tool call. Retry the turn to continue.",
"ConfigLabelShowThinking": "Model reasoning in chat",
"ConfigLabelThinkingHighlight": "Reasoning background highlight",
"ConfigLabelThinkingHighlight": "Thinking background highlight",
"ConfigLabelShowToolDetails": "Tool detail level",
"ConfigLabelInlineDiffs": "Inline file changes",
"ConfigLabelStatusIndicator": "Status indicator",
@@ -373,7 +373,7 @@
"HelpFooterMove": " Up/Down move ",
"HelpFooterJump": " PgUp/PgDn jump ",
"HelpFooterClose": " Esc close ",
"CmdAnchorDescription": "Pin a fact that survives compaction",
"CmdAnchorDescription": "Pin a fact that stays when Codewhale makes room",
"CmdAttachDescription": "Attach media (@path for text files or folders)",
"CmdCacheDescription": "Show cache hit/miss stats for recent turns",
"CmdPreviewRequestDescription": "Preview the next request (redacted) without sending it",
@@ -439,7 +439,7 @@
"HomeBackToConversation": "Back to conversation",
"HomeNavigationBusy": "Finish or stop the current work before opening home.",
"CmdHooksDescription": "Manage lifecycle hooks in Extensions",
"CmdAgentDescription": "Open a persistent sub-agent session",
"CmdAgentDescription": "Open a persistent agent session",
"CmdGoalDescription": "Work toward one objective across turns",
"CmdInitDescription": "Generate AGENTS.md for this project",
"CmdLspDescription": "Toggle LSP diagnostics",
@@ -690,7 +690,7 @@
"KbExitEmpty": "Exit when input is empty",
"KbCommandPalette": "Open the command palette",
"KbSettings": "Open settings",
"KbCancelBackgroundShellJobs": "Cancel all running background shell jobs (Activity workbar)",
"KbCancelBackgroundShellJobs": "Cancel all running background shell jobs (Activity panel in the workbar)",
"KbFuzzyFilePicker": "Open the fuzzy file picker (insert @path on Enter)",
"KbCompactInspector": "Open the context inspector",
"KbCompactContext": "Compact the conversation",
@@ -719,8 +719,8 @@
"KbPointerDrag": "Select transcript text, or drag the scrollbar",
"KbAttachPath": "Add a file or folder to context",
"KbHelpOverlay": "Open help (empty input)",
"KbCycleWorkDock": "Cycle the work dock (todo, agents, jobs, background)",
"KbCycleWorkDockBack": "Cycle the work dock backwards",
"KbCycleWorkDock": "Cycle the workbar (to-do, agents, jobs, background)",
"KbCycleWorkDockBack": "Cycle the workbar backwards",
"KbToggleHelp": "Toggle help overlay",
"KbToggleHelpSlash": "Toggle help overlay",
"HelpUsageLabel": "Usage:",
@@ -732,7 +732,7 @@
"SettingsTuiPrefsQuarantined": "tui.toml keys with no setting were kept in {path}: {keys}",
"ClearConversation": "Conversation cleared",
"ClearConversationBusy": "Nothing cleared — still busy. Try /clear again in a moment.",
"ModelChanged": "Operator model changed: {old} → {new}",
"ModelChanged": "Model is now {new} for this session (was {old}). /model save-default keeps it.",
"LinksProjectTitle": "Codewhale & community:",
"LinksDocumentation": "Documentation:",
"LinksCommunity": "Community & contribution:",
@@ -744,11 +744,11 @@
"LinksDocs": "Docs:",
"LinksKimiCodeRouteNote": "Kimi Code membership-plan route: `{route}` (plan console: `{console}`; use model k3). Codewhale never imports Kimi CLI credentials.",
"LinksTip": "Tip: Use the env var shown for your provider, or save the key with `codewhale auth set --provider <id>`.",
"SubagentsFetching": "Finding this session's sub-agents...",
"SubagentsNoCurrentSessionFleetWorkers": "No current-session fleet workers.",
"SubagentsCurrentSessionFleetWorkersTitle": "Current-session fleet workers",
"SubagentsCurrentSessionFleetWorkerRoles": "Sub-agent roles are current-session fleet worker roles.",
"SubagentsCurrentSessionFleetWorkersStatus": "Current-session fleet workers: {count} total",
"SubagentsFetching": "Finding this session's agents...",
"SubagentsNoCurrentSessionFleetWorkers": "No agents in this session.",
"SubagentsCurrentSessionFleetWorkersTitle": "Agents in this session",
"SubagentsCurrentSessionFleetWorkerRoles": "Roles shown are this session's agent roles.",
"SubagentsCurrentSessionFleetWorkersStatus": "Agents in this session: {count} total",
"SubagentsEmptyGuidance": "Set up roles with /fleet.",
"SubagentsStatusRunning": "Running",
"SubagentsStatusCompleted": "Completed",
@@ -760,13 +760,13 @@
"SubagentsRowStatusBudgetExhausted": "budget exhausted",
"SubagentsSummaryItem": "{label}: {count}",
"SubagentsGroupHeading": "{label} ({count})",
"SubagentsHeaderRoster": "roster",
"SubagentsHeaderColumns": "live worker status · role · objective · model · elapsed",
"SubagentsHeaderRoster": "fleet",
"SubagentsHeaderColumns": "live agent status · role · objective · model · elapsed",
"SubagentsActionRefresh": "refresh",
"SubagentsActionRosterSetup": "roster/setup",
"SubagentsActionRosterSetup": "fleet/setup",
"SubagentsLabelReason": " reason: ",
"SubagentsLabelRole": " role: ",
"SubagentsLabelPosture": " posture: ",
"SubagentsLabelPosture": " access: ",
"SubagentsLabelGit": " git: ",
"SubagentsLabelObjective": " objective: ",
"SubagentsLabelResult": " result: ",
@@ -794,7 +794,7 @@
"HomeHistory": "History:",
"HomeTokens": "Tokens:",
"HomeQueued": "Queued:",
"HomeSubagents": "Fleet workers this session:",
"HomeSubagents": "Agents this session:",
"HomeSkill": "Skill:",
"HomeQuickActions": "Quick Actions",
"HomeQuickLinks": "/links - Codewhale, community & provider links",
@@ -802,20 +802,20 @@
"HomeQuickConfig": "/config - Inspect and change settings",
"HomeQuickSettings": "/settings - Show persistent settings",
"HomeQuickModel": "/model - Switch or view model",
"HomeQuickSubagents": "/fleet workers - current-session sub-agents",
"HomeQuickSubagents": "/fleet workers - this session's agents",
"HomeQuickTaskList": "/task list - Show background task queue",
"HomeQuickHelp": "/help - Show help",
"HomeQuickWorkspace": "/workspace - Switch folders or worktrees",
"HomeQuickRestore": "/restore - Roll files back to a turn snapshot",
"HomeQuickTokens": "/tokens - Show session spend and context",
"HomeModeTips": "Mode Tips",
"HomeAgentModeTip": "Act — direct work in the current session with tools",
"HomeAgentModeTip": "Work — makes the changes you ask for, with tools",
"HomeAgentModeReviewTip": " /mode plan to research and present a plan first",
"HomeAgentModeYoloTip": " Shift+Tab cycles permission: Ask → Auto-Review → Full Access",
"HomeYoloModeTip": "Act + Full Access — tools run without approval prompts",
"HomeYoloModeTip": "Work + Full Access — tools run without asking first",
"HomeYoloModeCaution": " Destructive operations can run immediately; prefer Ask when unsure",
"HomePlanModeTip": "Plan — research and design first",
"HomePlanModeChecklistTip": " Present a plan and To-do progress, then switch to Act or Operate",
"HomePlanModeChecklistTip": " Present a plan and To-do progress, then switch to Work or Operate",
"HomeGoalModeTip": "Goal tracking — /goal <objective> pursues one objective",
"OnboardLanguageTitle": "Choose your language",
"OnboardLanguageBlurb": "Pick the UI language — change it anytime with `/settings set locale <tag>`.",
@@ -913,7 +913,7 @@
"SetupStepLanguageWhy": "Choose the setup language first so later setup screens and constitution copy are understandable.",
"SetupStepProviderModelTitle": "Provider and model",
"SetupStepProviderModelWhy": "The provider and model Codewhale works with; working credentials are reused.",
"SetupStepTrustSandboxTitle": "Runtime posture",
"SetupStepTrustSandboxTitle": "Permissions",
"SetupStepTrustSandboxWhy": "Trust, sandbox, approval, shell and network policy.",
"SetupStepOperateFleetTitle": "Operate and fleet",
"SetupStepOperateFleetWhy": "The built-in team already works; fleet setup only customizes it.",
@@ -963,8 +963,8 @@
"SetupCardTrustLabel": "Trust:",
"SetupCardSandboxLabel": "Sandbox:",
"SetupCardNetworkLabel": "Network:",
"SetupOperateRuntimeLabel": "Worker runtime:",
"SetupOperateRosterLabel": "fleet roster:",
"SetupOperateRuntimeLabel": "Agent runtime:",
"SetupOperateRosterLabel": "Fleet:",
"SetupOperateConcurrencyLabel": "Concurrency:",
"SetupOperateReadinessLabel": "Operate readiness:",
"SetupOperateReviewHint": "Enter records this setup snapshot.",
@@ -1006,9 +1006,9 @@
"SetupProviderModelNeedsActionHint": "Enter records provider/model as needs-action and continues; press P to fix credentials or M to inspect routes.",
"SetupProviderModelReviewed": "Provider/model readiness recorded.",
"SetupProviderModelNeedsActionSaved": "Provider/model still needs action; recorded for setup report.",
"SetupRuntimePostureBoundary": "Runtime posture is enforced config; constitution guidance never changes it silently.",
"SetupRuntimePostureBoundary": "Permissions are enforced config; constitution guidance never changes them silently.",
"SetupRuntimePostureReviewHint": "Enter records this setup snapshot. Press M for work mode or C for config.",
"SetupRuntimePostureReviewed": "Runtime posture reviewed; no config changed.",
"SetupRuntimePostureReviewed": "Permissions reviewed; no config changed.",
"SetupRuntimePresetSelectedLabel": "Selected preset:",
"SetupRuntimePresetDiffLabel": "Config diff:",
"SetupRuntimePresetAskFirstTitle": "Ask-first",
@@ -1017,7 +1017,7 @@
"SetupRuntimePresetNormalAgentDescription": "Agent by default, approval prompts, shell visible.",
"SetupRuntimePresetHighTrustTitle": "High-trust local",
"SetupRuntimePresetHighTrustDescription": "Full Access by default for trusted local work; no hidden constitution mutation.",
"SetupRuntimePresetPreviewTitle": "Runtime Posture Preset Preview",
"SetupRuntimePresetPreviewTitle": "Permissions preset preview",
"SetupRuntimePresetSafetyFloor": "Safety floor: auth/OAuth failures, blocked policy outcomes, publish-like actions, and hold-for-review gates can still stop the run.",
"SetupRuntimePresetApplyHint": "Press A to preview this exact diff; press A again after preview to apply it.",
"SetupRuntimePresetApplied": "Runtime preset applied.",
@@ -1028,7 +1028,7 @@
"SetupReportOperateLabel": "Operate/fleet:",
"SetupReportSourceLabel": "Source:",
"SetupReportAutonomyLabel": "Constitution autonomy:",
"SetupReportRuntimePostureLabel": "Runtime posture:",
"SetupReportRuntimePostureLabel": "Permissions:",
"SetupReportPersisted": "persisted setup_state.json",
"SetupReportInherited": "derived from existing config",
"SetupReportReady": "ready",
@@ -1039,8 +1039,8 @@
"SetupReportNextActionNone": "No blocking setup action recorded.",
"SetupReportNextActionConstitution": "Complete the constitution checkpoint or choose bundled/default.",
"SetupReportNextActionProvider": "Review provider/model readiness or run /setup provider; use /provider setup <name> for a specific provider.",
"SetupReportNextActionRuntime": "Review runtime posture or use /config.",
"SetupReportNextActionOperate": "Review Operate/fleet readiness before durable multi-worker runs.",
"SetupReportNextActionRuntime": "Review permissions or use /settings.",
"SetupReportNextActionOperate": "Review Operate and Fleet readiness before long multi-agent runs.",
"SetupReportNextActionRequired": "Review the remaining required setup steps.",
"SetupReportRecorded": "Setup report recorded.",
"CtxMenuTitle": " Right click ",
@@ -1084,8 +1084,8 @@
"AppModeAgentHint": "Direct work in this session — edits and shell ask for approval",
"AppModeAutoHint": "Shell enabled with automatic risk review",
"AppModePlanHint": "Read-only research first — present a plan before acting",
"AppModeYoloHint": "Compatibility only — Act + Full Access, not a visible mode",
"AppModeOperateHint": "Turns your prompt into a goal: parallel workers, verified work",
"AppModeYoloHint": "Compatibility only — Work + Full Access, not a visible mode",
"AppModeOperateHint": "Turns your prompt into a goal: parallel agents, verified work",
"VimModeNormal": "-- NORMAL --",
"VimModeInsert": "-- INSERT --",
"VimModeVisual": "-- VISUAL --",
@@ -1139,12 +1139,12 @@
"ElevationOptionWriteDesc": "Retry with a wider writable scope",
"ElevationOptionFullAccessDesc": "Retry without sandbox limits; grants unrestricted filesystem and network access",
"ElevationOptionAbortDesc": "Cancel this run",
"ContextAutoCompacting": "Auto-compacting context…",
"ContextAutoCompacting": "Making room in the conversation…",
"ContextManualCompacting": "Compacting context…",
"ContextCompactionQueued": "Compaction queued — runs after this turn.",
"ContextCompactionAlreadyRunning": "Compaction is already running.",
"ContextCompactionQueueFull": "Compaction has to wait — the engine is busy. Try again after this turn.",
"ContextCompactionQueueClosed": "Compaction is unavailable — the engine stopped.",
"ContextCompactionQueued": "Making room is queued — it runs after this turn.",
"ContextCompactionAlreadyRunning": "Already making room.",
"ContextCompactionQueueFull": "Making room has to wait — the engine is busy. Try again after this turn.",
"ContextCompactionQueueClosed": "Can't make room — the engine stopped.",
"ContextCompactionRouteInvalid": "Can't compact — the active provider route is invalid: {error}",
"CtxInspTitle": "Context inspector",
"CtxInspSessionContext": "Session Context",
@@ -1223,11 +1223,11 @@
"VoiceProcessing": "🎙 Transcribing...",
"VoiceTranscribed": "🎙 Transcribed",
"NotificationTurnComplete": "Turn complete",
"NotificationSubagentComplete": "Sub-agent complete",
"NotificationSubagentFailed": "Sub-agent failed",
"NotificationSubagentInterrupted": "Sub-agent interrupted",
"NotificationSubagentCancelled": "Sub-agent cancelled",
"NotificationSubagentBudgetExhausted": "Sub-agent budget exhausted",
"NotificationSubagentComplete": "Agent complete",
"NotificationSubagentFailed": "Agent failed",
"NotificationSubagentInterrupted": "Agent interrupted",
"NotificationSubagentCancelled": "Agent cancelled",
"NotificationSubagentBudgetExhausted": "Agent budget exhausted",
"FooterWorkedChip": "worked {duration}",
"FleetDraftTitle": "team profile — draft by {model_label} (g saves)",
"FleetDraftHeader": "# .codewhale/agents/{name}\n# Drafted by {model_label}, validated and bounded by Codewhale.\n# Permissions stay at the team floor: no shell, no trust, approval required.\n# Nothing is saved until you press g in the wizard.\n\n",
@@ -1292,7 +1292,7 @@
"SetupGuidedStyleCoding": "Keep code changes scoped to requested behavior and existing repo patterns.",
"SetupGuidedStyleResearch": "Separate live evidence from inference and cite sources for unstable facts.",
"SetupGuidedStyleOperations": "Prefer reversible operational steps with dry-runs, status checks, and rollback notes.",
"SetupGuidedStyleMixed": "Adapt between coding, research, writing, and operations without widening the safety posture.",
"SetupGuidedStyleMixed": "Adapt between coding, research, writing, and operations without widening permissions.",
"SetupGuidedEvidenceAssumptions": "state assumptions",
"SetupGuidedEvidenceTestsAndReceipts": "tests & receipts",
"SetupGuidedEvidenceReleaseReceipts": "release receipts",
@@ -1317,7 +1317,7 @@
"LaunchResumeConfirmBody": "This replaces the current context with that session's history.",
"LaunchResumeConfirmResume": "resume",
"LaunchResumeConfirmCancel": "cancel",
"LaunchWorkDescription": "Work in this folder; changes follow your approval policy.",
"LaunchWorkDescription": "Work in this folder; changes follow your permissions.",
"LaunchChatDescription": "Just talk and plan — nothing changes on disk.",
"LaunchWorkspaceGitReady": "Workspace · {name} · Git workspace",
"LaunchWorkspaceFolderReady": "Workspace · {name} · local folder",
@@ -1354,9 +1354,9 @@
"PhaseReasoning": "reasoning",
"PhaseReading": "reading",
"PhaseUsingTool": "using tool",
"PhaseSubagents": "sub-agents underway",
"PhaseSubagents": "agents underway",
"PhaseVerifying": "verifying",
"PhaseWaitingOnYou": "waiting on you",
"PhaseWaitingOnYou": "needs you",
"PhaseDone": "Done",
"PhaseFailed": "failed",
"PhaseFinishing": "finishing",
@@ -1443,18 +1443,18 @@
"CtxInspRowSystemPrompt": "system prompt",
"CtxInspRowMessages": "messages",
"CtxInspRowFree": "free",
"CtxInspFreeTokensDetail": "{free} free tokens left before the window fills. Auto-compact at {threshold}%.",
"CtxInspFreeTokensDetail": "{free} free tokens left before the window fills. Makes room at {threshold}%.",
"CtxInspDrillTitle": "context · {row}",
"CtxInspSurfaceTitle": "context",
"CtxInspActionSelect": "select",
"CtxInspActionDrillDown": "drill down",
"CtxInspActionClose": "close",
"CtxInspUsedTokens": "~{used}/{max} tokens",
"CtxInspAutoCompactAt": "auto-compact at {threshold}%",
"CtxInspAutoCompactAt": "makes room at {threshold}%",
"CtxInspRowTokens": "{tokens} tokens · {percent}%",
"CtxInspRowCompaction": "compaction",
"CtxInspRowCompaction": "making room",
"CtxInspRowAnchors": "anchors",
"CtxInspCompactionNever": "no compaction this session",
"CtxInspCompactionNever": "no room made this session",
"CtxInspCompactionDetail": "{path}. {before} → {after} messages. Last round: {round} messages, {tools} tool results{assistant}.",
"CtxInspCompactionRestored": "checkpoint present. Last round: {round} messages, {tools} tool results{assistant}.",
"CtxInspCompactionPathSummary": "summary pass",
@@ -1562,7 +1562,7 @@
"FleetRosterWorkers": "workers",
"FleetRosterMembersCount": "{count} members",
"FleetRosterOperatorFirst": "Coordinator leads · your session model runs this fleet",
"FleetRosterOperatorRow": "Coordinator · leader",
"FleetRosterOperatorRow": "Coordinator · you",
"FleetRosterShadowBadgeProjectOverride": "saved in this project",
"FleetRosterShadowBadgePersonalIgnored": "saved copy ignored",
"FleetRosterShadowBadgePersonalOverride": "saved for all projects",
@@ -1581,12 +1581,12 @@
"FleetModelRemoved": "Removed {route} from the team `{fleet}`",
"FleetModelRemovedRoles": "Removed {route} ({roles}) from the team `{fleet}`",
"FleetModelUnchanged": "{route} stays on the team `{fleet}`: {reason}",
"FleetModelReasonOperatorRoute": "this is your current model (the team's operator route); switch models or use /fleet save to change it",
"FleetModelReasonOperatorRoute": "this is your current model (the Fleet's coordinator route); switch models or use /fleet save to change it",
"FleetModelReasonAlreadyPresent": "already on the team",
"FleetModelErrorNeedsRoute": "a team model needs both a provider id and a model id",
"FleetModelErrorNeedsRole": "a team member is a role; name one (for example `/fleet add {route} scout`)",
"FleetModelErrorNoSelection": "no team is selected; your team is the session model only",
"FleetModelErrorOperatorRoute": "{route} is the operator route of the team `{fleet}`; change it with /fleet save, not remove",
"FleetModelErrorOperatorRoute": "{route} is the coordinator route of the Fleet `{fleet}`; change it with /fleet save, not remove",
"FleetModelErrorNotInFleet": "{route} is not on the team `{fleet}`",
"FleetModelsEmpty": "Your team is the session model only. Add one: /fleet add <provider> <model> [role…] (or ⇧F on a row in /model).",
"FleetModelsHeader": "Your team `{fleet}` ({count} models)",
@@ -1618,7 +1618,7 @@
"FleetDestWillReplace": "Will replace the existing file {path}",
"FleetDestOverridesProject": "This project already has a '{id}' profile, which takes precedence here; this Personal profile applies in other projects.",
"FleetDestOverridesPersonal": "Takes precedence over your Personal '{id}' profile inside this project.",
"FleetDestOverridesBuiltIn": "Replaces the {origin} '{id}' role in the roster.",
"FleetDestOverridesBuiltIn": "Replaces the {origin} '{id}' role in the Fleet.",
"FleetSavesToChip": "Saves to: {scope} · {path}",
"FleetSavesToUndecided": "Saves to: choose in step 3 — This project or Personal",
"FleetActionSaveProject": "Save to this project",
@@ -1855,7 +1855,7 @@
"StatusApprovalNever": "never",
"StatusMcpConfigured": "{count} configured",
"StatusFleetDrifted": "{fleet} · {count} saved routes not in the current catalog: {ids}",
"StatusModelNotInRoster": "Model {model} is not in {provider}'s current roster — kept as pinned; it may still answer",
"StatusModelNotInRoster": "Model {model} is not in {provider}'s current model list — kept as pinned; it may still answer",
"StatusContextUsage": "{percent}% used ({used} / {max} tokens)",
"StatusContextSourceConfigured": "configured",
"StatusContextSourceConfiguredModel": "configured (per-model)",
@@ -1949,7 +1949,7 @@
"OperateBoardBurnNoCap": "burn No cap",
"OperateBoardDirectionEmpty": "direction (empty — idle-blocked)",
"OperateBoardDirectionLine": "direction {line}",
"OperateBoardPlanMissing": "leadPlan (none — workers not admitted)",
"OperateBoardPlanMissing": "leadPlan (none — agents not admitted)",
"OperateBoardPlanHeader": "leadPlan id owner start dur est$ depends title",
"OperateBoardGantt": "gantt time →",
"ConfigCategoryAppearance": "Appearance",
@@ -2010,7 +2010,7 @@
"ConfigChoiceUseTuiDefault": "Use TUI permission default",
"ConfigChoiceFullAccess": "Full Access",
"ConfigChoiceNever": "Never",
"ConfigChoiceModeAct": "Act",
"ConfigChoiceModeAct": "Work",
"ConfigChoiceModePlan": "Plan (read only)",
"ConfigChoiceModeOperate": "Operate",
"ConfigChoicePlacementTop": "Top",
@@ -2031,14 +2031,14 @@
"ConfigChoiceDetailNever": "Block every tool that requires approval.",
"ConfigChoiceDetailModeAgent": "Start ready to work with tools.",
"ConfigChoiceDetailModePlan": "Start in a read-only planning workspace.",
"ConfigChoiceDetailModeOperate": "Operate turns your prompt into a goal and works it in parallel: background workers for separable streams, verified before it stops.",
"ConfigChoiceDetailPlacementTop": "Show Tasks, To-do, and Workers above the transcript.",
"ConfigChoiceDetailPlacementBottom": "Show Tasks, To-do, and Workers under the composer.",
"ConfigChoiceDetailPlacementLeft": "Show Tasks, To-do, and Workers in a left workbar when the terminal is wide enough.",
"ConfigChoiceDetailPlacementRight": "Show Tasks, To-do, and Workers in a right workbar when the terminal is wide enough.",
"ConfigChoiceDetailModeOperate": "Operate turns your prompt into a goal and works it in parallel: background agents for separable streams, verified before it stops.",
"ConfigChoiceDetailPlacementTop": "Show Tasks, To-do, and Agents above the transcript.",
"ConfigChoiceDetailPlacementBottom": "Show Tasks, To-do, and Agents under the composer.",
"ConfigChoiceDetailPlacementLeft": "Show Tasks, To-do, and Agents in a left workbar when the terminal is wide enough.",
"ConfigChoiceDetailPlacementRight": "Show Tasks, To-do, and Agents in a right workbar when the terminal is wide enough.",
"ConfigChoiceDetailPlacementOff": "Hide the workbar entirely.",
"ConfigChoiceDetailRailTasks": "Workbar shows the live Tasks / To-do / Workers list.",
"ConfigChoiceDetailRailAgents": "Workbar shows sub-agents and fan-out state.",
"ConfigChoiceDetailRailTasks": "Workbar shows the live Tasks / To-do / Agents list.",
"ConfigChoiceDetailRailAgents": "Workbar shows agents and fan-out state.",
"ConfigChoiceDetailRailContext": "Workbar shows workspace, token, and cost context.",
"ConfigChoiceDetailLowMotionOn": "Calms live motion; model output is unchanged.",
"ConfigChoiceDetailLowMotionOff": "Lets appearance settings control motion.",
@@ -2056,7 +2056,7 @@
"ConfigHintApprovalPolicy": "choosing Full Access releases the raw config override",
"ConfigHintManagedApprovalPolicy": "a project, profile, environment, managed config, or organization requirement controls this value",
"ConfigHintManagedAllowShell": "a project, profile, environment, or managed config controls shell access",
"ConfigHintAllowShell": "on exposes shell tools in Agent mode; permission rules still apply",
"ConfigHintAllowShell": "on exposes shell tools in Work mode; permission rules still apply",
"ConfigHintComposerMultilineMode": "off: Enter sends, Shift+Enter adds a line; on: Enter adds a line, Shift+Enter sends",
"ConfigHintBooleanValues": "on/off, true/false, yes/no, 1/0",
"ConfigHintDensity": "compact | comfortable | spacious",
@@ -2091,7 +2091,7 @@
"ConfigHintMcpDiagnose": "diagnose MCP · /mcp validate",
"ConfigHintPluginsOpen": "open plugins · trust, enable, or diagnose",
"ConfigHintMcpConfigPath": "path to mcp.json",
"ConfigHintFleetMaxSpawnDepth": "0 blocks sub-agents; 3 default (same axis as sub-agents); capped at 8",
"ConfigHintFleetMaxSpawnDepth": "0 blocks nested agents; 3 default; capped at 8",
"ConfigHintFeatureSubagents": "read-only flag; use /fleet setup",
"ConfigHintFeatureWebSearch": "read-only flag for web search tools",
"ConfigHintFeatureApplyPatch": "read-only flag for patch editing tools",
@@ -2106,7 +2106,7 @@
"LaunchNoticeClaude": "Claude Code detected. Run /import-claude to review what can come over: MCP servers, safe settings, and permissions. Nothing is applied without your approval.",
"LaunchNewSession": "New session",
"LaunchRecentHeading": "Recent",
"LaunchHelpLine": "/help for commands · {dock} for the work bar",
"LaunchHelpLine": "/help for commands · {dock} for the workbar",
"LaunchSeeAllSessions": "See all sessions…",
"LaunchNoRecentSessions": "No recent sessions yet — type below to start.",
"LaunchResumeFailed": "Resume failed: {error}",
@@ -2197,9 +2197,9 @@
"ConfigLabelNotificationMethod": "Delivery method",
"ConfigLabelNotificationThreshold": "Minimum turn duration (seconds)",
"ConfigLabelNotificationSummary": "Include summary",
"ConfigLabelNotificationSubagents": "Subagent notifications",
"ConfigLabelNotificationSubagents": "Agent notifications",
"ConfigLabelNotificationTurnComplete": "Turn completed",
"ConfigLabelNotificationSubagentTerminal": "Subagent finished",
"ConfigLabelNotificationSubagentTerminal": "Agent finished",
"ConfigLabelNotificationApprovalNeeded": "Approval needed",
"ConfigLabelNotificationInputNeeded": "Answer needed",
"ConfigLabelNotificationElevationNeeded": "Elevated access needed",
+1 -1
View File
@@ -5544,7 +5544,7 @@ mod tests {
let expected = [
(Locale::Ca, "Treballadors de flota de la sessió actual:"),
(Locale::De, "Flotten-Worker der aktuellen Sitzung:"),
(Locale::En, "Fleet workers this session:"),
(Locale::En, "Agents this session:"),
(Locale::Es419, "Workers de flota de la sesión actual:"),
(Locale::Fr, "Workers de la flotte de la session actuelle :"),
(Locale::Hi, "वर्तमान सत्र के बेड़ा वर्कर:"),
@@ -694,7 +694,7 @@ mod tests {
let mut app = create_test_app(workspace);
app.auto_model = false;
app.model = "deepseek-v4-flash".to_string();
let notice = "is not in deepseek's current roster";
let notice = "is not in deepseek's current model list";
assert!(
!status(&mut app).message.unwrap().contains(notice),
"no fresh roster, no claim"
+1 -1
View File
@@ -1634,7 +1634,7 @@ mod tests {
assert_eq!(app.view_stack.top_kind(), Some(ModalKind::SubAgents));
assert_eq!(
app.status_message,
Some("Finding this session's sub-agents...".to_string())
Some("Finding this session's agents...".to_string())
);
}
@@ -1,5 +1,5 @@
Config ────────────────────────────────────────────────────────────────────────────────────────────────────────────
Settings ──────────────────────────────────────────────────────────────────────────────────────────────────────────
Appearance Models & providers Work Tools & MCP Trust Motion Advanced
Search: type to filter (17/71)
@@ -11,7 +11,7 @@
│ Model reasoning in chat Off [ ] │startup terminal
│ Thinking Default Expanded Off [ ] │source settings.toml
│ Thinking Preview Lines 2 ✎ │scope SAVED
│ Reasoning background highlight On [x] │apply applies on save
│ Thinking background highlight On [x] │apply applies on save
│ Help Expand Groups Off [ ] │kind choice
│ Contextual tips On [x] │available not observed this session
│ Pin Last Prompt On [x] │
@@ -1,4 +1,4 @@
Config ──────────────────────────────
Settings ────────────────────────────
‹ Appearance 1/7 ›
Search: type to filter (17/71)
Display █
@@ -1,5 +1,5 @@
Config ────────────────────────────────────────────────────────────────────
Settings ──────────────────────────────────────────────────────────────────
Appearance Models & providers Work Tools & MCP Trust Motion ›
Search: type to filter (17/71)
@@ -11,7 +11,7 @@
Model reasoning in chat Off [ ] SAVED █
Thinking Default Expanded Off [ ] SAVED █
Thinking Preview Lines 2 ✎ SAVED █
Reasoning background highlight On [x] SAVED │
Thinking background highlight On [x] SAVED │
Help Expand Groups Off [ ] SAVED │
Contextual tips On [x] SAVED │
Pin Last Prompt On [x] SAVED │
@@ -1,5 +1,5 @@
Config ────────────────────────────────────────────────────────────────────────────────────────────────────────────
Settings ──────────────────────────────────────────────────────────────────────────────────────────────────────────
Edit Theme [theme]
@@ -1,5 +1,5 @@
Config ────────────────────────────────────────────────────────────────────
Settings ──────────────────────────────────────────────────────────────────
Edit Theme [theme]
@@ -589,7 +589,7 @@ fn clock_distinguishes_working_from_waiting_on_something() {
let subagents = tideline_footer_from_app(&mut app, 160)
.turn_clock
.expect("sub-agent clock");
assert_eq!(subagents.0, "sub-agents underway 1m 15s");
assert_eq!(subagents.0, "agents underway 1m 15s");
app.agent_progress.clear();
// Waiting on the user parks the clock in the waiting ink.
@@ -602,7 +602,7 @@ fn clock_distinguishes_working_from_waiting_on_something() {
let waiting = tideline_footer_from_app(&mut app, 160)
.turn_clock
.expect("waiting clock");
assert_eq!(waiting.0, "waiting on you 1m 15s");
assert_eq!(waiting.0, "needs you 1m 15s");
assert_eq!(waiting.1, ChromeInk::Waiting);
assert_ne!(waiting.1, working.1, "waiting must not read as working");
}
+1 -1
View File
@@ -7523,7 +7523,7 @@ mod fleet_workers_status_tests {
fn current_session_fleet_worker_status_keeps_the_english_session_boundary() {
assert_eq!(
current_session_fleet_workers_status(Locale::En, 3),
"Current-session fleet workers: 3 total"
"Agents in this session: 3 total"
);
}
}
@@ -226,7 +226,7 @@ fn composed_frame_paints_each_fact_in_exactly_one_row() {
// still just over a 120-column budget, so the hint wins here and
// the turn half needs ~160. The shed-order contract itself lives
// in tideline_tests.
let turn_needle = "sub-agents underway 1m 15s";
let turn_needle = "agents underway 1m 15s";
if width >= 160 {
assert!(rows[posture].contains(turn_needle), "{}", rows[posture]);
assert_eq!(
+9 -9
View File
@@ -11824,7 +11824,7 @@ fn manual_compaction_queues_once_after_active_turn_without_blocking() {
);
assert_eq!(
app.status_message.as_deref(),
Some("Compaction queued — runs after this turn.")
Some("Making room is queued — it runs after this turn.")
);
match engine.rx_op.try_recv().expect("one queued compact op") {
crate::core::ops::Op::CompactContext { compaction, .. } => {
@@ -11843,7 +11843,7 @@ fn manual_compaction_queues_once_after_active_turn_without_blocking() {
);
assert_eq!(
app.status_message.as_deref(),
Some("Compaction is already running.")
Some("Already making room.")
);
}
@@ -11870,14 +11870,14 @@ fn full_engine_mailbox_defers_manual_compaction_and_flushes_once_drained() {
assert!(app.deferred_manual_compaction.is_some());
assert_eq!(
app.status_message.as_deref(),
Some("Compaction queued — runs after this turn.")
Some("Making room is queued — it runs after this turn.")
);
// A repeat during deferral is the single queued pass, not a second one.
try_queue_manual_compaction(&mut app, &config, &engine.handle, None);
assert_eq!(
app.status_message.as_deref(),
Some("Compaction is already running.")
Some("Already making room.")
);
// The mailbox is still full: the flush waits without dropping the request.
@@ -13134,7 +13134,7 @@ fn subagent_event_handlers_preserve_dispatch_failures_as_separate_toasts() {
);
assert!(app.status_toasts.iter().any(|toast| {
toast.level == StatusToastLevel::Success
&& toast.text == "Sub-agent complete · Agent 1 · finished cleanly"
&& toast.text == "Agent complete · Agent 1 · finished cleanly"
}));
assert!(app.status_toasts.back().is_some_and(|toast| {
toast
@@ -26352,7 +26352,7 @@ fn subagent_completion_notification_uses_summary_line_not_sentinel() {
Duration::from_secs(42),
);
assert_eq!(payload.headline(), "Sub-agent complete");
assert_eq!(payload.headline(), "Agent complete");
assert_eq!(payload.detail(), Some("agent_live"));
assert_eq!(payload.preview(), Some("Finished the docs audit."));
assert!(!payload.render_inline().contains("codewhale:subagent.done"));
@@ -26369,7 +26369,7 @@ fn subagent_completion_notification_can_include_elapsed_summary() {
Duration::from_secs(65),
);
assert_eq!(payload.headline(), "Sub-agent complete (1m 05s)");
assert_eq!(payload.headline(), "Agent complete (1m 05s)");
assert_eq!(payload.detail(), Some("agent_live"));
assert_eq!(payload.preview(), None);
}
@@ -26385,10 +26385,10 @@ fn subagent_cancelled_notification_never_claims_completion() {
Duration::from_secs(2),
);
assert_eq!(payload.headline(), "Sub-agent cancelled");
assert_eq!(payload.headline(), "Agent cancelled");
assert_eq!(payload.detail(), Some("agent_stopped"));
assert_eq!(payload.preview(), Some("Cancelled"));
assert!(!payload.render_inline().contains("Sub-agent complete"));
assert!(!payload.render_inline().contains("Agent complete"));
}
#[test]
+2 -2
View File
@@ -4374,7 +4374,7 @@ approval_required = true
assert_eq!(view.selected_role(), "reviewer");
assert_eq!(
view.roster_override_note().as_deref(),
Some("Replaces the built-in 'reviewer' role in the roster.")
Some("Replaces the built-in 'reviewer' role in the Fleet.")
);
let role_step = render_through_stack(
@@ -4420,7 +4420,7 @@ approval_required = true
assert_eq!(custom_view.selected_role(), "custom");
assert_eq!(
custom_view.roster_override_note().as_deref(),
Some("Replaces the built-in 'custom' role in the roster.")
Some("Replaces the built-in 'custom' role in the Fleet.")
);
}
+9 -9
View File
@@ -6644,7 +6644,7 @@ mod tests {
empty.render(area, &mut empty_buf);
let empty_text = buffer_text(&empty_buf, area);
assert!(
empty_text.contains("No current-session fleet workers."),
empty_text.contains("No agents in this session."),
"{empty_text}"
);
assert!(
@@ -6660,11 +6660,11 @@ mod tests {
english.render(area, &mut english_buf);
let english_text = buffer_text(&english_buf, area);
assert!(
english_text.contains("Current-session fleet workers"),
english_text.contains("Agents in this session"),
"{english_text}"
);
assert!(
english_text.contains("Sub-agent roles are current-session fleet worker roles."),
english_text.contains("Roles shown are this session's agent roles."),
"{english_text}"
);
@@ -6699,7 +6699,7 @@ mod tests {
"{zh_hans_text}"
);
assert!(
!zh_hans_text.contains("Current-session fleet workers"),
!zh_hans_text.contains("Agents in this session"),
"{zh_hans_text}"
);
}
@@ -6738,7 +6738,7 @@ mod tests {
english.render(area, &mut english_buf);
let english_text = buffer_text(&english_buf, area);
for expected in [
"Current-session fleet workers",
"Agents in this session",
"Running: 1",
"Completed: 0",
"Interrupted: 1",
@@ -6749,17 +6749,17 @@ mod tests {
"running",
"reason: manual review",
"role: release",
"posture: network=on · shell=read-only · write=on",
"access: network=on · shell=read-only · write=on",
"git: branch feature/localize @ fleet-workers",
"objective: verify localized row",
"result: all checks passed",
"live worker status · role · objective · model · elapsed",
"live agent status · role · objective · model · elapsed",
"close",
"select",
"focus",
"stop",
"refresh",
"roster/setup",
"fleet/setup",
] {
assert!(
english_text.contains(expected),
@@ -8031,7 +8031,7 @@ api_key_env = "ACME_API_KEY"
.expect("sub-agent depth row");
assert_eq!(depth.scope, ConfigScope::Saved);
assert!(!depth.editable);
assert_eq!(config_label_for_key(&depth.key), "sub-agent depth");
assert_eq!(config_label_for_key(&depth.key), "agent depth");
// Workflow keeps its own name and its `/workflow` wording.
let workflow = view