返回 CodeWhale
lib.rs
根目录 / crates / localization / src / lib.rs
1 //! Lightweight localization registry for high-visibility TUI strings.
2 //!
3 //! This intentionally covers UI chrome only. It does not change model prompts,
4 //! model output language, provider behavior, or media payload semantics.
5 use rust_i18n::i18n;
6 include!(concat!(env!("OUT_DIR"), "/i18n_init.rs"));
7 mod localization_backend;
8
9 use std::borrow::Cow;
10 use unicode_segmentation::UnicodeSegmentation;
11 use unicode_width::{UnicodeWidthChar, UnicodeWidthStr};
12
13 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
14 pub enum Locale {
15 En,
16 Ja,
17 ZhHans,
18 ZhHant,
19 PtBr,
20 Es419,
21 Vi,
22 Ko,
23 Ca,
24 De,
25 Fr,
26 Id,
27 Hi,
28 Ru,
29 Uk,
30 }
31
32 impl Locale {
33 pub fn tag(self) -> &'static str {
34 match self {
35 Self::En => "en",
36 Self::Ja => "ja",
37 Self::ZhHans => "zh-Hans",
38 Self::ZhHant => "zh-Hant",
39 Self::PtBr => "pt-BR",
40 Self::Es419 => "es-419",
41 Self::Vi => "vi",
42 Self::Ko => "ko",
43 Self::Ca => "ca",
44 Self::De => "de",
45 Self::Fr => "fr",
46 Self::Id => "id",
47 Self::Hi => "hi",
48 Self::Ru => "ru",
49 Self::Uk => "uk",
50 }
51 }
52
53 pub fn translation_target_name(self) -> &'static str {
54 match self {
55 Self::En => "English",
56 Self::Ja => "Japanese (日本語)",
57 Self::ZhHans => "Simplified Chinese (简体中文)",
58 Self::ZhHant => "Traditional Chinese (繁體中文)",
59 Self::PtBr => "Brazilian Portuguese (Português do Brasil)",
60 Self::Es419 => "Latin American Spanish (Español latinoamericano)",
61 Self::Vi => "Vietnamese (Tiếng Việt)",
62 Self::Ko => "Korean (한국어)",
63 Self::Ca => "Catalan (Català)",
64 Self::De => "German (Deutsch)",
65 Self::Fr => "French (Français)",
66 Self::Id => "Indonesian (Bahasa Indonesia)",
67 Self::Hi => "Hindi (हिन्दी)",
68 Self::Ru => "Russian (Русский)",
69 Self::Uk => "Ukrainian (Українська)",
70 }
71 }
72
73 /// Every locale the TUI exposes in pickers and runtime resolution.
74 pub fn shipped() -> &'static [Self] {
75 &[
76 Self::En,
77 Self::Ja,
78 Self::ZhHans,
79 Self::ZhHant,
80 Self::PtBr,
81 Self::Es419,
82 Self::Vi,
83 Self::Ko,
84 Self::Ca,
85 Self::De,
86 Self::Fr,
87 Self::Id,
88 Self::Hi,
89 Self::Ru,
90 Self::Uk,
91 ]
92 }
93
94 /// Complete UI packs held to `en.json` parity.
95 pub fn shipped_complete() -> &'static [Self] {
96 &[
97 Self::En,
98 Self::Ja,
99 Self::ZhHans,
100 Self::ZhHant,
101 Self::PtBr,
102 Self::Es419,
103 Self::Vi,
104 Self::Ko,
105 Self::Ca,
106 Self::De,
107 Self::Fr,
108 Self::Id,
109 Self::Hi,
110 Self::Ru,
111 Self::Uk,
112 ]
113 }
114
115 #[must_use]
116 pub fn is_partial_pack(self) -> bool {
117 false
118 }
119 }
120
121 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
122 pub enum MessageId {
123 SessionArchiveExported,
124 SessionArchiveSizes,
125 SessionArchiveNoArtifacts,
126 SessionArchiveRestoreHint,
127 CostReasonNotMoney,
128 CostReasonBillingUnknown,
129 CostReasonEndpointUnknown,
130 CostReasonRateMissing,
131 CostReasonLiveUnverified,
132 CostReasonRetiredAlias,
133 CostReasonTierMissing,
134 CostReasonRoutingDependent,
135 CostReasonCoverageMissing,
136 CostReasonTokenRateMissing,
137 CostReasonInvalidRate,
138 CostReasonCurrencyMissing,
139 CostReasonUsageConflict,
140 CostChipUnknown,
141 CostChipSubtotal,
142 CostChipSavedSubtotal,
143 CostChipLocal,
144 CostChipAllowance,
145 CostChipAllowancePercent,
146 McpLoginInProgress,
147 McpLoginStarting,
148 McpLoginBrowser,
149 McpLoginStored,
150 McpLoginFailed,
151 McpReloadAlreadyRunning,
152 McpLoginCancelled,
153 McpLoginHandshakeTimeout,
154 McpLoginServerNotFound,
155 McpDiagnosisUnobserved,
156 McpDiagnosisSummary,
157 McpDiagnosisLastError,
158 McpDiagnosisNext,
159 McpStateDisabled,
160 McpStateAuthorizationRequired,
161 McpStateConnecting,
162 McpStateFailed,
163 McpStateDisconnected,
164 ComposerPlaceholder,
165 ComposerDispatchFailedRestored,
166 DispatchFailedQueued,
167 DispatchFailedInitial,
168 HistorySearchPlaceholder,
169 HistorySearchTitle,
170 HistoryHintMove,
171 HistoryHintAccept,
172 HistoryHintRestore,
173 HistoryNoMatches,
174 TranscriptReasoningExpand,
175 ScreenModeFullscreenNotice,
176 ScreenModeInlineNotice,
177 ScreenModeMouseCaptureOn,
178 ScreenModeMouseCaptureOff,
179 ScreenModeUnchanged,
180 ImageInputRejectedResent,
181 ProviderToolCallMissing,
182 // First-run anonymous usage disclosure.
183 TelemetryNoticeDefaultOn,
184 TelemetryNoticeHeadline,
185 TelemetryNoticeBody,
186 TelemetryNoticeCompactBody,
187 TelemetryNoticeChoiceKeep,
188 TelemetryNoticeChoiceDisable,
189 TelemetryNoticeActionChoose,
190 TelemetryNoticeActionConfirm,
191 TelemetryNoticeActionExit,
192 TelemetryNoticeReceiptEnabled,
193 TelemetryNoticeReceiptDisabled,
194 TelemetryNoticeReceiptEnabledUnsaved,
195 TelemetryNoticeReceiptDisabledUnsaved,
196 TelemetryPreferenceEnabledNextLaunch,
197 TelemetryPreferenceDisabled,
198 TelemetryPreferenceDisabledWithWarning,
199 TelemetryPreferenceDisabledForSession,
200 TelemetryPreferenceSaveFailed,
201 // StatusPicker — `/statusline` multi-select footer-item picker.
202 StatusPickerTitle,
203 StatusPickerInstruction,
204 StatusPickerActionToggle,
205 StatusPickerActionAll,
206 StatusPickerActionNone,
207 StatusPickerActionSave,
208 StatusPickerActionCancel,
209 // Hotbar setup wizard chrome and validation.
210 HotbarSetupTitle,
211 HotbarSetupSourceApp,
212 HotbarSetupSourceSlash,
213 HotbarSetupSourceMcp,
214 HotbarSetupSourceSkill,
215 HotbarSetupSourcePlugin,
216 HotbarSetupStatusDisabled,
217 HotbarSetupStatusPrefill,
218 HotbarSetupStatusReady,
219 HotbarSetupDirtyModified,
220 HotbarSetupDirtyClean,
221 HotbarSetupNoAction,
222 HotbarSetupConfirmDisable,
223 HotbarSetupStatusLine,
224 HotbarSetupSlotOutOfRange,
225 HotbarSetupNoActionSelected,
226 HotbarSetupCannotAssign,
227 HotbarSetupNoActions,
228 HotbarSetupRecommended,
229 HotbarSetupEmptySlot,
230 HotbarSetupHelp,
231 HotbarActionVoiceToggleName,
232 HotbarActionVoiceToggleDescription,
233 HotbarActionSessionCompactName,
234 HotbarActionSessionCompactDescription,
235 HotbarActionModePlanName,
236 HotbarActionModePlanDescription,
237 HotbarActionModeAgentName,
238 HotbarActionModeAgentDescription,
239 HotbarActionModeYoloName,
240 HotbarActionModeYoloDescription,
241 HotbarActionModeOperateName,
242 HotbarActionModeOperateDescription,
243 HotbarActionReasoningCycleName,
244 HotbarActionReasoningCycleDescription,
245 HotbarActionReasoningCycleAutoDisabled,
246 HotbarActionSidebarToggleName,
247 HotbarActionSidebarToggleDescription,
248 HotbarActionFileTreeToggleName,
249 HotbarActionFileTreeToggleDescription,
250 HotbarActionPaletteOpenName,
251 HotbarActionPaletteOpenDescription,
252 HotbarActionTrustToggleName,
253 HotbarActionTrustToggleDescription,
254 CommandPaletteTitle,
255 CommandPaletteSubtitle,
256 ConfigTitle,
257 ConfigPreviewLabel,
258 ConfigHintExternalCredentials,
259 ConfigSubtitle,
260 ConfigModalTitle,
261 ConfigSearchPlaceholder,
262 ConfigNoSettings,
263 ConfigNoMatchesPrefix,
264 ConfigFilteredSettings,
265 ConfigShowing,
266 ConfigFooterDefault,
267 ConfigFooterScrollable,
268 ConfigFooterFiltered,
269 ConfigSectionProvider,
270 ConfigSectionModel,
271 ConfigSectionPermissions,
272 ConfigSectionNetwork,
273 ConfigSectionDisplay,
274 ConfigSectionComposer,
275 ConfigSectionSidebar,
276 ConfigSectionHistory,
277 ConfigSectionMcp,
278 ConfigSectionFleet,
279 ConfigSectionWorkflow,
280 ConfigSectionSession,
281 ConfigSectionLegacy,
282 ConfigSectionExperimental,
283 ConfigScopeSession,
284 ConfigScopeSaved,
285 ConfigCommandSource,
286 ConfigCommandInvalidValue,
287 ConfigSearchUpdated,
288 ConfigPromptSuggestionUpdated,
289 ConfigLabelNotificationQuiet,
290 ConfigLabelNotificationSound,
291 ConfigLabelNotificationCondition,
292 ConfigLabelNotificationMethod,
293 ConfigLabelNotificationThreshold,
294 ConfigLabelNotificationSummary,
295 ConfigLabelNotificationSubagents,
296 ConfigLabelNotificationTurnComplete,
297 ConfigLabelNotificationSubagentTerminal,
298 ConfigLabelNotificationApprovalNeeded,
299 ConfigLabelNotificationInputNeeded,
300 ConfigLabelNotificationElevationNeeded,
301 ConfigLabelNotificationModelNotify,
302 ConfigLabelNotificationCompletionSound,
303 ConfigLabelNotificationSoundFile,
304 ConfigLabelNotificationEventSoundEnabled,
305 ConfigLabelNotificationEventSoundEvents,
306 ConfigLabelNotificationEventSoundInterval,
307 ConfigLabelNotificationEventSoundQuiet,
308 ConfigHintNotificationPolicy,
309 ConfigHintNotificationSound,
310 ConfigHintNotificationLegacy,
311 ConfigChoiceNotificationWhale,
312 ConfigChoiceNotificationLegacy,
313 ConfigChoiceNotificationAlways,
314 ConfigChoiceNotificationUnfocused,
315 ConfigChoiceNotificationNever,
316 ConfigChoiceNotificationFile,
317 ConfigChoiceNotificationBell,
318 ConfigNotificationsSetHint,
319 ConfigNotificationUpdated,
320 ConfigNotificationsWholeNumber,
321 ConfigAuditSearchProvider,
322 ConfigAuditPromptSuggestion,
323 ConfigAuditNotifications,
324 ConfigHelpDiscoverable,
325 ConfigEditCancelled,
326 ConfigEditTitlePrefix,
327 ConfigEditScopeLabel,
328 ConfigEditCurrentLabel,
329 ConfigEditHintLabel,
330 ConfigEditNewLabel,
331 ConfigEditFooter,
332 ConfigLocalePartialBadge,
333 ConfigLocalePartialDetail,
334 ConfigRowEffective,
335 ConfigDefaultValue,
336 ConfigDefaultReasoning,
337 ConfigUnavailable,
338 ConfigLabelProvider,
339 ConfigLabelBaseUrlDeepseek,
340 ConfigLabelProviderUrl,
341 ConfigHintProviderUrl,
342 ConfigLabelModel,
343 ConfigLabelFastModel,
344 ConfigLabelDefaultModel,
345 ConfigLabelReasoningEffort,
346 ConfigLabelApprovalMode,
347 ConfigLabelPermissionPosture,
348 ConfigLabelApprovalPolicy,
349 ConfigLabelManagedApprovalPolicy,
350 ConfigLabelDefaultMode,
351 ConfigLabelAllowShell,
352 ConfigLabelManagedAllowShell,
353 ConfigLabelTelemetry,
354 ConfigHintTelemetry,
355 ConfigValueTelemetryOn,
356 ConfigValueTelemetryOff,
357 ConfigLabelStreamTimeout,
358 ConfigLabelTheme,
359 ConfigLabelLocale,
360 ConfigLabelBackground,
361 ConfigLabelWorkSurfacePlacement,
362 ConfigLabelTopHeight,
363 ConfigLabelSideWidth,
364 ConfigLabelCalmMode,
365 ConfigLabelLowMotion,
366 ConfigLabelFancyAnimations,
367 ConfigLabelShowThinking,
368 ConfigLabelThinkingHighlight,
369 ConfigLabelShowToolDetails,
370 ConfigLabelInlineDiffs,
371 ConfigLabelStatusIndicator,
372 ConfigLabelSynchronizedOutput,
373 ConfigLabelCostCurrency,
374 ConfigLabelTranscriptSpacing,
375 ConfigLabelToolCollapse,
376 ConfigLabelComposerDensity,
377 ConfigLabelComposerBorder,
378 ConfigLabelComposerMultilineMode,
379 ConfigLabelComposerVimMode,
380 ConfigLabelBracketedPaste,
381 ConfigLabelPasteBurstDetection,
382 ConfigLabelMentionMenuLimit,
383 ConfigLabelMentionMenuBehavior,
384 ConfigLabelMentionWalkDepth,
385 ConfigLabelWorkspaceFollowSymlinks,
386 ConfigLabelContextPanel,
387 ConfigLabelSessionsRail,
388 ConfigLabelSessionAutoResume,
389 ConfigLabelAutoCompact,
390 ConfigLabelAutoCompactThreshold,
391 ConfigLabelMaxHistory,
392 ConfigLabelMcpOpen,
393 ConfigLabelMcpReconnect,
394 ConfigLabelMcpDiagnose,
395 ConfigLabelPluginsOpen,
396 ConfigLabelMcpConfigPath,
397 ConfigLabelFleetSpawnDepth,
398 ConfigLabelGoalCommand,
399 ConfigLabelWorkflow,
400 ConfigLabelFeaturePrefix,
401 ConfigColumnSetting,
402 ConfigColumnValue,
403 ConfigColumnScope,
404 ConfigActionOpenProvider,
405 ConfigActionOpenModel,
406 ConfigActionOpenMcp,
407 ConfigActionMcpReconnect,
408 ConfigActionMcpDiagnose,
409 ConfigActionOpenPlugins,
410 ConfigActionToggle,
411 ConfigActionChoose,
412 ConfigActionEdit,
413 ConfigActionReadOnly,
414 ModelPickerAutoNetworkHint,
415 ModelPickerAutoNetworkActiveProviderHint,
416 ModelPickerAutoLocalHint,
417 ModelPickerAutoLastRoute,
418 AutoRouteSelectedToast,
419 HelpGroupCommonCommands,
420 HelpGroupAllCommands,
421 HelpTitle,
422 HelpSubtitle,
423 HelpFilterPlaceholder,
424 HelpFilterPrefix,
425 HelpNoMatches,
426 HelpSlashCommands,
427 HelpKeybindings,
428 HelpUserCommands,
429 HelpSkills,
430 HelpFooterTypeFilter,
431 HelpFooterMove,
432 HelpFooterJump,
433 HelpFooterClose,
434 CmdAttachDescription,
435 CmdAnchorDescription,
436 CmdCacheDescription,
437 CmdPreviewRequestDescription,
438 CmdToolsDescription,
439 CmdTurnInspectDescription,
440 CmdChangeDescription,
441 CmdEffortDescription,
442 CmdChangeHeader,
443 CmdChangeTranslationQueued,
444 CmdChangeTranslationUnavailable,
445 CmdChangePreviousVersion,
446 CmdBalanceDescription,
447 CmdImportClaudeDescription,
448 CmdClearDescription,
449 CmdCompactDescription,
450 CmdPurgeDescription,
451 CmdConfigDescription,
452 CmdPermissionsDescription,
453 PermissionsListHeader,
454 PermissionsNoRules,
455 PermissionsFileMissing,
456 PermissionsFileEmpty,
457 PermissionsFilePresent,
458 PermissionsRuleEntry,
459 PermissionsMatchExactCommand,
460 PermissionsMatchCommandPrefix,
461 PermissionsMatchExactPath,
462 PermissionsMatchAnyInvocation,
463 PermissionsScopeGlobal,
464 PermissionsScopeRepo,
465 PermissionsAppliesHere,
466 PermissionsInactiveHere,
467 PermissionsRemovePreview,
468 PermissionsRemoved,
469 PermissionsUsage,
470 PermissionsRuleNotFound,
471 AutoReviewReceiptGuardianAllowed,
472 AutoReviewReceiptGuardianDenied,
473 AutoReviewReceiptGuardianUnavailable,
474 AutoReviewReceiptDeterministicBlocked,
475 AutoReviewReceiptHeld,
476 FooterHintEscInterrupt,
477 /// `{enter}` and `{steer}` are key names composed in code.
478 PostureHintEnterAgain,
479 PermissionsPostureHeader,
480 PermissionsPostureAsk,
481 PermissionsPostureAuto,
482 PermissionsPostureBypass,
483 PermissionsPostureNever,
484 PermissionsReceiptsNote,
485 PermissionsOperationFailed,
486 CmdAuthDescription,
487 CmdConstitutionDescription,
488 CmdContextDescription,
489 CmdCostDescription,
490 CmdDiffDescription,
491 CmdEditDescription,
492 CmdExitDescription,
493 CmdExportDescription,
494 CmdCopyDescription,
495 CmdCopyNoOutput,
496 CmdCopySuccess,
497 CmdCopySuccessNoBackup,
498 CmdCopyQueued,
499 CmdCopyQueuedNoBackup,
500 CmdCopyFailed,
501 CmdCopyFailedNoBackup,
502 CmdFeedbackDescription,
503 FeedbackNoSession,
504 FeedbackUnavailable,
505 FeedbackReviewNotice,
506 FeedbackHelp,
507 FeedbackDraftRequested,
508
509 CmdHfDescription,
510 CmdHelpDescription,
511 CmdProfileDescription,
512 CmdHomeDescription,
513 CmdOverviewDescription,
514 HomeBackToConversation,
515 HomeNavigationBusy,
516 CmdHooksDescription,
517 CmdAgentDescription,
518 CmdGoalDescription,
519 GoalReceiptSet,
520 GoalReceiptSetOperate,
521 GoalControlAccepted,
522 GoalControlRuntimeUnavailable,
523 GoalStatusIdleHint,
524 GoalContinuationWaiting,
525 GoalContinuationReady,
526 GoalContinuationStopped,
527 CmdInitDescription,
528 CmdJobsDescription,
529 CmdDispatchDescription,
530 CmdLinksDescription,
531 CmdLoadDescription,
532 CmdLogoutDescription,
533 CmdLoginDescription,
534 CmdMcpDescription,
535 McpRecommendedUnknownId,
536 McpRecommendationsHeading,
537 McpRecommendationsSafety,
538 McpRecommendationGithub,
539 McpRecommendationChrome,
540 McpRecommendationPlaywright,
541 McpRecommendationContainerUse,
542 McpCapabilitiesAdvertised,
543 McpCapabilitiesLegacyFallback,
544 McpCapabilitiesNotObserved,
545 CmdMemoryDescription,
546 CmdPluginDescription,
547 ExtensionsActionAdd,
548 ExtensionsActionEnable,
549 ExtensionsActionEdit,
550 ExtensionsHooksAddLabel,
551 ExtensionsHooksAddDescription,
552 ExtensionsActionReload,
553 ExtensionsActionConnect,
554 ExtensionsActionReconnect,
555 ExtensionsActionReauth,
556 ExtensionsActionDiagnose,
557 ExtensionsActionManage,
558 ExtensionsActionFocus,
559 ExtensionsActionFold,
560 ExtensionsActionTabs,
561 ExtensionsCompatibilityFull,
562 ExtensionsCompatibilityPartial,
563 ExtensionsComponentBrowserDriver,
564 ExtensionsComponentNativeRuntime,
565 ExtensionsComponentSandboxRuntime,
566 ExtensionsGroupBuiltIn,
567 ExtensionsGroupConfigured,
568 ExtensionsGroupProblems,
569 ExtensionsGroupRecommended,
570 ExtensionsGroupServers,
571 ExtensionsGroupNeedsAttention,
572 ExtensionsGroupNeedsLogin,
573 ExtensionsGroupStatus,
574 ExtensionsGroupUser,
575 ExtensionsGroupWorkspace,
576 ExtensionsHookDetail,
577 ExtensionsHookFallback,
578 ExtensionsHooksConfiguration,
579 ExtensionsInventoryAgents,
580 ExtensionsInventoryCommands,
581 ExtensionsInventoryHooks,
582 ExtensionsInventoryMcp,
583 ExtensionsInventoryNone,
584 ExtensionsInventorySkills,
585 ExtensionsMarketplaceDetail,
586 ExtensionsMarketplaceUnavailable,
587 ExtensionsMcpEmpty,
588 ExtensionsMcpBrowse,
589 ExtensionsMcpDetail,
590 ExtensionsMcpNotInspected,
591 ExtensionsMcpRefresh,
592 ExtensionsMcpSummary,
593 ExtensionsNoItems,
594 ExtensionsNoMatches,
595 ExtensionsPluginDetail,
596 ExtensionsProductBrowserUseDescription,
597 ExtensionsProductChromeDescription,
598 ExtensionsProductDetail,
599 ExtensionsProductPlaywrightDescription,
600 ExtensionsProductCodewhaleComputerUseDescription,
601 ExtensionsStateFirstParty,
602 ExtensionsProductSandboxDescription,
603 ExtensionsSearchLabel,
604 ExtensionsSkillRootCompatibleGlobal,
605 ExtensionsSkillRootCompatibleProject,
606 ExtensionsSkillRootConfigured,
607 ExtensionsSkillRootGlobal,
608 ExtensionsSkillRootProject,
609 ExtensionsSkillRootRegistryCache,
610 ExtensionsSkillRootReviewedPlugin,
611 ExtensionsStateAvailable,
612 ExtensionsStateBetaCandidate,
613 ExtensionsStateConnected,
614 ExtensionsStateEnabled,
615 ExtensionsStateEnabledUntrusted,
616 ExtensionsStateError,
617 ExtensionsStateInactive,
618 ExtensionsStateInapplicable,
619 ExtensionsStateInvalid,
620 ExtensionsStateNotInspected,
621 ExtensionsStateRejected,
622 ExtensionsStateReviewedCandidate,
623 ExtensionsStateUnderEvaluation,
624 ExtensionsStateUnstaged,
625 ExtensionsStateUnsupported,
626 ExtensionsStateWarning,
627 ExtensionsTabHooks,
628 ExtensionsTabMarketplace,
629 ExtensionsTabMarketplaceCompact,
630 ExtensionsTabPlugins,
631 ExtensionsTierCommunity,
632 ExtensionsTierCurated,
633 ExtensionsTierOfficial,
634 ExtensionsTierPartner,
635 ExtensionsTitle,
636 ExtensionsTrustCapabilitiesChanged,
637 ExtensionsTrustContentChanged,
638 ExtensionsTrustNotReviewed,
639 ExtensionsTrustTrusted,
640 ExtensionsValueNo,
641 ExtensionsValueYes,
642 PluginKimiUsage,
643 PluginKimiManagedRootHeading,
644 PluginKimiNoneFound,
645 PluginKimiLicenseUnspecified,
646 PluginKimiApplicable,
647 PluginKimiNotApplicable,
648 PluginKimiCandidateSummary,
649 PluginKimiCandidateDetails,
650 PluginKimiRejectedHeading,
651 PluginKimiInspectionFooter,
652 PluginKimiCandidateMissing,
653 PluginKimiCandidateChanged,
654 PluginKimiHomeMissing,
655 PluginKimiRootInspectFailed,
656 PluginKimiRootMustBeDirectory,
657 PluginKimiRootCanonicalizeFailed,
658 PluginKimiRootListFailed,
659 PluginKimiEntryReadFailed,
660 PluginKimiEntryLimit,
661 PluginKimiEntryInspectFailed,
662 PluginKimiEntryLinksRefused,
663 PluginKimiEntryOutsideRoot,
664 PluginKimiEntryCanonicalizeFailed,
665 PluginKimiManifestUnreadable,
666 PluginKimiManifestMustBeFile,
667 PluginKimiManifestInvalid,
668 PluginKimiDirectoryNameMismatch,
669 PluginKimiHashUnavailable,
670 PluginKimiRollbackDestinationMissing,
671 PluginKimiMismatchRemoved,
672 PluginKimiMismatchRollbackFailed,
673 PluginKimiUserPluginDirectory,
674 PluginKimiMarketplaceZipUnsupported,
675 PluginKimiMarketplaceRemoteUnsupported,
676 PluginKimiMarketplaceGzipTarball,
677 CmdPluginBundleUsage,
678 CmdPluginBundleNoneFound,
679 CmdPluginBundleListHeader,
680 CmdPluginLegacyListHeader,
681 CmdPluginBundleNotFound,
682 CmdPluginBundleReloaded,
683 PluginPromptSuggestTrust,
684 PluginPromptSuggestEnable,
685 PluginPromptSuggestMarketplace,
686 PluginCtaInstallPrompt,
687 PluginCtaReview,
688 PluginCtaDismiss,
689 PluginCtaDismissSaveFailed,
690 PluginSuggestionReason,
691 PagerActionConfirm,
692 CmdPluginBundleDetail,
693 CmdPluginBundleDiagnosticsHeader,
694 CmdPluginBundleMutationSuccess,
695 CmdPluginActionFailed,
696 CmdPluginNoneFound,
697 CmdPluginNotFound,
698 CmdPluginListHeader,
699 CmdPluginDetailDescription,
700 CmdPluginDetailSchema,
701 CmdPluginDetailApproval,
702 CmdPluginDetailPath,
703 CmdModeDescription,
704 CmdModelDescription,
705 CmdModelsDescription,
706 ModelsListHeader,
707 ModelsListHint,
708 ModelsUpdateSummary,
709 ModelsUpdatePartial,
710 ModelsCodexHint,
711 ModelsSourceFallback,
712 CmdModelDbDescription,
713 CmdNetworkDescription,
714 CmdUpdateDescription,
715 CmdNoteDescription,
716 CmdThemeDescription,
717 CmdProviderDescription,
718 CmdQueueDescription,
719 CmdQueueUsage,
720 CmdQueueDraftHeader,
721 CmdQueueNoMessages,
722 CmdQueueListHeader,
723 CmdQueueTip,
724 CmdQueueAlreadyEditing,
725 CmdQueueNotFound,
726 CmdQueueEditingStatus,
727 CmdQueueEditingMessage,
728 CmdQueueDropped,
729 CmdQueueAlreadyEmpty,
730 CmdQueueCleared,
731 CmdQueueMissingIndex,
732 CmdQueueIndexPositive,
733 CmdQueueIndexMin,
734 CmdRelayDescription,
735 CmdRemoteControlDescription,
736 CmdRemoteEnvDescription,
737 CmdRemoteEnvOverview,
738 CmdRemoteEnvOpening,
739 CmdRemoteEnvUnavailable,
740 CmdRemoteEnvSourceCustodyPolicy,
741 CmdRemoteEnvBrowserLabel,
742 CmdRenameDescription,
743 CmdTitleDescription,
744 CmdRestoreDescription,
745 CmdRetryDescription,
746 CmdReviewDescription,
747 CmdRlmDescription,
748 CmdSaveDescription,
749 CmdFullscreenDescription,
750 CmdInlineDescription,
751 CmdForkDescription,
752 CmdNewDescription,
753 CmdSessionsDescription,
754 CmdTreeDescription,
755 CmdBranchDescription,
756 CmdResumeDescription,
757 CmdSettingsDescription,
758 CmdSidebarDescription,
759 CmdSkillDescription,
760 CmdSkillsDescription,
761 CmdStashDescription,
762 CmdStatusDescription,
763 CmdStatuslineDescription,
764 CmdStructcopyDescription,
765 CmdStructcopyKindTurn,
766 CmdStructcopyKindTool,
767 CmdStructcopyKindPlan,
768 CmdStructcopyKindWorkflow,
769 CmdStructcopyUsageError,
770 CmdStructcopyUnavailable,
771 CmdStructcopyBusy,
772 CmdStructcopyPrepareFailed,
773 CmdStructcopyClipboardQueued,
774 CmdStructcopyClipboardAccepted,
775 CmdStructcopyClipboardFailed,
776 CmdStructcopyReceiptTooLarge,
777 CmdFleetDescription,
778 PetUnobserved,
779 PetDozing,
780 PetWatchUnavailable,
781 PetWatchRestored,
782 PetWatchStorageUnavailable,
783 PetWatchExported,
784 PetWatchExportFailed,
785 PetWatchExportQueued,
786 PetWatchExportUnavailable,
787 PetHabitatTitle,
788 PetHabitatHints,
789 PetHabitatQueued,
790 PetWatchSoundOn,
791 PetWatchSoundOff,
792 PetWatchSoundPaused,
793 PetWatchSoundUnavailable,
794 CmdPetDescription,
795 PetModeOn,
796 PetModeOff,
797 PetModeOnLabel,
798 PetModeOffLabel,
799 PetViewOpen,
800 PetViewClosed,
801 CmdLaneDescription,
802 CmdWorkflowDescription,
803 CmdWorkflowsDescription,
804 CmdAutoDescription,
805 AutoReceiptOn,
806 AutoReceiptPlanNote,
807 CmdHotbarDescription,
808 CmdSetupDescription,
809 CmdSubagentsDescription,
810 CmdAdvisorDescription,
811 CmdSystemDescription,
812 CmdAutomationDescription,
813 CmdTaskDescription,
814 CmdTokensDescription,
815 CmdTranslateDescription,
816 CmdTranslateOff,
817 CmdTranslateOn,
818 TranslationInProgress,
819 TranslationComplete,
820 TranslationFailed,
821 CmdTrustDescription,
822 CmdLspDescription,
823 CmdShareDescription,
824 CmdWorkspaceDescription,
825 CmdUndoDescription,
826 CmdVerboseDescription,
827 CmdCacheAdvice,
828 CmdCacheFootnote,
829 CmdCacheHeader,
830 CmdCacheNoData,
831 CmdCacheTotals,
832 CmdCostReport,
833 CmdCostReportSubtotal,
834 CmdCostReportUnknown,
835 CmdCostUnknownValue,
836 CmdCostEstimateOnly,
837 CmdCostCoverage,
838 CmdCostCoverageUnknownLegacy,
839 CmdCostUnpricedTurns,
840 CmdCostUnpricedClasses,
841 CmdCostPricingProvenance,
842 CmdCostLivePricingDowngraded,
843 CmdCostLivePricingUnavailable,
844 CmdCostRoutesHeader,
845 CmdTokensCacheWriteTotal,
846 CmdTokensCacheBoth,
847 CmdTokensCacheHitOnly,
848 CmdTokensCacheMissOnly,
849 CmdTokensContextUnknownWindow,
850 CmdTokensContextWithWindow,
851 CmdTokensNotReported,
852 CmdTokensReport,
853 FooterAgentSingular,
854 FooterAgentsPlural,
855 HeaderAgentsChip,
856 FooterPressCtrlCAgain,
857 FooterWorking,
858 FooterBalancePrefix,
859 HelpSectionActions,
860 HelpSectionClipboard,
861 HelpSectionPointer,
862 HelpSectionEditing,
863 HelpSectionHelp,
864 HelpSectionModes,
865 HelpSectionNavigation,
866 HelpSectionSessions,
867 KbScrollTranscript,
868 KbNavigateHistory,
869 KbScrollTranscriptAlt,
870 KbBrowseHistory,
871 KbScrollPage,
872 KbJumpTopBottom,
873 KbJumpTopBottomEmpty,
874 KbJumpToolBlocks,
875 KbMoveCursor,
876 KbJumpLineStartEnd,
877 KbDeleteChar,
878 KbDeleteWord,
879 KbYank,
880 KbToggleFileTree,
881 KbSelectText,
882 KbSelectAllDraft,
883 KbClearDraft,
884 KbRestoreClearedDraft,
885 KbStashDraft,
886 KbSearchHistory,
887 KbInsertNewline,
888 KbSendDraft,
889 KbSteerCurrentTurn,
890 KbCloseMenu,
891 KbCancelOrExit,
892 KbShellControls,
893 KbExitEmpty,
894 KbCommandPalette,
895 KbSettings,
896 KbCancelBackgroundShellJobs,
897 KbFuzzyFilePicker,
898 KbCompactInspector,
899 KbCompactContext,
900 KbLastMessagePager,
901 KbSelectedDetails,
902 KbToolDetailsPager,
903 KbReasoningDetail,
904 KbTurnInspector,
905 KbExternalEditor,
906 KbLiveTranscript,
907 KbBacktrackMessage,
908 KbCompleteCycleModes,
909 KbCycleThinking,
910 KbCyclePermissions,
911 KbJumpPlanAgentYolo,
912 KbAltJumpPlanAgentYolo,
913 KbFocusSidebar,
914 KbSessionPicker,
915 KbUpdateInstall,
916 /// Startup hint: the running version is newer than the last-launched one.
917 UpdateChangedHint,
918 KbTerminalPaste,
919 KbPasteAttach,
920 KbCopySelection,
921 ClipboardSshPasteHint,
922 KbContextMenu,
923 KbPointerScroll,
924 KbPointerClick,
925 KbPointerDrag,
926 KbAttachPath,
927 KbHelpOverlay,
928 KbCycleWorkDock,
929 KbCycleWorkDockBack,
930 KbToggleHelp,
931 KbToggleHelpSlash,
932 HelpUsageLabel,
933 HelpAliasesLabel,
934 SettingsTitle,
935 SettingsConfigFile,
936 SettingsTuiPrefsFolded,
937 SettingsTuiPrefsKept,
938 SettingsTuiPrefsQuarantined,
939 ClearConversation,
940 ClearConversationBusy,
941 ModelChanged,
942 LinksProjectTitle,
943 LinksDocumentation,
944 LinksCommunity,
945 LinksGitHub,
946 LinksManagedApp,
947 LinksManagedAppNote,
948 LinksTitle,
949 LinksDashboard,
950 LinksDocs,
951 LinksKimiCodeRouteNote,
952 LinksTip,
953 SubagentsFetching,
954 SubagentsNoCurrentSessionFleetWorkers,
955 SubagentsCurrentSessionFleetWorkersTitle,
956 SubagentsCurrentSessionFleetWorkerRoles,
957 SubagentsCurrentSessionFleetWorkersStatus,
958 SubagentsEmptyGuidance,
959 SubagentsStatusRunning,
960 SubagentsStatusCompleted,
961 SubagentsStatusInterrupted,
962 SubagentsStatusFailed,
963 SubagentsStatusCancelled,
964 SubagentsRowStatusInterrupted,
965 SubagentsRowStatusCancelled,
966 SubagentsRowStatusBudgetExhausted,
967 SubagentsSummaryItem,
968 SubagentsGroupHeading,
969 SubagentsHeaderRoster,
970 SubagentsHeaderColumns,
971 SubagentsActionRefresh,
972 SubagentsActionRosterSetup,
973 SubagentsLabelReason,
974 SubagentsLabelRole,
975 SubagentsLabelPosture,
976 SubagentsLabelGit,
977 SubagentsLabelObjective,
978 SubagentsLabelResult,
979 SubagentsPostureDetails,
980 SubagentsValueOn,
981 SubagentsValueOff,
982 SubagentsShellNone,
983 SubagentsShellReadOnly,
984 SubagentsShellFull,
985 SubagentsBranch,
986 SubagentsBranchWithWorkspace,
987 SubagentsRoleWorker,
988 SubagentsRoleScout,
989 SubagentsRolePlanner,
990 SubagentsRoleBuilder,
991 SubagentsRoleVerifier,
992 SubagentsRoleReviewer,
993 SubagentsRoleConsultant,
994 SubagentsRoleCustom,
995 HelpUnknownCommand,
996 HomeDashboardTitle,
997 HomeModel,
998 HomeMode,
999 HomeWorkspace,
1000 HomeHistory,
1001 HomeTokens,
1002 HomeQueued,
1003 HomeSubagents,
1004 HomeSkill,
1005 HomeQuickActions,
1006 HomeQuickLinks,
1007 HomeQuickSkills,
1008 HomeQuickConfig,
1009 HomeQuickSettings,
1010 HomeQuickModel,
1011 HomeQuickSubagents,
1012 HomeQuickTaskList,
1013 HomeQuickHelp,
1014 HomeQuickWorkspace,
1015 HomeQuickRestore,
1016 HomeQuickTokens,
1017 HomeModeTips,
1018 HomeAgentModeTip,
1019 HomeAgentModeReviewTip,
1020 HomeAgentModeYoloTip,
1021 HomeYoloModeTip,
1022 HomeYoloModeCaution,
1023 HomePlanModeTip,
1024 HomePlanModeChecklistTip,
1025 HomeOperateModeTip,
1026 HomeOperateModeFleetTip,
1027 HomeGoalModeTip,
1028 // Onboarding screens — calm first-run welcome (#3938 rewrite).
1029 OnboardWelcomeTitle,
1030 OnboardWelcomeLead,
1031 OnboardWelcomeBegin,
1032 OnboardActionBack,
1033 OnboardActionExit,
1034 OnboardStepsTitle,
1035 // Onboarding screens — language picker.
1036 OnboardLanguageTitle,
1037 OnboardLanguageBlurb,
1038 OnboardLanguagePick,
1039 OnboardLanguageKeep,
1040 OnboardProviderTitle,
1041 OnboardProviderBlurb,
1042 OnboardProviderChoose,
1043 OnboardProviderOffline,
1044 KimiCodePlanApiKeyHint,
1045 KimiCodePlanRouteHint,
1046 KimiCodePlanNoImportHint,
1047 StepfunBillingRouteTitle,
1048 StepfunBillingRouteIntro,
1049 StepfunBillingRoutePaygOption,
1050 StepfunBillingRoutePlanOption,
1051 StepfunPlanApiKeyHint,
1052 StepfunPlanRouteHint,
1053 OnboardApiKeyRejectedEnv,
1054 // Onboarding screens — workspace trust prompt.
1055 OnboardTrustTitle,
1056 OnboardTrustQuestion,
1057 OnboardTrustLocationPrefix,
1058 OnboardTrustRiskHint,
1059 OnboardTrustEffectHint,
1060 OnboardTrustActionTrust,
1061 OnboardTrustActionSkip,
1062 OnboardTrustActionQuit,
1063 OnboardTrustEnterHint,
1064 OnboardTrustUntrustedNotice,
1065 RedactionGateSaveFailed,
1066 RedactionGateTitle,
1067 RedactionGateQuestion,
1068 RedactionGateDangerNotice,
1069 RedactionGateRisk,
1070 RedactionGateEffect,
1071 RedactionGateRollbackHint,
1072 RedactionGateEnterHint,
1073 RedactionGateActionConfirm,
1074 RedactionGateActionKeep,
1075 RedactionGateActionQuit,
1076 // Startup gate — second-stage final confirmation before the opt-out
1077 // really takes effect.
1078 RedactionGateConfirmTitle,
1079 RedactionGateConfirmQuestion,
1080 RedactionGateActionBack,
1081 // Onboarding screens — explicit offline ("explore") choice (#3927).
1082 OnboardOfflineOption,
1083 OnboardOfflineNotice,
1084 // Onboarding screens — ready screen and the seeded first task.
1085 OnboardReadyTitle,
1086 OnboardReadyLead,
1087 OnboardReadyStart,
1088 OnboardReadyCustomize,
1089 OnboardSeedCodeProject,
1090 OnboardSeedFolder,
1091 // Constitution-first setup wizard.
1092 SetupWizardTitle,
1093 SetupWizardWhy,
1094 SetupWizardProgress,
1095 SetupActionBack,
1096 SetupActionContinue,
1097 SetupActionSkip,
1098 SetupActionRetry,
1099 SetupActionScrollBody,
1100 SetupActionGuided,
1101 SetupActionTuneGuided,
1102 SetupActionModelDraft,
1103 SetupActionFreeform,
1104 SetupActionKeepExisting,
1105 SetupActionUseRecommended,
1106 SetupActionCustomize,
1107 SetupActionProvider,
1108 SetupActionModel,
1109 SetupActionFleet,
1110 SetupActionHotbar,
1111 SetupActionRemote,
1112 SetupActionMode,
1113 SetupActionConfig,
1114 SetupActionRuntimePreset,
1115 SetupActionApplyRuntimePreset,
1116 SetupActionUseBundled,
1117 SetupActionDefer,
1118 SetupActionCancel,
1119 SetupStatusNotStarted,
1120 SetupStatusRecommended,
1121 SetupStatusOptional,
1122 SetupStatusDeferred,
1123 SetupStatusInProgress,
1124 SetupStatusNeedsAction,
1125 SetupStatusVerified,
1126 SetupStatusSkipped,
1127 SetupStatusFailed,
1128 SetupStepLanguageTitle,
1129 SetupStepLanguageWhy,
1130 SetupStepProviderModelTitle,
1131 SetupStepProviderModelWhy,
1132 SetupStepTrustSandboxTitle,
1133 SetupStepTrustSandboxWhy,
1134 SetupStepOperateFleetTitle,
1135 SetupStepOperateFleetWhy,
1136 SetupStepToolsMcpTitle,
1137 SetupStepToolsMcpWhy,
1138 SetupStepHotbarTitle,
1139 SetupStepHotbarWhy,
1140 SetupStepRemoteRuntimeTitle,
1141 SetupStepRemoteRuntimeWhy,
1142 SetupStepPersistenceTitle,
1143 SetupStepPersistenceWhy,
1144 SetupStepConstitutionTitle,
1145 SetupStepConstitutionWhy,
1146 SetupStepVerificationTitle,
1147 SetupStepVerificationWhy,
1148 SetupCheckpointLayerOrder,
1149 SetupCheckpointDoneBundled,
1150 SetupCheckpointDoneGuided,
1151 SetupCheckpointDoneKept,
1152 SetupCheckpointDeferred,
1153 SetupStepSkipped,
1154 SetupStepRetryRecorded,
1155 SetupLanguageReviewed,
1156 SetupConstitutionChoiceLabel,
1157 SetupConstitutionSourceLabel,
1158 SetupConstitutionValidityLabel,
1159 SetupConstitutionPreviewLabel,
1160 SetupConstitutionExistingLabel,
1161 SetupConstitutionExpertOverrideLabel,
1162 SetupConstitutionGuidedHint,
1163 SetupConstitutionGuidedAnswersHint,
1164 SetupConstitutionExistingDefaultDetail,
1165 SetupConstitutionRepairDefaultDetail,
1166 SetupConstitutionPurposeLabel,
1167 SetupConstitutionAutonomyLabel,
1168 SetupConstitutionEvidenceLabel,
1169 SetupConstitutionCommunicationLabel,
1170 SetupConstitutionPrivacyLabel,
1171 SetupConstitutionPrinciplesLabel,
1172 SetupCardRouteLabel,
1173 SetupCardModelLabel,
1174 SetupCardAuthLabel,
1175 SetupCardHealthLabel,
1176 SetupCardIntentLabel,
1177 SetupCardApprovalLabel,
1178 SetupCardShellLabel,
1179 SetupCardTrustLabel,
1180 SetupCardSandboxLabel,
1181 SetupCardNetworkLabel,
1182 SetupOperateRuntimeLabel,
1183 SetupOperateRosterLabel,
1184 SetupOperateConcurrencyLabel,
1185 SetupOperateReadinessLabel,
1186 SetupOperateReviewHint,
1187 SetupOperateReviewed,
1188 SetupOperateNeedsActionSaved,
1189 SetupHotbarBindingsLabel,
1190 SetupHotbarActionsLabel,
1191 SetupHotbarReviewHint,
1192 SetupHotbarReviewed,
1193 SetupToolsMcpServersLabel,
1194 SetupToolsMcpSkillsLabel,
1195 SetupToolsMcpToolsLabel,
1196 SetupToolsMcpPluginsLabel,
1197 SetupToolsMcpHotbarLabel,
1198 SetupToolsMcpReviewHint,
1199 SetupToolsMcpReviewed,
1200 SetupToolsMcpNeedsActionSaved,
1201 SetupToolsMcpPreviewTitle,
1202 SetupToolsMcpOnRampText,
1203 SetupToolsMcpDshLabel,
1204 SetupToolsMcpDshRow,
1205 SetupRemoteCloudsLabel,
1206 SetupRemoteBridgesLabel,
1207 SetupRemoteProvidersLabel,
1208 SetupRemoteModeLabel,
1209 SetupRemoteModeLocalOnly,
1210 SetupRemoteModeRuntimeApi,
1211 SetupRemoteModeMobileLan,
1212 SetupRemoteModeChatBridge,
1213 SetupRemoteStatusDisabled,
1214 SetupRemoteStatusReady,
1215 SetupRemoteStatusNeedsAction,
1216 SetupRemoteReviewHint,
1217 SetupRemotePreviewTitle,
1218 SetupRemoteReviewed,
1219 SetupPersistenceHomeLabel,
1220 SetupPersistenceConfigLabel,
1221 SetupPersistenceStateLabel,
1222 SetupPersistenceConstitutionLabel,
1223 SetupPersistenceMemoryLabel,
1224 SetupPersistenceNotesLabel,
1225 SetupPersistenceReviewHint,
1226 SetupPersistenceReviewed,
1227 SetupProviderModelReadyHint,
1228 SetupProviderModelNeedsActionHint,
1229 SetupProviderModelReviewed,
1230 SetupProviderModelNeedsActionSaved,
1231 SetupRuntimePostureBoundary,
1232 SetupRuntimePostureReviewHint,
1233 SetupRuntimePostureReviewed,
1234 SetupRuntimePresetSelectedLabel,
1235 SetupRuntimePresetDiffLabel,
1236 SetupRuntimePresetAskFirstTitle,
1237 SetupRuntimePresetAskFirstDescription,
1238 SetupRuntimePresetNormalAgentTitle,
1239 SetupRuntimePresetNormalAgentDescription,
1240 SetupRuntimePresetHighTrustTitle,
1241 SetupRuntimePresetHighTrustDescription,
1242 SetupRuntimePresetPreviewTitle,
1243 SetupRuntimePresetSafetyFloor,
1244 SetupRuntimePresetApplyHint,
1245 SetupRuntimePresetApplied,
1246 SetupRuntimeProjectOverrideLabel,
1247 SetupRuntimeProjectOverrideNone,
1248 SetupReportFirstRunLabel,
1249 SetupReportUpdateLabel,
1250 SetupReportOperateLabel,
1251 SetupReportSourceLabel,
1252 SetupReportAutonomyLabel,
1253 SetupReportRuntimePostureLabel,
1254 SetupReportPersisted,
1255 SetupReportInherited,
1256 SetupReportReady,
1257 SetupReportRequired,
1258 SetupReportOptional,
1259 SetupReportRowsLabel,
1260 SetupReportNextActionLabel,
1261 SetupReportNextActionNone,
1262 SetupReportNextActionConstitution,
1263 SetupReportNextActionProvider,
1264 SetupReportNextActionRuntime,
1265 SetupReportNextActionOperate,
1266 SetupReportNextActionRequired,
1267 SetupReportRecorded,
1268 // Context menu.
1269 CtxMenuTitle,
1270 CtxMenuCopySelection,
1271 CtxMenuCopySelectionDesc,
1272 CtxMenuOpenSelection,
1273 CtxMenuOpenSelectionDesc,
1274 CtxMenuClearSelection,
1275 CtxMenuOpenDetails,
1276 CtxMenuCopyMessage,
1277 CtxMenuCopyMessageDesc,
1278 CtxMenuOpenInEditor,
1279 CtxMenuOpenInEditorDesc,
1280 CtxMenuShowCell,
1281 CtxMenuShowCellDesc,
1282 CtxMenuHideCell,
1283 CtxMenuHideCellDesc,
1284 CtxMenuShowHidden,
1285 CtxMenuShowHiddenDesc,
1286 CtxMenuPaste,
1287 CtxMenuPasteDesc,
1288 CtxMenuCmdPalette,
1289 CtxMenuCmdPaletteDesc,
1290 CtxMenuContextInspector,
1291 CtxMenuContextInspectorDesc,
1292 CtxMenuHelp,
1293 CtxMenuHelpDesc,
1294 /// Right-click menu: pin/unpin the host terminal window into an
1295 /// always-on-top mini window.
1296 CtxMenuWindowPin,
1297 /// Right-click menu: unpin label shown while the window is pinned.
1298 CtxMenuWindowUnpin,
1299 /// Right-click menu: description for the window-pin entry.
1300 CtxMenuWindowPinDesc,
1301 /// `/pin` command description (always-on-top mini-window toggle).
1302 CmdPinDescription,
1303 /// Status toast: host window is now the always-on-top mini window.
1304 WindowPinActive,
1305 /// Status toast: host window restored from the pinned mini window.
1306 WindowPinReleased,
1307 /// Status toast: window change failed or was not observed before timeout.
1308 WindowPinFailed,
1309 // Agent fanout card.
1310 FanoutCounts,
1311
1312 // App mode picker (names, hints) and composer vim indicator.
1313 AppModeAgent,
1314 AppModeAuto,
1315 AppModeYolo,
1316 AppModePlan,
1317 AppModeOperate,
1318 AppModeAgentHint,
1319 AppModeAutoHint,
1320 AppModePlanHint,
1321 AppModeYoloHint,
1322 AppModeOperateHint,
1323 VimModeNormal,
1324 VimModeInsert,
1325 VimModeVisual,
1326
1327 // Approval dialog — risk badges, category labels, field labels, options.
1328 ApprovalRiskReview,
1329 ApprovalRiskElevated,
1330 ApprovalRiskDestructive,
1331 ApprovalCategorySafe,
1332 ApprovalCategoryFileWrite,
1333 ApprovalCategoryShell,
1334 ApprovalCategoryNetwork,
1335 ApprovalCategoryMcpRead,
1336 ApprovalCategoryMcpAction,
1337 ApprovalCategoryAgent,
1338 ApprovalCategoryUnknown,
1339 ApprovalFieldType,
1340 ApprovalFieldAbout,
1341 ApprovalFieldImpact,
1342 ApprovalFieldParams,
1343 ApprovalOptionApproveOnce,
1344 ApprovalOptionApproveAlways,
1345 ApprovalOptionAllowExactRepo,
1346 ApprovalSaveAskRuleHint,
1347 ApprovalOptionDeny,
1348 ApprovalOptionAbortTurn,
1349 ApprovalBlockTitle,
1350 ApprovalControlsHint,
1351 ApprovalTruncationHint,
1352 ApprovalFullAccessPolicyBlocked,
1353 AutoReviewQuestionSkipped,
1354 ApprovalChooseHint,
1355 ApprovalChooseAction,
1356 ApprovalIntentLabel,
1357 ApprovalMoreLines,
1358 ApprovalAutoDeniedSession,
1359 // Sandbox elevation dialog.
1360 ElevationTitleSandboxDenied,
1361 ElevationTitleRequired,
1362 ElevationFieldTool,
1363 ElevationFieldCmd,
1364 ElevationFieldReason,
1365 ElevationImpactHeader,
1366 ElevationImpactNetwork,
1367 ElevationImpactWrite,
1368 ElevationImpactFullAccess,
1369 ElevationPromptProceed,
1370 ElevationOptionNetwork,
1371 ElevationOptionWrite,
1372 ElevationOptionFullAccess,
1373 ElevationOptionAbort,
1374 ElevationOptionNetworkDesc,
1375 ElevationOptionWriteDesc,
1376 ElevationOptionFullAccessDesc,
1377 ElevationOptionAbortDesc,
1378
1379 // Context compaction status and errors.
1380 ContextAutoCompacting,
1381 ContextManualCompacting,
1382 ContextCompactionQueued,
1383 ContextCompactionAlreadyRunning,
1384 ContextCompactionQueueFull,
1385 ContextCompactionQueueClosed,
1386 ContextCompactionRouteInvalid,
1387 CtxInspTitle,
1388 CtxInspSessionContext,
1389 CtxInspSystemPrompt,
1390 CtxInspReferences,
1391 CtxInspRecentTools,
1392 CtxInspToolSchemaCosts,
1393 CtxInspModel,
1394 CtxInspWorkspace,
1395 CtxInspSession,
1396 CtxInspContext,
1397 CtxInspTranscript,
1398 CtxInspWorkspaceStatus,
1399 CtxInspNotSampledYet,
1400 CtxInspOk,
1401 CtxInspHigh,
1402 CtxInspCritical,
1403 CtxInspIncluded,
1404 CtxInspAttached,
1405 CtxInspNotIncluded,
1406 CtxInspOutputCaptured,
1407 CtxInspNoOutputYet,
1408 CtxInspNoSystemPrompt,
1409 CtxInspNoReferences,
1410 CtxInspNoToolActivity,
1411 CtxInspVHint,
1412 CtxInspCells,
1413 CtxInspApiMessages,
1414 CtxInspActive,
1415 CtxInspCell,
1416 CtxInspMoreReferences,
1417 CtxInspStablePrefix,
1418 CtxInspVolatileWorkingSet,
1419 CtxInspFirstLine,
1420 CtxInspTotal,
1421 CtxInspTextPromptLayers,
1422 CtxInspSingleTextBlob,
1423 CtxInspBlocks,
1424 CtxInspBlock,
1425 CtxInspTokens,
1426 CtxInspLayers,
1427 CtxInspNone,
1428 CtxInspEmpty,
1429 CtxInspCacheFriendly,
1430 CtxInspChangesByTurn,
1431 CtxInspStablePrefixOnly,
1432 CtxInspCacheTip,
1433 // Tool family labels (card headers, sidebar, footer).
1434 ToolFamilyRead,
1435 ToolFamilyPatch,
1436 ToolFamilyRun,
1437 ToolFamilyFind,
1438 ToolFamilyDelegate,
1439 ToolFamilyFanout,
1440 ToolFamilyRlm,
1441 ToolFamilyVerify,
1442 ToolFamilyThink,
1443 ToolFamilyGeneric,
1444 // Tool execution receipt labels (card headers).
1445 ToolReceiptDone,
1446 ToolReceiptLinesSingular,
1447 ToolReceiptLinesPlural,
1448 // Voice commands (/voice, /voice-send, /voice-control)
1449 CmdVoiceDescription,
1450 CmdVoiceSendDescription,
1451 CmdVoiceControlDescription,
1452 VoiceEnabled,
1453 VoiceDisabled,
1454 VoiceSendEnabled,
1455 VoiceSendDisabled,
1456 VoiceControlEnabled,
1457 VoiceControlDisabled,
1458 VoiceErrNoAuth,
1459 VoiceErrNoRecorder,
1460 VoiceErrNetwork,
1461 VoiceErrEmptySend,
1462 VoiceErrTooShort,
1463 VoiceRecording,
1464 VoiceProcessing,
1465 VoiceTranscribed,
1466 // Notifications (turn/agent completion).
1467 NotificationApprovalNeeded,
1468 NotificationInputNeeded,
1469 NotificationElevationNeeded,
1470 NotificationDecisionWebHint,
1471 NotificationTurnFailed,
1472 NotificationProviderFallback,
1473 ApprovalNeverPostureBlocked,
1474 ApprovalTimedOutDenied,
1475 NotificationWebApproved,
1476 NotificationWebDenied,
1477 NotificationInputSubmitFailed,
1478 NotificationTurnComplete,
1479 NotificationSubagentComplete,
1480 NotificationSubagentFailed,
1481 NotificationSubagentInterrupted,
1482 NotificationSubagentCancelled,
1483 NotificationSubagentBudgetExhausted,
1484 // Footer chips.
1485 FooterWorkedChip,
1486 // Fleet setup wizard.
1487 FleetDraftTitle,
1488 FleetDraftHeader,
1489 // Remote setup on-ramp.
1490 SetupRemoteOnRampText,
1491 // Approval dialog — localized descriptions.
1492 ApprovalDescSafe,
1493 ApprovalDescFileWrite,
1494 ApprovalDescShell,
1495 ApprovalDescNetwork,
1496 ApprovalDescMcpRead,
1497 ApprovalDescMcpAction,
1498 ApprovalDescAgent,
1499 ApprovalDescUnknown,
1500 // Approval impact summaries.
1501 ApprovalImpactSafe,
1502 ApprovalImpactFileWrite,
1503 ApprovalImpactShell,
1504 ApprovalImpactNetwork,
1505 ApprovalImpactMcpRead,
1506 ApprovalImpactMcpAction,
1507 ApprovalImpactAgent,
1508 ApprovalImpactUnknown,
1509 // Approval detail labels.
1510 ApprovalLabelCommand,
1511 ApprovalLabelDir,
1512 ApprovalLabelFile,
1513 ApprovalLabelPreview,
1514 ApprovalLabelProposedContent,
1515 ApprovalLabelReplaceThis,
1516 ApprovalLabelWithThis,
1517 ApprovalLabelReplacementContent,
1518 ApprovalLabelPath,
1519 ApprovalLabelTarget,
1520 ApprovalLabelInput,
1521 ApprovalLabelAction,
1522 ApprovalLabelType,
1523 ApprovalLabelPrompt,
1524 // Approval header labels.
1525 ApprovalLabelAbout,
1526 ApprovalLabelImpact,
1527 // Setup wizard — constitution file state.
1528 SetupConstitutionFileNotChecked,
1529 SetupConstitutionFileMissing,
1530 SetupConstitutionFileLoadedSelected,
1531 SetupConstitutionFileLoadedInactive,
1532 SetupConstitutionFileLoadedUnselected,
1533 SetupConstitutionFileEmpty,
1534 SetupConstitutionFileInvalid,
1535 SetupConstitutionFileUnreadable,
1536 SetupConstitutionFilePathError,
1537 // Setup wizard — expert override state.
1538 SetupExpertOverrideNotChecked,
1539 SetupExpertOverrideMissing,
1540 SetupExpertOverrideActive,
1541 SetupExpertOverrideDisabled,
1542 SetupExpertOverrideEmpty,
1543 SetupExpertOverrideUnreadable,
1544 SetupExpertOverridePathError,
1545 // Setup wizard — autonomy fallback.
1546 SetupAutonomyUnspecified,
1547 // Setup wizard — purpose labels.
1548 SetupGuidedPurposeCoding,
1549 SetupGuidedPurposeResearch,
1550 SetupGuidedPurposeOperations,
1551 SetupGuidedPurposeMixed,
1552 // Setup wizard — purpose about descriptions.
1553 SetupGuidedPurposeAboutCoding,
1554 SetupGuidedPurposeAboutResearch,
1555 SetupGuidedPurposeAboutOperations,
1556 SetupGuidedPurposeAboutMixed,
1557 // Setup wizard — working style descriptions.
1558 SetupGuidedStyleCoding,
1559 SetupGuidedStyleResearch,
1560 SetupGuidedStyleOperations,
1561 SetupGuidedStyleMixed,
1562 // Setup wizard — evidence labels.
1563 SetupGuidedEvidenceAssumptions,
1564 SetupGuidedEvidenceTestsAndReceipts,
1565 SetupGuidedEvidenceReleaseReceipts,
1566 // Setup wizard — guided answer notes.
1567 SetupGuidedNotes,
1568 // Underwater launch screen (pre-session menu + worktree flow).
1569 LaunchStartTitle,
1570 /// Arming line for a clicked recent-work row. Resuming replaces the whole
1571 /// session context, so the click arms and a second activation confirms.
1572 LaunchResumeConfirm,
1573 LaunchResumeConfirmTitle,
1574 LaunchResumeConfirmBody,
1575 LaunchResumeConfirmResume,
1576 LaunchResumeConfirmCancel,
1577 LaunchWorkDescription,
1578 LaunchChatDescription,
1579 LaunchWorkspaceGitReady,
1580 LaunchWorkspaceFolderReady,
1581 LaunchProviderConfigured,
1582 LaunchProviderSetupNeeded,
1583 LaunchGroupContinue,
1584 LaunchGroupMore,
1585 LaunchWorkspaceGitShort,
1586 LaunchWorkspaceFolderShort,
1587 LaunchProviderConfiguredShort,
1588 LaunchProviderSetupShort,
1589 LaunchMenuChangelog,
1590 LaunchWorktreePrompt,
1591 LaunchWorktreeNeedsGit,
1592 LaunchWorktreeNameLabel,
1593 LaunchHintMove,
1594 LaunchHintOpen,
1595 LaunchTipFlags,
1596 LaunchSavedSessionSingular,
1597 LaunchSavedSessionsPlural,
1598 LaunchCreatingWorktree,
1599 LaunchWorktreeFailed,
1600 LaunchWorktreeCreated,
1601 LaunchNoSavedSessions,
1602 LaunchNewSession,
1603 LaunchRecentHeading,
1604 LaunchHelpLine,
1605 LaunchSeeAllSessions,
1606 LaunchNoRecentSessions,
1607 LaunchResumeFailed,
1608 LaunchNoModelConnected,
1609 LaunchRunCommand,
1610 LaunchMcpConnectedOne,
1611 LaunchMcpConnectedMany,
1612 LaunchMcpNeedsSignInOne,
1613 LaunchMcpNeedsSignInMany,
1614 LaunchMenuNewWorktree,
1615 LaunchMenuResume,
1616 LaunchMenuQuit,
1617 LaunchNoticeClaude,
1618 ReceiptSessionHooks,
1619 // Underwater shell phase words (footer status band).
1620 PhaseIdle,
1621 PhaseDraft,
1622 PhaseWorking,
1623 PhaseReasoning,
1624 PhaseReading,
1625 PhaseUsingTool,
1626 /// Live sub-users (agent spawns) are running — reading differently from
1627 /// tool work so the shell can signal orchestration.
1628 PhaseSubagents,
1629 /// Metered verification pass (tests/checks) — distinct from `working`
1630 /// so checking reads differently from searching (ocean state model).
1631 PhaseVerifying,
1632 PhaseWaitingOnYou,
1633 PhaseDone,
1634 PhaseFailed,
1635 PhaseFinishing,
1636 // Underwater header chips: mode and permission words.
1637 ChipModeAct,
1638 ChipModePlan,
1639 ChipModeOperate,
1640 ChipPermissionReadOnly,
1641 ChipPermissionAsk,
1642 ChipPermissionAuto,
1643 ChipPermissionFullAccess,
1644 ChipPermissionNever,
1645 // Underwater footer right-hand hint words (keys stay literal in code).
1646 FooterHintKeys,
1647 FooterHintOutput,
1648 FooterHintContext,
1649 InfoLineHelp,
1650 InfoLineContext,
1651 InfoLineTtft,
1652 InfoLinePeak,
1653 InfoLineOffPeak,
1654 InfoLineWhales,
1655 InfoLineAutomation,
1656 InfoLineNotConnected,
1657 // Session metrics strip short labels (phase strip ledger and /status).
1658 SessionMetricsTurn,
1659 SessionMetricsTurns,
1660 SessionMetricsStep,
1661 SessionMetricsSteps,
1662 SessionMetricsLlm,
1663 SessionMetricsTools,
1664 SessionMetricsTtft,
1665 SessionMetricsTokensPerSecond,
1666 RuntimeStoreRecovered,
1667 ResumeExactSessionHint,
1668 ResumeSavedSessionHint,
1669 GoalProgressLabel,
1670 GoalProgressReceipt,
1671 GoalProgressNow,
1672 GoalProgressNext,
1673 CmdCacheUnpricedNote,
1674 SessionMetricsCache,
1675 SessionMetricsInput,
1676 SessionMetricsStatusLine,
1677 // `/status` report labels and runtime summaries.
1678 StatusLabelRoute,
1679 StatusLabelDirectory,
1680 StatusLabelProjectDocs,
1681 StatusLabelMode,
1682 StatusLabelSafety,
1683 StatusLabelMcp,
1684 StatusLabelFleet,
1685 StatusLabelContextWindow,
1686 StatusLabelWindowSource,
1687 StatusLabelWindowOverride,
1688 StatusLabelCatalog,
1689 StatusLabelCloudFacts,
1690 StatusLabelSession,
1691 StatusLabelSessionTokens,
1692 StatusLabelSessionCost,
1693 StatusLabelToolOutputs,
1694 StatusRouteSummary,
1695 StatusProjectDocsNone,
1696 StatusPostureSummary,
1697 StatusShellOn,
1698 StatusShellOff,
1699 StatusTrustedWorkspace,
1700 StatusWorkspace,
1701 StatusApprovalAsk,
1702 StatusApprovalAuto,
1703 StatusApprovalFullAccess,
1704 StatusApprovalNever,
1705 StatusMcpConfigured,
1706 StatusFleetDrifted,
1707 StatusContextUsage,
1708 StatusContextSourceConfigured,
1709 StatusContextSourceConfiguredModel,
1710 StatusContextSourceProviderReported,
1711 StatusContextSourceKimiSafeFloor,
1712 StatusContextSourceCatalog,
1713 StatusContextSourceModelHint,
1714 StatusContextSourceFallback,
1715 StatusWindowOverrideProvider,
1716 StatusWindowOverrideActiveProvider,
1717 StatusSessionNotSaved,
1718 StatusSessionSummary,
1719 StatusSessionTokensSummary,
1720 StatusCacheNotReported,
1721 StatusCacheSummary,
1722 StatusToolRawPressure,
1723 StatusToolCompactReceipts,
1724 StatusToolArtifacts,
1725 StatusToolNone,
1726 StatusSafetyReadOnlyUnenforced,
1727 StatusSafetyReadOnly,
1728 StatusSafetyWorkspaceWriteUnenforcedNetworkOn,
1729 StatusSafetyWorkspaceWriteUnenforcedNetworkOff,
1730 StatusSafetyWorkspaceWriteNetworkOn,
1731 StatusSafetyWorkspaceWriteNetworkOff,
1732 StatusSafetyDisabled,
1733 StatusSafetyDisabledSetuidBlocked,
1734 StatusSafetyDisabledSetuidAllowed,
1735 StatusSafetyExternal,
1736 StatusPointers,
1737 // Underwater post-launch empty state.
1738 EmptyStateNoGit,
1739 EmptyStateMcpLabel,
1740 EmptyStatePrompt,
1741 // Session picker surface.
1742 SessionsSurfaceTitle,
1743 SessionsPaneTitle,
1744 SessionsHistoryPaneTitle,
1745 SessionsActionResume,
1746 SessionsActionSearch,
1747 SessionsActionSort,
1748 SessionsActionRename,
1749 SessionsActionAllWorkspaces,
1750 SessionsActionDelete,
1751 SessionsActionClose,
1752 SessionsScopeSortHeader,
1753 SessionsEmptyTitle,
1754 SessionsEmptyHint,
1755 SessionsShowingAllWorkspaces,
1756 SessionsScopedToWorkspace,
1757 SessionsNewTitlePrompt,
1758 SessionsDeletePrompt,
1759 SessionsConfirmDelete,
1760 SessionsNewSessionTitle,
1761 SessionsOpenedHistory,
1762 SessionsSortStatus,
1763 SessionsSortRecent,
1764 SessionsSortName,
1765 SessionsSortSize,
1766 SessionsSearchPrompt,
1767 SessionsDeleteFailed,
1768 SessionsDeleted,
1769 SessionsNoSelection,
1770 SessionsTitleLength,
1771 SessionsOpenFailed,
1772 SessionsLoadFailed,
1773 SessionsResumed,
1774 SessionsRenameFailed,
1775 SessionsRenamed,
1776 SessionsRailTitle,
1777 SessionsRailEmpty,
1778 SessionsRailBrowseAll,
1779 SessionsRailShowingCount,
1780 SessionsRailUnavailable,
1781 SessionsActionArchive,
1782 SessionsActionShowArchived,
1783 SessionsArchived,
1784 SessionsRestored,
1785 SessionsArchiveFailed,
1786 SessionsShowingArchived,
1787 SessionsHidingArchived,
1788 SessionsArchivedCompact,
1789 SessionsNoResults,
1790 SessionsDirectoryFailed,
1791 SessionsPreviewFailed,
1792 SessionsDeleteCancelled,
1793 SessionsRenameCancelled,
1794 SessionsShowingRange,
1795 SessionsMessageCountCompact,
1796 SessionsForkCompact,
1797 SessionsCurrentCompact,
1798 SessionsUnknownMode,
1799 SessionsPreviewTitle,
1800 SessionsPreviewId,
1801 SessionsPreviewUpdated,
1802 SessionsPreviewMessagesModel,
1803 SessionsPreviewMode,
1804 SessionsToolCall,
1805 SessionsToolError,
1806 SessionsToolResult,
1807 SessionsServerTool,
1808 SessionsImage,
1809 SessionsTimeJustNow,
1810 SessionsTimeMinutesAgo,
1811 SessionsTimeHoursAgo,
1812 SessionsTimeDaysAgo,
1813 // Compact context inspector (Alt+C surface).
1814 CtxInspRowSystemPrompt,
1815 CtxInspRowMessages,
1816 CtxInspRowFree,
1817 CtxInspFreeTokensDetail,
1818 CtxInspDrillTitle,
1819 CtxInspSurfaceTitle,
1820 CtxInspActionSelect,
1821 CtxInspActionDrillDown,
1822 CtxInspActionClose,
1823 CtxInspUsedTokens,
1824 CtxInspAutoCompactAt,
1825 CtxInspRowTokens,
1826 CtxInspRowCompaction,
1827 CtxInspRowAnchors,
1828 CtxInspCompactionNever,
1829 CtxInspCompactionDetail,
1830 CtxInspCompactionRestored,
1831 CtxInspCompactionPathSummary,
1832 CtxInspCompactionPathPrune,
1833 CtxInspCompactionAssistantKept,
1834 CtxInspAnchorsNone,
1835 CtxInspAnchorsPresent,
1836 // Model picker route surface.
1837 RouteSurfaceTitle,
1838 RouteBrowseCatalog,
1839 RouteActionType,
1840 RouteActionSearchAnyModel,
1841 RoutePanelHeader,
1842 RouteProviderLabel,
1843 RouteModelFirstAtomic,
1844 PickerActionMove,
1845 PickerActionSwitch,
1846 PickerActionApply,
1847 PickerActionAssignRoute,
1848 FleetRoutePickUnavailable,
1849 FleetRouteSaved,
1850 FleetRouteInherited,
1851 FleetRouteNotInCatalog,
1852 PickerActionSetStartupDefault,
1853 PickerActionPin,
1854 PickerActionFleet,
1855 PickerActionCancel,
1856 PickerActionClear,
1857 PickerActionClearSearch,
1858 PickerActionBrowseAll,
1859 PickerActionCustom,
1860 PickerActionJump,
1861 PickerActionEditKey,
1862 PickerActionModels,
1863 PickerActionUnavailable,
1864 PickerActionSetKey,
1865 PickerActionConfigured,
1866 RouteNoModels,
1867 RouteNoModelMatch,
1868 ProviderNoMatchesTitle,
1869 ProviderNoMatchesHint,
1870 ProviderNoConfiguredTitle,
1871 ProviderNoConfiguredHint,
1872 ProviderNoCatalogModels,
1873 // Provider picker — informed external-credential consent.
1874 ProviderExternalActionRevoke,
1875 ProviderExternalActionChoices,
1876 ProviderExternalActionReuseGrok,
1877 ProviderExternalHintCodexReview,
1878 ProviderExternalHintXaiReview,
1879 ProviderExternalHintXaiApiKey,
1880 XaiAuthChoiceTitle,
1881 XaiAuthChoiceIntro,
1882 XaiAuthChoiceApiKeyOption,
1883 XaiAuthChoiceDeviceOAuthOption,
1884 ChatgptAuthChoiceTitle,
1885 ChatgptAuthChoiceIntro,
1886 ChatgptAuthChoicePkceOption,
1887 ChatgptAuthChoiceImportOption,
1888 ProviderExternalHintChatgptReview,
1889 ProviderExternalActionReuseCodex,
1890 ProviderExternalDetailScope,
1891 ProviderExternalDormant,
1892 ProviderExternalOwnerPath,
1893 ProviderExternalPinnedPathWarning,
1894 ToolProjectionWarning,
1895 SnapshotsDisabledTooLarge,
1896 SnapshotsDisabledTooManyFiles,
1897 SnapshotsDisabledUnsafeLocation,
1898 SessionIdDivergedNotice,
1899 RuntimeStoreUnreadableNotice,
1900 RuntimeStoreUnwritableNotice,
1901 ProviderExternalSemanticsRevoke,
1902 ProviderExternalRevoke,
1903 ProviderExternalChoiceTitle,
1904 ProviderExternalActionChoose,
1905 ProviderExternalChoiceIntro,
1906 ProviderExternalDisabledLabel,
1907 ProviderExternalDisabledDetail,
1908 ProviderExternalReadOnlyLabel,
1909 ProviderExternalReadOnlyDetail,
1910 ProviderExternalReadOnlySemantics,
1911 ProviderExternalManagedLabel,
1912 ProviderExternalManagedDetail,
1913 ProviderExternalConfirmTitle,
1914 ProviderExternalActionGrant,
1915 ProviderExternalOwnerLabel,
1916 ProviderExternalExactPathLabel,
1917 ProviderExternalSemanticsLabel,
1918 ProviderExternalRejectUnsafe,
1919 ProviderExternalRevokeLabel,
1920 ProviderExternalRouteLabel,
1921 ProviderExternalCustodyLine,
1922 ProviderExternalBillingLine,
1923 ProviderExternalRevokeScope,
1924 ProviderExternalOwnerOnly,
1925 ProviderExternalPinnedPathChanged,
1926 ProviderExternalRevokeConfirmTitle,
1927 ProviderExternalGrantedToast,
1928 ProviderExternalSaveFailedToast,
1929 ProviderExternalRevokedToast,
1930 ProviderExternalRevokeFailedToast,
1931 // Theme picker surface.
1932 ThemeSurfaceTitle,
1933 // Fleet roster room.
1934 FleetRosterHeaderLabel,
1935 FleetRosterTabRoster,
1936 FleetRosterTabSetup,
1937 FleetRosterWorkers,
1938 FleetRosterMembersCount,
1939 FleetRosterOperatorFirst,
1940 FleetRosterOperatorRow,
1941 /// Roster row badge when a project file is winning the same id.
1942 FleetRosterShadowBadgeProjectOverride,
1943 /// Roster row badge when a personal file exists but is ignored.
1944 FleetRosterShadowBadgePersonalIgnored,
1945 /// Roster row badge when a personal file is winning the same id.
1946 FleetRosterShadowBadgePersonalOverride,
1947 /// Roster row badge when `[fleet.profiles]` is winning the same id.
1948 FleetRosterShadowBadgeConfigOverride,
1949 /// Detail-pane heading for the full per-id layer stack.
1950 FleetRosterLayersLabel,
1951 /// Marker on the winning layer in the detail stack.
1952 FleetRosterLayerWins,
1953 /// Marker on a displaced layer in the detail stack.
1954 FleetRosterLayerIgnored,
1955 FleetReadyNotice,
1956 /// Sticky error when Fleet profile save cannot prove collision safety.
1957 FleetProfileIdentityVerifyFailed,
1958 /// Sticky error when the drafted profile id collides with another file.
1959 FleetProfileIdConflict,
1960 /// Sticky error when the drafted profile pins an unconfigured provider.
1961 FleetProfileProviderUnconfigured,
1962 // The fleet as models: `/fleet models|add|remove`, the picker's ⇧F, and
1963 // the fleet lines of `/models` (design MODEL-ROUTING-CATALOG §10 F1).
1964 FleetModelAdded,
1965 FleetModelAddedAs,
1966 FleetModelAddedCreatedNote,
1967 FleetModelAddedSelectedNote,
1968 FleetModelRemoved,
1969 FleetModelRemovedRoles,
1970 FleetModelUnchanged,
1971 FleetModelReasonOperatorRoute,
1972 FleetModelReasonAlreadyPresent,
1973 FleetModelErrorNeedsRoute,
1974 FleetModelErrorNeedsRole,
1975 FleetModelErrorNoSelection,
1976 FleetModelErrorOperatorRoute,
1977 FleetModelErrorNotInFleet,
1978 FleetModelsEmpty,
1979 FleetModelsHeader,
1980 FleetModelsBroken,
1981 FleetModelsFooter,
1982 FleetModelsFactPrice,
1983 FleetModelsFactContext,
1984 FleetModelsFactTools,
1985 FleetAddUsage,
1986 FleetAddProviderUnconfigured,
1987 FleetAddModelNotServed,
1988 FleetAddFailed,
1989 FleetRemoveUsage,
1990 FleetRemoveFailed,
1991 FleetToggleFailed,
1992 // Fleet setup destination step and review actions (save-scope redesign).
1993 FleetDestStepTitle,
1994 FleetDestStepSubtitle,
1995 FleetDestProjectLabel,
1996 FleetDestPersonalLabel,
1997 FleetDestProjectSummary,
1998 FleetDestPersonalSummary,
1999 FleetDestProjectDescription,
2000 FleetDestPersonalDescription,
2001 FleetDestPathLine,
2002 FleetDestUnavailable,
2003 FleetDestReasonNoProjectConfig,
2004 FleetDestReasonWorkspaceMissing,
2005 FleetDestReasonHomeUnavailable,
2006 FleetDestWillReplace,
2007 FleetDestOverridesProject,
2008 FleetDestOverridesPersonal,
2009 FleetDestOverridesBuiltIn,
2010 FleetSavesToChip,
2011 FleetSavesToUndecided,
2012 FleetActionSaveProject,
2013 FleetActionSavePersonal,
2014 FleetActionReplaceProject,
2015 FleetActionReplacePersonal,
2016 FleetActionConfirmReplace,
2017 FleetActionChangeDestination,
2018 FleetActionBack,
2019 FleetReviewSavesTo,
2020 FleetModelRowBlockedNotice,
2021 FleetDestProjectDisabledSave,
2022 // Workflow panel.
2023 WorkflowStatusWaiting,
2024 WorkflowStatusDegraded,
2025 WorkflowRunFailedToast,
2026 WorkflowDebrief,
2027 WorkflowDispatchFailureLine,
2028 WorkflowDispatchFailuresOmitted,
2029 WorkflowDispatchFallbackTask,
2030 WorkflowTranscriptDetails,
2031 WorkflowReceiptRole,
2032 WorkflowReceiptReasoning,
2033 WorkflowReceiptVia,
2034 WorkflowReceiptTokens,
2035 WorkflowReceiptTools,
2036 WorkflowReceiptDuration,
2037 WorkflowReceiptUnknown,
2038 WorkflowReceiptProviderReported,
2039 WorkflowReceiptEstimated,
2040 // Sidebar work strip.
2041 SidebarTasksLabel,
2042 TaskOwnershipUnverified,
2043 TaskInventoryUnavailable,
2044 SidebarTodoLabel,
2045 SidebarStopControl,
2046 SidebarDestructiveArmed,
2047 WorkSurfaceTodoProgress,
2048 WorkSurfaceStopConfirmHint,
2049 CoordinationWorkTitle,
2050 CoordinationSummaryDecisions,
2051 CoordinationSummaryContentions,
2052 CoordinationSummaryReconciled,
2053 CoordinationSchema,
2054 CoordinationSequence,
2055 CoordinationPerSectionLimit,
2056 CoordinationDecisionsHeading,
2057 CoordinationNone,
2058 CoordinationNoneValue,
2059 CoordinationStatus,
2060 CoordinationOwner,
2061 CoordinationVersion,
2062 CoordinationWriteClaimsHeading,
2063 CoordinationIsolated,
2064 CoordinationSharedWorkspace,
2065 CoordinationPaths,
2066 CoordinationContracts,
2067 CoordinationContentionsHeading,
2068 CoordinationClaimant,
2069 CoordinationDisposition,
2070 CoordinationNeutralReconciliationHeading,
2071 CoordinationCandidates,
2072 CoordinationRetry,
2073 CoordinationReviewer,
2074 CoordinationVerifier,
2075 CoordinationVerification,
2076 CoordinationContextProjectionsHeading,
2077 CoordinationContextDecisions,
2078 CoordinationBytes,
2079 CoordinationDeduplicated,
2080 CoordinationOmitted,
2081 CoordinationActiveHotPathsHeading,
2082 CoordinationActiveClaims,
2083 CoordinationMetricsNoteHeading,
2084 CoordinationMetricsNoAuthoritativeSource,
2085 CoordinationStatusProposed,
2086 CoordinationStatusAccepted,
2087 CoordinationStatusSuperseded,
2088 // Composer slash menu.
2089 ComposerSlashMenuHint,
2090 // Approval modal — repository law band.
2091 ApprovalRepoLawBadge,
2092 ApprovalRepoLawTitle,
2093 ApprovalRepoLawWarning,
2094 ApprovalRepoLawRuleLabel,
2095 // Fuzzy file picker (@ attach overlay).
2096 FilePickerMatchSingular,
2097 FilePickerMatchesPlural,
2098 FilePickerScanning,
2099 // Quiet action-triggered product guidance.
2100 BehavioralTipPlanning,
2101 BehavioralTipBackgroundReceipt,
2102 BehavioralTipClearedInput,
2103 BehavioralTipMcpValidation,
2104 BehavioralTipRepeatedCommand,
2105 BehavioralTipDurableStateWritten,
2106 BehavioralTipTodoWrite,
2107 ConfigLabelContextualTips,
2108 ConfigHintContextualTips,
2109 ContextualTipsNotSaved,
2110 // Live-route settings lock (#2982): refusals and startup-default receipts.
2111 SettingLockedDuringTurn,
2112 SettingSubjectMode,
2113 SettingSubjectThinking,
2114 SettingSubjectModel,
2115 SettingSubjectModelAndThinking,
2116 SettingSubjectProvider,
2117 SettingSubjectPermissions,
2118 ThinkingControlledByAutoRouting,
2119 SavedAsStartupDefault,
2120 ModeAlreadyActiveSavedAsDefault,
2121 StartupDefaultNotSaved,
2122 StartupDefaultSubjectMode,
2123 StartupDefaultSubjectThinking,
2124 StartupDefaultSubjectModel,
2125 StartupDefaultSubjectAll,
2126 // Durable scheduled automation operator receipts.
2127 AutomationUsage,
2128 AutomationManagerUnavailable,
2129 AutomationListFailed,
2130 AutomationActionFailed,
2131 AutomationEmpty,
2132 AutomationListHeading,
2133 AutomationScopeNote,
2134 AutomationNoun,
2135 AutomationStatusLabel,
2136 AutomationStatusActive,
2137 AutomationStatusPaused,
2138 AutomationRunStatusQueued,
2139 AutomationRunStatusRunning,
2140 AutomationRunStatusCompleted,
2141 AutomationRunStatusFailed,
2142 AutomationRunStatusCanceled,
2143 AutomationActionInspect,
2144 AutomationActionPause,
2145 AutomationActionResume,
2146 AutomationActionDelete,
2147 AutomationActionRun,
2148 AutomationActionCancel,
2149 AutomationActionPaused,
2150 AutomationActionResumed,
2151 AutomationNextLabel,
2152 AutomationNameLabel,
2153 AutomationEditorNew,
2154 AutomationEditorEdit,
2155 AutomationEditorSchedule,
2156 AutomationEditorDaily,
2157 AutomationEditorWeekly,
2158 AutomationEditorHourly,
2159 AutomationEditorOnce,
2160 AutomationEditorCustom,
2161 AutomationEditorTime,
2162 AutomationEditorDate,
2163 AutomationEditorDays,
2164 AutomationEditorLocalTime,
2165 AutomationEditorProvider,
2166 AutomationEditorDefaultModel,
2167 AutomationEditorInheritedProvider,
2168 AutomationEditorEnabled,
2169 AutomationEditorControls,
2170 AutomationEditorPromptControls,
2171 AutomationEditorSaveFailed,
2172 AutomationEditorBusy,
2173 AutomationEditorSaved,
2174 AutomationEditorPreviewUnavailable,
2175 AutomationEditorConflict,
2176 AutomationEditorInvalidWorkspace,
2177 AutomationEditorModelControls,
2178 AutomationEditorPausedPreview,
2179 AutomationEditorInvalidSchedule,
2180 AutomationEditorMonday,
2181 AutomationEditorTuesday,
2182 AutomationEditorWednesday,
2183 AutomationEditorThursday,
2184 AutomationEditorFriday,
2185 AutomationEditorSaturday,
2186 AutomationEditorSunday,
2187 AutomationPromptLabel,
2188 AutomationCwdLabel,
2189 AutomationModeLabel,
2190 AutomationAllowShellLabel,
2191 AutomationTrustModeLabel,
2192 AutomationAutoApproveLabel,
2193 AutomationRruleLabel,
2194 AutomationDeliveryLabel,
2195 AutomationLastLabel,
2196 AutomationRecentRunsLabel,
2197 AutomationNoRuns,
2198 AutomationRunsUnavailable,
2199 AutomationTaskLabel,
2200 AutomationDeletePreview,
2201 AutomationDeleteConfirmationStale,
2202 // Activity-band slot and typed receipt cards (AUTOMATION-VISIBILITY §2).
2203 AutomationBandScheduled,
2204 AutomationReceiptFired,
2205 AutomationReceiptStarted,
2206 AutomationReceiptCompleted,
2207 AutomationReceiptCoalesced,
2208 AutomationReceiptMissed,
2209 AutomationReceiptExpired,
2210 AutomationReceiptDeleted,
2211 AutomationRunLabel,
2212 AutomationDeletedRunsDetail,
2213 /// Whale Teams state words, species, and jobs (crates/tui/src/tui/whales.rs).
2214 WhaleStateResting,
2215 WhaleStateThinking,
2216 WhaleStateWorking,
2217 WhaleStateWaiting,
2218 WhaleStateBlocked,
2219 WhaleStateOffline,
2220 /// Parked-child status word and its recovery line (#5906). A child parked
2221 /// at the parent's turn end is not "waiting for input": nothing will
2222 /// answer it, so the surfaces name the state and the two ways out.
2223 AgentStatusParked,
2224 AgentStatusParkedRecovery,
2225 WhaleAnimalScout,
2226 WhaleAnimalPatch,
2227 WhaleAnimalHarbor,
2228 WhaleAnimalEcho,
2229 WhaleAnimalKeel,
2230 WhaleAnimalLantern,
2231 WhaleAnimalPlain,
2232 WhaleJobScout,
2233 WhaleJobPatch,
2234 WhaleJobHarbor,
2235 WhaleJobEcho,
2236 WhaleJobKeel,
2237 WhaleJobLantern,
2238 WhaleJobPlain,
2239 AgentFocusOpened,
2240 AgentFocusClosed,
2241 AgentFocusBanner,
2242 AgentFocusPosture,
2243 AgentFocusPostureWrites,
2244 AgentFocusPostureReadOnly,
2245 AgentFocusPostureNetwork,
2246 AgentFocusPostureNoNetwork,
2247 AgentFocusPostureShellFull,
2248 AgentFocusPostureShellReadOnly,
2249 AgentFocusPostureShellNone,
2250 AgentFocusComposerChip,
2251 AgentFocusPlaceholder,
2252 AgentFocusNoTranscript,
2253 AgentFocusOmitted,
2254 AgentFocusFollowUpDelivered,
2255 AgentFocusFollowUpQueued,
2256 AgentFocusFollowUpContinued,
2257 AgentFocusFollowUpFailed,
2258 FooterHintForAgents,
2259 FooterHintToManage,
2260 AgentRailQueuedCount,
2261 PickerActionTestConnection,
2262 ProviderCustomFormBaseUrl,
2263 ProviderCustomFormModel,
2264 ProviderCustomFormHint,
2265 ProviderConnectionChecked,
2266 ProviderConnectionCheckedPickModel,
2267 ProviderTestConnectionNeedKey,
2268 ProviderTestConnectionFailed,
2269 ProviderTestConnectionNoEndpoint,
2270 ComposerPlaceholderFollowUp,
2271 ComposerPlaceholderSendNow,
2272 ComposerHintSendWithQueue,
2273 ComposerHintQueue,
2274 ComposerHintQueueWithCount,
2275 ComposerHintOfflineQueue,
2276 ComposerHintOfflineConnect,
2277 ComposerHintSendNow,
2278 ComposerHintSendIntoTurn,
2279 PendingSendingIntoTurnPrefix,
2280 PendingCouldNotSendIntoTurnPrefix,
2281 PendingEditingFollowUpPrefix,
2282 PendingQueuedOnePrefix,
2283 PendingQueuedManyPrefix,
2284 PendingSendNowControls,
2285 PendingSendNowDropControls,
2286 PendingEscRestore,
2287 PendingQueuedFollowUpPrefix,
2288 PendingInputsHeader,
2289 PendingContextHeader,
2290 ToastQueuedFollowUp,
2291 ToastQueuedFollowUpCount,
2292 ToastQueuedOffline,
2293 ToastSentIntoTurn,
2294 ToastCouldNotSendIntoTurn,
2295 ToastHookBlockedFollowUp,
2296 ToastOfflineQueuedCount,
2297 // Operate plan board chrome (contract tokens stay untranslated).
2298 OperateBoardHeader,
2299 OperateBoardBurnObserved,
2300 OperateBoardBurnNoCap,
2301 OperateBoardDirectionEmpty,
2302 OperateBoardDirectionLine,
2303 OperateBoardPlanMissing,
2304 OperateBoardPlanHeader,
2305 OperateBoardGantt,
2306 // Tideline settings shell: categories, detail facts, sources, apply
2307 // semantics, editor kinds, and navigation copy.
2308 ConfigCategoryAppearance,
2309 ConfigCategoryModelsProviders,
2310 ConfigCategoryFleet,
2311 ConfigCategoryWork,
2312 ConfigCategoryToolsMcp,
2313 ConfigCategoryTrust,
2314 ConfigCategoryMotion,
2315 ConfigCategoryAdvanced,
2316 ConfigFactCurrent,
2317 ConfigFactSaved,
2318 ConfigFactStartup,
2319 ConfigFactSource,
2320 ConfigFactScope,
2321 ConfigFactApply,
2322 ConfigFactKind,
2323 ConfigFactAvailable,
2324 ConfigFactObserved,
2325 ConfigFactOpens,
2326 ConfigLaneUnobserved,
2327 ConfigSourceSession,
2328 ConfigSourceUserSettings,
2329 ConfigSourceConfig,
2330 ConfigSourceManaged,
2331 ConfigApplyEffectiveNow,
2332 ConfigApplyOnSave,
2333 ConfigApplyNextSession,
2334 ConfigApplyRestart,
2335 ConfigApplyReadOnly,
2336 ConfigApplyReload,
2337 ConfigApplyUiNowEngineRestart,
2338 ConfigKindToggle,
2339 ConfigKindChoice,
2340 ConfigKindNumber,
2341 ConfigKindText,
2342 ConfigKindAction,
2343 ConfigKindReadOnly,
2344 ConfigRowActionNote,
2345 ConfigRowDiagnosticNote,
2346 ConfigNavHint,
2347 ConfigActivateAgain,
2348 ConfigSearchLabel,
2349 ConfigEditChooseLabel,
2350 ConfigChoiceFooter,
2351 ConfigChoiceFooterCompact,
2352 ConfigEditorApply,
2353 ConfigEditorCancel,
2354 ConfigLaneUnavailable,
2355 ConfigSourceEnvironment,
2356 ConfigSourceTerminal,
2357 ConfigDescriptionDefault,
2358 ConfigValueOn,
2359 ConfigValueOff,
2360 ConfigValueProviderDefault,
2361 ConfigChoiceAsk,
2362 ConfigChoiceAutoReview,
2363 ConfigChoiceUseTuiDefault,
2364 ConfigChoiceFullAccess,
2365 ConfigChoiceNever,
2366 ConfigChoiceModeAct,
2367 ConfigChoiceModePlan,
2368 ConfigChoiceModeOperate,
2369 ConfigChoicePlacementTop,
2370 ConfigChoicePlacementBottom,
2371 ConfigChoicePlacementLeft,
2372 ConfigChoicePlacementRight,
2373 ConfigChoiceRailTasks,
2374 ConfigChoiceRailAgents,
2375 ConfigChoiceRailContext,
2376 ConfigChoiceStatusCw,
2377 ConfigChoiceStatusDots,
2378 ConfigChoiceDiffFull,
2379 ConfigChoiceDiffSummary,
2380 ConfigChoiceDetailAsk,
2381 ConfigChoiceDetailAutoReview,
2382 ConfigChoiceDetailUseTuiDefault,
2383 ConfigChoiceDetailFullAccess,
2384 ConfigChoiceDetailNever,
2385 ConfigChoiceDetailModeAgent,
2386 ConfigChoiceDetailModePlan,
2387 ConfigChoiceDetailModeOperate,
2388 ConfigChoiceDetailPlacementTop,
2389 ConfigChoiceDetailPlacementBottom,
2390 ConfigChoiceDetailPlacementLeft,
2391 ConfigChoiceDetailPlacementRight,
2392 ConfigChoiceDetailPlacementOff,
2393 ConfigChoiceDetailRailTasks,
2394 ConfigChoiceDetailRailAgents,
2395 ConfigChoiceDetailRailContext,
2396 ConfigChoiceDetailLowMotionOn,
2397 ConfigChoiceDetailLowMotionOff,
2398 ConfigChoiceDetailFancyOn,
2399 ConfigChoiceDetailFancyOff,
2400 ConfigChoiceDetailShowThinkingOn,
2401 ConfigChoiceDetailShowThinkingOff,
2402 ConfigChoiceDetailThinkingHighlightOn,
2403 ConfigChoiceDetailThinkingHighlightOff,
2404 ConfigHintModel,
2405 ConfigHintFastModel,
2406 ConfigHintProvider,
2407 ConfigHintApprovalMode,
2408 ConfigHintPermissionPosture,
2409 ConfigHintApprovalPolicy,
2410 ConfigHintManagedApprovalPolicy,
2411 ConfigHintManagedAllowShell,
2412 ConfigHintAllowShell,
2413 ConfigHintComposerMultilineMode,
2414 ConfigHintBooleanValues,
2415 ConfigHintDensity,
2416 ConfigHintInlineDiffs,
2417 ConfigHintToolCollapse,
2418 ConfigHintBackgroundColor,
2419 ConfigHintWorkSurfacePlacement,
2420 ConfigHintRailPanel,
2421 ConfigHintWorkSurfaceTopHeight,
2422 ConfigHintWorkSurfaceSideWidth,
2423 ConfigHintBaseUrl,
2424 ConfigHintContextWindow,
2425 ConfigHintEffectiveContextWindow,
2426 ConfigHintCostCurrency,
2427 ConfigHintCalmMode,
2428 ConfigHintLowMotion,
2429 ConfigHintFancyAnimations,
2430 ConfigHintShowThinking,
2431 ConfigHintThinkingDefaultExpanded,
2432 ConfigHintThinkingPreviewLines,
2433 ConfigHintHelpExpandGroups,
2434 ConfigHintPinLastPrompt,
2435 ConfigHintThinkingHighlight,
2436 ConfigHintSynchronizedOutput,
2437 ConfigHintDefaultMode,
2438 ConfigHintMaxHistory,
2439 ConfigHintAutoCompactThreshold,
2440 ConfigHintDefaultModel,
2441 ConfigHintReasoningEffort,
2442 ConfigHintMcpOpen,
2443 ConfigHintMcpReconnect,
2444 ConfigHintMcpDiagnose,
2445 ConfigHintPluginsOpen,
2446 ConfigHintMcpConfigPath,
2447 ConfigHintFleetMaxSpawnDepth,
2448 ConfigHintFeatureSubagents,
2449 ConfigHintFeatureWebSearch,
2450 ConfigHintFeatureApplyPatch,
2451 ConfigHintFeatureMcp,
2452 ConfigHintFeatureExecPolicy,
2453 ConfigHintFeatureVisionModel,
2454 ConfigHintGoalCommand,
2455 ConfigHintWorkflow,
2456 SelectionCopiedAsMarkdown,
2457 McpShowCachedWhileTurnRuns,
2458 McpShowUnavailableWhileTurnRuns,
2459 McpLivePoolRefreshDeferredWhileTurnRuns,
2460 McpRetryDeferredWhileTurnRuns,
2461 }
2462
2463 #[allow(dead_code)]
2464 pub const ALL_MESSAGE_IDS: &[MessageId] = &[
2465 MessageId::SessionArchiveExported,
2466 MessageId::SessionArchiveSizes,
2467 MessageId::SessionArchiveNoArtifacts,
2468 MessageId::SessionArchiveRestoreHint,
2469 MessageId::CostReasonNotMoney,
2470 MessageId::CostReasonBillingUnknown,
2471 MessageId::CostReasonEndpointUnknown,
2472 MessageId::CostReasonRateMissing,
2473 MessageId::CostReasonLiveUnverified,
2474 MessageId::CostReasonRetiredAlias,
2475 MessageId::CostReasonTierMissing,
2476 MessageId::CostReasonRoutingDependent,
2477 MessageId::CostReasonCoverageMissing,
2478 MessageId::CostReasonTokenRateMissing,
2479 MessageId::CostReasonInvalidRate,
2480 MessageId::CostReasonCurrencyMissing,
2481 MessageId::CostReasonUsageConflict,
2482 MessageId::CostChipUnknown,
2483 MessageId::CostChipSubtotal,
2484 MessageId::CostChipSavedSubtotal,
2485 MessageId::CostChipLocal,
2486 MessageId::CostChipAllowance,
2487 MessageId::CostChipAllowancePercent,
2488 MessageId::McpLoginInProgress,
2489 MessageId::McpLoginStarting,
2490 MessageId::McpLoginBrowser,
2491 MessageId::McpLoginStored,
2492 MessageId::McpLoginFailed,
2493 MessageId::McpReloadAlreadyRunning,
2494 MessageId::McpLoginCancelled,
2495 MessageId::McpLoginHandshakeTimeout,
2496 MessageId::McpLoginServerNotFound,
2497 MessageId::McpDiagnosisUnobserved,
2498 MessageId::McpDiagnosisSummary,
2499 MessageId::McpDiagnosisLastError,
2500 MessageId::McpDiagnosisNext,
2501 MessageId::McpStateDisabled,
2502 MessageId::McpStateAuthorizationRequired,
2503 MessageId::McpStateConnecting,
2504 MessageId::McpStateFailed,
2505 MessageId::McpStateDisconnected,
2506 MessageId::ComposerPlaceholder,
2507 MessageId::ComposerDispatchFailedRestored,
2508 MessageId::DispatchFailedQueued,
2509 MessageId::DispatchFailedInitial,
2510 MessageId::HistorySearchPlaceholder,
2511 MessageId::HistorySearchTitle,
2512 MessageId::HistoryHintMove,
2513 MessageId::HistoryHintAccept,
2514 MessageId::HistoryHintRestore,
2515 MessageId::HistoryNoMatches,
2516 MessageId::TranscriptReasoningExpand,
2517 MessageId::ScreenModeFullscreenNotice,
2518 MessageId::ScreenModeInlineNotice,
2519 MessageId::ScreenModeMouseCaptureOn,
2520 MessageId::ScreenModeMouseCaptureOff,
2521 MessageId::ScreenModeUnchanged,
2522 MessageId::ImageInputRejectedResent,
2523 MessageId::ProviderToolCallMissing,
2524 MessageId::TelemetryNoticeDefaultOn,
2525 MessageId::TelemetryNoticeHeadline,
2526 MessageId::TelemetryNoticeBody,
2527 MessageId::TelemetryNoticeCompactBody,
2528 MessageId::TelemetryNoticeChoiceKeep,
2529 MessageId::TelemetryNoticeChoiceDisable,
2530 MessageId::TelemetryNoticeActionChoose,
2531 MessageId::TelemetryNoticeActionConfirm,
2532 MessageId::TelemetryNoticeActionExit,
2533 MessageId::TelemetryNoticeReceiptEnabled,
2534 MessageId::TelemetryNoticeReceiptDisabled,
2535 MessageId::TelemetryNoticeReceiptEnabledUnsaved,
2536 MessageId::TelemetryNoticeReceiptDisabledUnsaved,
2537 MessageId::TelemetryPreferenceEnabledNextLaunch,
2538 MessageId::TelemetryPreferenceDisabled,
2539 MessageId::TelemetryPreferenceDisabledWithWarning,
2540 MessageId::TelemetryPreferenceDisabledForSession,
2541 MessageId::TelemetryPreferenceSaveFailed,
2542 MessageId::StatusPickerTitle,
2543 MessageId::StatusPickerInstruction,
2544 MessageId::StatusPickerActionToggle,
2545 MessageId::StatusPickerActionAll,
2546 MessageId::StatusPickerActionNone,
2547 MessageId::StatusPickerActionSave,
2548 MessageId::StatusPickerActionCancel,
2549 MessageId::HotbarSetupTitle,
2550 MessageId::HotbarSetupSourceApp,
2551 MessageId::HotbarSetupSourceSlash,
2552 MessageId::HotbarSetupSourceMcp,
2553 MessageId::HotbarSetupSourceSkill,
2554 MessageId::HotbarSetupSourcePlugin,
2555 MessageId::HotbarSetupStatusDisabled,
2556 MessageId::HotbarSetupStatusPrefill,
2557 MessageId::HotbarSetupStatusReady,
2558 MessageId::HotbarSetupDirtyModified,
2559 MessageId::HotbarSetupDirtyClean,
2560 MessageId::HotbarSetupNoAction,
2561 MessageId::HotbarSetupConfirmDisable,
2562 MessageId::HotbarSetupStatusLine,
2563 MessageId::HotbarSetupSlotOutOfRange,
2564 MessageId::HotbarSetupNoActionSelected,
2565 MessageId::HotbarSetupCannotAssign,
2566 MessageId::HotbarSetupNoActions,
2567 MessageId::HotbarSetupRecommended,
2568 MessageId::HotbarSetupEmptySlot,
2569 MessageId::HotbarSetupHelp,
2570 MessageId::HotbarActionVoiceToggleName,
2571 MessageId::HotbarActionVoiceToggleDescription,
2572 MessageId::HotbarActionSessionCompactName,
2573 MessageId::HotbarActionSessionCompactDescription,
2574 MessageId::HotbarActionModePlanName,
2575 MessageId::HotbarActionModePlanDescription,
2576 MessageId::HotbarActionModeAgentName,
2577 MessageId::HotbarActionModeAgentDescription,
2578 MessageId::HotbarActionModeYoloName,
2579 MessageId::HotbarActionModeYoloDescription,
2580 MessageId::HotbarActionModeOperateName,
2581 MessageId::HotbarActionModeOperateDescription,
2582 MessageId::HotbarActionReasoningCycleName,
2583 MessageId::HotbarActionReasoningCycleDescription,
2584 MessageId::HotbarActionReasoningCycleAutoDisabled,
2585 MessageId::HotbarActionSidebarToggleName,
2586 MessageId::HotbarActionSidebarToggleDescription,
2587 MessageId::HotbarActionFileTreeToggleName,
2588 MessageId::HotbarActionFileTreeToggleDescription,
2589 MessageId::HotbarActionPaletteOpenName,
2590 MessageId::HotbarActionPaletteOpenDescription,
2591 MessageId::HotbarActionTrustToggleName,
2592 MessageId::HotbarActionTrustToggleDescription,
2593 MessageId::CommandPaletteTitle,
2594 MessageId::CommandPaletteSubtitle,
2595 MessageId::ConfigTitle,
2596 MessageId::ConfigPreviewLabel,
2597 MessageId::ConfigHintExternalCredentials,
2598 MessageId::ConfigSubtitle,
2599 MessageId::ConfigModalTitle,
2600 MessageId::ConfigSearchPlaceholder,
2601 MessageId::ConfigNoSettings,
2602 MessageId::ConfigNoMatchesPrefix,
2603 MessageId::ConfigFilteredSettings,
2604 MessageId::ConfigShowing,
2605 MessageId::ConfigFooterDefault,
2606 MessageId::ConfigFooterScrollable,
2607 MessageId::ConfigFooterFiltered,
2608 MessageId::ConfigSectionProvider,
2609 MessageId::ConfigSectionModel,
2610 MessageId::ConfigSectionPermissions,
2611 MessageId::ConfigSectionNetwork,
2612 MessageId::ConfigSectionDisplay,
2613 MessageId::ConfigSectionComposer,
2614 MessageId::ConfigSectionSidebar,
2615 MessageId::ConfigSectionHistory,
2616 MessageId::ConfigSectionMcp,
2617 MessageId::ConfigSectionFleet,
2618 MessageId::ConfigSectionWorkflow,
2619 MessageId::ConfigSectionSession,
2620 MessageId::ConfigSectionLegacy,
2621 MessageId::ConfigSectionExperimental,
2622 MessageId::ConfigScopeSession,
2623 MessageId::ConfigScopeSaved,
2624 MessageId::ConfigCommandSource,
2625 MessageId::ConfigCommandInvalidValue,
2626 MessageId::ConfigSearchUpdated,
2627 MessageId::ConfigPromptSuggestionUpdated,
2628 MessageId::ConfigLabelNotificationQuiet,
2629 MessageId::ConfigLabelNotificationSound,
2630 MessageId::ConfigLabelNotificationCondition,
2631 MessageId::ConfigLabelNotificationMethod,
2632 MessageId::ConfigLabelNotificationThreshold,
2633 MessageId::ConfigLabelNotificationSummary,
2634 MessageId::ConfigLabelNotificationSubagents,
2635 MessageId::ConfigLabelNotificationTurnComplete,
2636 MessageId::ConfigLabelNotificationSubagentTerminal,
2637 MessageId::ConfigLabelNotificationApprovalNeeded,
2638 MessageId::ConfigLabelNotificationInputNeeded,
2639 MessageId::ConfigLabelNotificationElevationNeeded,
2640 MessageId::ConfigLabelNotificationModelNotify,
2641 MessageId::ConfigLabelNotificationCompletionSound,
2642 MessageId::ConfigLabelNotificationSoundFile,
2643 MessageId::ConfigLabelNotificationEventSoundEnabled,
2644 MessageId::ConfigLabelNotificationEventSoundEvents,
2645 MessageId::ConfigLabelNotificationEventSoundInterval,
2646 MessageId::ConfigLabelNotificationEventSoundQuiet,
2647 MessageId::ConfigHintNotificationPolicy,
2648 MessageId::ConfigHintNotificationSound,
2649 MessageId::ConfigHintNotificationLegacy,
2650 MessageId::ConfigChoiceNotificationWhale,
2651 MessageId::ConfigChoiceNotificationLegacy,
2652 MessageId::ConfigChoiceNotificationAlways,
2653 MessageId::ConfigChoiceNotificationUnfocused,
2654 MessageId::ConfigChoiceNotificationNever,
2655 MessageId::ConfigChoiceNotificationFile,
2656 MessageId::ConfigChoiceNotificationBell,
2657 MessageId::ConfigNotificationsSetHint,
2658 MessageId::ConfigNotificationUpdated,
2659 MessageId::ConfigNotificationsWholeNumber,
2660 MessageId::ConfigAuditSearchProvider,
2661 MessageId::ConfigAuditPromptSuggestion,
2662 MessageId::ConfigAuditNotifications,
2663 MessageId::ConfigHelpDiscoverable,
2664 MessageId::ConfigEditCancelled,
2665 MessageId::ConfigEditTitlePrefix,
2666 MessageId::ConfigEditScopeLabel,
2667 MessageId::ConfigEditCurrentLabel,
2668 MessageId::ConfigEditHintLabel,
2669 MessageId::ConfigEditNewLabel,
2670 MessageId::ConfigEditFooter,
2671 MessageId::ConfigLocalePartialBadge,
2672 MessageId::ConfigLocalePartialDetail,
2673 MessageId::ConfigRowEffective,
2674 MessageId::ConfigDefaultValue,
2675 MessageId::ConfigDefaultReasoning,
2676 MessageId::ConfigUnavailable,
2677 MessageId::ConfigLabelProvider,
2678 MessageId::ConfigLabelBaseUrlDeepseek,
2679 MessageId::ConfigLabelProviderUrl,
2680 MessageId::ConfigHintProviderUrl,
2681 MessageId::ConfigLabelModel,
2682 MessageId::ConfigLabelFastModel,
2683 MessageId::ConfigLabelDefaultModel,
2684 MessageId::ConfigLabelReasoningEffort,
2685 MessageId::ConfigLabelApprovalMode,
2686 MessageId::ConfigLabelPermissionPosture,
2687 MessageId::ConfigLabelApprovalPolicy,
2688 MessageId::ConfigLabelManagedApprovalPolicy,
2689 MessageId::ConfigLabelDefaultMode,
2690 MessageId::ConfigLabelAllowShell,
2691 MessageId::ConfigLabelManagedAllowShell,
2692 MessageId::ConfigLabelTelemetry,
2693 MessageId::ConfigHintTelemetry,
2694 MessageId::ConfigValueTelemetryOn,
2695 MessageId::ConfigValueTelemetryOff,
2696 MessageId::ConfigLabelStreamTimeout,
2697 MessageId::ConfigLabelTheme,
2698 MessageId::ConfigLabelLocale,
2699 MessageId::ConfigLabelBackground,
2700 MessageId::ConfigLabelWorkSurfacePlacement,
2701 MessageId::ConfigLabelTopHeight,
2702 MessageId::ConfigLabelSideWidth,
2703 MessageId::ConfigLabelCalmMode,
2704 MessageId::ConfigLabelLowMotion,
2705 MessageId::ConfigLabelFancyAnimations,
2706 MessageId::ConfigLabelShowThinking,
2707 MessageId::ConfigLabelThinkingHighlight,
2708 MessageId::ConfigLabelShowToolDetails,
2709 MessageId::ConfigLabelInlineDiffs,
2710 MessageId::ConfigLabelStatusIndicator,
2711 MessageId::ConfigLabelSynchronizedOutput,
2712 MessageId::ConfigLabelCostCurrency,
2713 MessageId::ConfigLabelTranscriptSpacing,
2714 MessageId::ConfigLabelToolCollapse,
2715 MessageId::ConfigLabelComposerDensity,
2716 MessageId::ConfigLabelComposerBorder,
2717 MessageId::ConfigLabelComposerMultilineMode,
2718 MessageId::ConfigLabelComposerVimMode,
2719 MessageId::ConfigLabelBracketedPaste,
2720 MessageId::ConfigLabelPasteBurstDetection,
2721 MessageId::ConfigLabelMentionMenuLimit,
2722 MessageId::ConfigLabelMentionMenuBehavior,
2723 MessageId::ConfigLabelMentionWalkDepth,
2724 MessageId::ConfigLabelWorkspaceFollowSymlinks,
2725 MessageId::ConfigLabelContextPanel,
2726 MessageId::ConfigLabelSessionsRail,
2727 MessageId::ConfigLabelSessionAutoResume,
2728 MessageId::ConfigLabelAutoCompact,
2729 MessageId::ConfigLabelAutoCompactThreshold,
2730 MessageId::ConfigLabelMaxHistory,
2731 MessageId::ConfigLabelMcpOpen,
2732 MessageId::ConfigLabelMcpReconnect,
2733 MessageId::ConfigLabelMcpDiagnose,
2734 MessageId::ConfigLabelPluginsOpen,
2735 MessageId::ConfigLabelMcpConfigPath,
2736 MessageId::ConfigLabelFleetSpawnDepth,
2737 MessageId::ConfigLabelGoalCommand,
2738 MessageId::ConfigLabelWorkflow,
2739 MessageId::ConfigLabelFeaturePrefix,
2740 MessageId::ConfigColumnSetting,
2741 MessageId::ConfigColumnValue,
2742 MessageId::ConfigColumnScope,
2743 MessageId::ConfigActionOpenProvider,
2744 MessageId::ConfigActionOpenModel,
2745 MessageId::ConfigActionOpenMcp,
2746 MessageId::ConfigActionMcpReconnect,
2747 MessageId::ConfigActionMcpDiagnose,
2748 MessageId::ConfigActionOpenPlugins,
2749 MessageId::ConfigActionToggle,
2750 MessageId::ConfigActionChoose,
2751 MessageId::ConfigActionEdit,
2752 MessageId::ConfigActionReadOnly,
2753 MessageId::ModelPickerAutoNetworkHint,
2754 MessageId::ModelPickerAutoNetworkActiveProviderHint,
2755 MessageId::ModelPickerAutoLocalHint,
2756 MessageId::ModelPickerAutoLastRoute,
2757 MessageId::AutoRouteSelectedToast,
2758 MessageId::HelpGroupCommonCommands,
2759 MessageId::HelpGroupAllCommands,
2760 MessageId::HelpTitle,
2761 MessageId::HelpSubtitle,
2762 MessageId::HelpFilterPlaceholder,
2763 MessageId::HelpFilterPrefix,
2764 MessageId::HelpNoMatches,
2765 MessageId::HelpSlashCommands,
2766 MessageId::HelpKeybindings,
2767 MessageId::HelpUserCommands,
2768 MessageId::HelpSkills,
2769 MessageId::HelpFooterTypeFilter,
2770 MessageId::HelpFooterMove,
2771 MessageId::HelpFooterJump,
2772 MessageId::HelpFooterClose,
2773 MessageId::CmdAnchorDescription,
2774 MessageId::CmdAttachDescription,
2775 MessageId::CmdBalanceDescription,
2776 MessageId::CmdImportClaudeDescription,
2777 MessageId::CmdCacheDescription,
2778 MessageId::CmdPreviewRequestDescription,
2779 MessageId::CmdToolsDescription,
2780 MessageId::CmdEffortDescription,
2781 MessageId::CmdTurnInspectDescription,
2782 MessageId::CmdClearDescription,
2783 MessageId::CmdCompactDescription,
2784 MessageId::CmdPurgeDescription,
2785 MessageId::CmdConfigDescription,
2786 MessageId::CmdPermissionsDescription,
2787 MessageId::PermissionsListHeader,
2788 MessageId::PermissionsNoRules,
2789 MessageId::PermissionsFileMissing,
2790 MessageId::PermissionsFileEmpty,
2791 MessageId::PermissionsFilePresent,
2792 MessageId::PermissionsRuleEntry,
2793 MessageId::PermissionsMatchExactCommand,
2794 MessageId::PermissionsMatchCommandPrefix,
2795 MessageId::PermissionsMatchExactPath,
2796 MessageId::PermissionsMatchAnyInvocation,
2797 MessageId::PermissionsScopeGlobal,
2798 MessageId::PermissionsScopeRepo,
2799 MessageId::PermissionsAppliesHere,
2800 MessageId::PermissionsInactiveHere,
2801 MessageId::PermissionsRemovePreview,
2802 MessageId::PermissionsRemoved,
2803 MessageId::PermissionsUsage,
2804 MessageId::PermissionsRuleNotFound,
2805 MessageId::AutoReviewReceiptGuardianAllowed,
2806 MessageId::AutoReviewReceiptGuardianDenied,
2807 MessageId::AutoReviewReceiptGuardianUnavailable,
2808 MessageId::AutoReviewReceiptDeterministicBlocked,
2809 MessageId::AutoReviewReceiptHeld,
2810 MessageId::FooterHintEscInterrupt,
2811 MessageId::PostureHintEnterAgain,
2812 MessageId::PermissionsPostureHeader,
2813 MessageId::PermissionsPostureAsk,
2814 MessageId::PermissionsPostureAuto,
2815 MessageId::PermissionsPostureBypass,
2816 MessageId::PermissionsPostureNever,
2817 MessageId::PermissionsReceiptsNote,
2818 MessageId::PermissionsOperationFailed,
2819 MessageId::CmdAuthDescription,
2820 MessageId::CmdConstitutionDescription,
2821 MessageId::CmdContextDescription,
2822 MessageId::CmdCostDescription,
2823 MessageId::CmdDiffDescription,
2824 MessageId::CmdEditDescription,
2825 MessageId::CmdExitDescription,
2826 MessageId::CmdExportDescription,
2827 MessageId::CmdCopyDescription,
2828 MessageId::CmdCopyNoOutput,
2829 MessageId::CmdCopySuccess,
2830 MessageId::CmdCopySuccessNoBackup,
2831 MessageId::CmdCopyQueued,
2832 MessageId::CmdCopyQueuedNoBackup,
2833 MessageId::CmdCopyFailed,
2834 MessageId::CmdCopyFailedNoBackup,
2835 MessageId::CmdFeedbackDescription,
2836 MessageId::FeedbackNoSession,
2837 MessageId::FeedbackUnavailable,
2838 MessageId::FeedbackReviewNotice,
2839 MessageId::FeedbackHelp,
2840 MessageId::FeedbackDraftRequested,
2841 MessageId::CmdForkDescription,
2842 MessageId::CmdTreeDescription,
2843 MessageId::CmdBranchDescription,
2844 MessageId::CmdResumeDescription,
2845 MessageId::CmdGoalDescription,
2846 MessageId::GoalReceiptSet,
2847 MessageId::GoalReceiptSetOperate,
2848 MessageId::GoalControlAccepted,
2849 MessageId::GoalControlRuntimeUnavailable,
2850 MessageId::GoalStatusIdleHint,
2851 MessageId::GoalContinuationWaiting,
2852 MessageId::GoalContinuationReady,
2853 MessageId::GoalContinuationStopped,
2854 MessageId::CmdThemeDescription,
2855 MessageId::CmdHfDescription,
2856 MessageId::CmdHelpDescription,
2857 MessageId::CmdProfileDescription,
2858 MessageId::CmdHomeDescription,
2859 MessageId::CmdOverviewDescription,
2860 MessageId::HomeBackToConversation,
2861 MessageId::HomeNavigationBusy,
2862 MessageId::CmdHooksDescription,
2863 MessageId::CmdAgentDescription,
2864 MessageId::CmdInitDescription,
2865 MessageId::CmdJobsDescription,
2866 MessageId::CmdDispatchDescription,
2867 MessageId::CmdLinksDescription,
2868 MessageId::CmdLoadDescription,
2869 MessageId::CmdLogoutDescription,
2870 MessageId::CmdLoginDescription,
2871 MessageId::CmdMcpDescription,
2872 MessageId::McpRecommendedUnknownId,
2873 MessageId::McpRecommendationsHeading,
2874 MessageId::McpRecommendationsSafety,
2875 MessageId::McpRecommendationGithub,
2876 MessageId::McpRecommendationChrome,
2877 MessageId::McpRecommendationPlaywright,
2878 MessageId::McpRecommendationContainerUse,
2879 MessageId::McpCapabilitiesAdvertised,
2880 MessageId::McpCapabilitiesLegacyFallback,
2881 MessageId::McpCapabilitiesNotObserved,
2882 MessageId::CmdPluginDescription,
2883 MessageId::ExtensionsActionAdd,
2884 MessageId::ExtensionsActionEnable,
2885 MessageId::ExtensionsActionEdit,
2886 MessageId::ExtensionsHooksAddLabel,
2887 MessageId::ExtensionsHooksAddDescription,
2888 MessageId::ExtensionsActionReload,
2889 MessageId::ExtensionsActionConnect,
2890 MessageId::ExtensionsActionReconnect,
2891 MessageId::ExtensionsActionReauth,
2892 MessageId::ExtensionsActionDiagnose,
2893 MessageId::ExtensionsActionManage,
2894 MessageId::ExtensionsActionFocus,
2895 MessageId::ExtensionsActionFold,
2896 MessageId::ExtensionsActionTabs,
2897 MessageId::ExtensionsCompatibilityFull,
2898 MessageId::ExtensionsCompatibilityPartial,
2899 MessageId::ExtensionsComponentBrowserDriver,
2900 MessageId::ExtensionsComponentNativeRuntime,
2901 MessageId::ExtensionsComponentSandboxRuntime,
2902 MessageId::ExtensionsGroupBuiltIn,
2903 MessageId::ExtensionsGroupConfigured,
2904 MessageId::ExtensionsGroupProblems,
2905 MessageId::ExtensionsGroupRecommended,
2906 MessageId::ExtensionsGroupServers,
2907 MessageId::ExtensionsGroupNeedsAttention,
2908 MessageId::ExtensionsGroupNeedsLogin,
2909 MessageId::ExtensionsGroupStatus,
2910 MessageId::ExtensionsGroupUser,
2911 MessageId::ExtensionsGroupWorkspace,
2912 MessageId::ExtensionsHookDetail,
2913 MessageId::ExtensionsHookFallback,
2914 MessageId::ExtensionsHooksConfiguration,
2915 MessageId::ExtensionsInventoryAgents,
2916 MessageId::ExtensionsInventoryCommands,
2917 MessageId::ExtensionsInventoryHooks,
2918 MessageId::ExtensionsInventoryMcp,
2919 MessageId::ExtensionsInventoryNone,
2920 MessageId::ExtensionsInventorySkills,
2921 MessageId::ExtensionsMarketplaceDetail,
2922 MessageId::ExtensionsMarketplaceUnavailable,
2923 MessageId::ExtensionsMcpEmpty,
2924 MessageId::ExtensionsMcpBrowse,
2925 MessageId::ExtensionsMcpDetail,
2926 MessageId::ExtensionsMcpNotInspected,
2927 MessageId::ExtensionsMcpRefresh,
2928 MessageId::ExtensionsMcpSummary,
2929 MessageId::ExtensionsNoItems,
2930 MessageId::ExtensionsNoMatches,
2931 MessageId::ExtensionsPluginDetail,
2932 MessageId::ExtensionsProductBrowserUseDescription,
2933 MessageId::ExtensionsProductChromeDescription,
2934 MessageId::ExtensionsProductDetail,
2935 MessageId::ExtensionsProductPlaywrightDescription,
2936 MessageId::ExtensionsProductCodewhaleComputerUseDescription,
2937 MessageId::ExtensionsStateFirstParty,
2938 MessageId::ExtensionsProductSandboxDescription,
2939 MessageId::ExtensionsSearchLabel,
2940 MessageId::ExtensionsSkillRootCompatibleGlobal,
2941 MessageId::ExtensionsSkillRootCompatibleProject,
2942 MessageId::ExtensionsSkillRootConfigured,
2943 MessageId::ExtensionsSkillRootGlobal,
2944 MessageId::ExtensionsSkillRootProject,
2945 MessageId::ExtensionsSkillRootRegistryCache,
2946 MessageId::ExtensionsSkillRootReviewedPlugin,
2947 MessageId::ExtensionsStateAvailable,
2948 MessageId::ExtensionsStateBetaCandidate,
2949 MessageId::ExtensionsStateConnected,
2950 MessageId::ExtensionsStateEnabled,
2951 MessageId::ExtensionsStateEnabledUntrusted,
2952 MessageId::ExtensionsStateError,
2953 MessageId::ExtensionsStateInactive,
2954 MessageId::ExtensionsStateInapplicable,
2955 MessageId::ExtensionsStateInvalid,
2956 MessageId::ExtensionsStateNotInspected,
2957 MessageId::ExtensionsStateRejected,
2958 MessageId::ExtensionsStateReviewedCandidate,
2959 MessageId::ExtensionsStateUnderEvaluation,
2960 MessageId::ExtensionsStateUnstaged,
2961 MessageId::ExtensionsStateUnsupported,
2962 MessageId::ExtensionsStateWarning,
2963 MessageId::ExtensionsTabHooks,
2964 MessageId::ExtensionsTabMarketplace,
2965 MessageId::ExtensionsTabMarketplaceCompact,
2966 MessageId::ExtensionsTabPlugins,
2967 MessageId::ExtensionsTierCommunity,
2968 MessageId::ExtensionsTierCurated,
2969 MessageId::ExtensionsTierOfficial,
2970 MessageId::ExtensionsTierPartner,
2971 MessageId::ExtensionsTitle,
2972 MessageId::ExtensionsTrustCapabilitiesChanged,
2973 MessageId::ExtensionsTrustContentChanged,
2974 MessageId::ExtensionsTrustNotReviewed,
2975 MessageId::ExtensionsTrustTrusted,
2976 MessageId::ExtensionsValueNo,
2977 MessageId::ExtensionsValueYes,
2978 MessageId::PluginKimiUsage,
2979 MessageId::PluginKimiManagedRootHeading,
2980 MessageId::PluginKimiNoneFound,
2981 MessageId::PluginKimiLicenseUnspecified,
2982 MessageId::PluginKimiApplicable,
2983 MessageId::PluginKimiNotApplicable,
2984 MessageId::PluginKimiCandidateSummary,
2985 MessageId::PluginKimiCandidateDetails,
2986 MessageId::PluginKimiRejectedHeading,
2987 MessageId::PluginKimiInspectionFooter,
2988 MessageId::PluginKimiCandidateMissing,
2989 MessageId::PluginKimiCandidateChanged,
2990 MessageId::PluginKimiHomeMissing,
2991 MessageId::PluginKimiRootInspectFailed,
2992 MessageId::PluginKimiRootMustBeDirectory,
2993 MessageId::PluginKimiRootCanonicalizeFailed,
2994 MessageId::PluginKimiRootListFailed,
2995 MessageId::PluginKimiEntryReadFailed,
2996 MessageId::PluginKimiEntryLimit,
2997 MessageId::PluginKimiEntryInspectFailed,
2998 MessageId::PluginKimiEntryLinksRefused,
2999 MessageId::PluginKimiEntryOutsideRoot,
3000 MessageId::PluginKimiEntryCanonicalizeFailed,
3001 MessageId::PluginKimiManifestUnreadable,
3002 MessageId::PluginKimiManifestMustBeFile,
3003 MessageId::PluginKimiManifestInvalid,
3004 MessageId::PluginKimiDirectoryNameMismatch,
3005 MessageId::PluginKimiHashUnavailable,
3006 MessageId::PluginKimiRollbackDestinationMissing,
3007 MessageId::PluginKimiMismatchRemoved,
3008 MessageId::PluginKimiMismatchRollbackFailed,
3009 MessageId::PluginKimiUserPluginDirectory,
3010 MessageId::PluginKimiMarketplaceZipUnsupported,
3011 MessageId::PluginKimiMarketplaceRemoteUnsupported,
3012 MessageId::PluginKimiMarketplaceGzipTarball,
3013 MessageId::CmdPluginBundleUsage,
3014 MessageId::CmdPluginBundleNoneFound,
3015 MessageId::CmdPluginBundleListHeader,
3016 MessageId::CmdPluginLegacyListHeader,
3017 MessageId::CmdPluginBundleNotFound,
3018 MessageId::CmdPluginBundleReloaded,
3019 MessageId::PluginPromptSuggestTrust,
3020 MessageId::PluginPromptSuggestEnable,
3021 MessageId::PluginPromptSuggestMarketplace,
3022 MessageId::PluginCtaInstallPrompt,
3023 MessageId::PluginCtaReview,
3024 MessageId::PluginCtaDismiss,
3025 MessageId::PluginCtaDismissSaveFailed,
3026 MessageId::PluginSuggestionReason,
3027 MessageId::PagerActionConfirm,
3028 MessageId::CmdPluginBundleDetail,
3029 MessageId::CmdPluginBundleDiagnosticsHeader,
3030 MessageId::CmdPluginBundleMutationSuccess,
3031 MessageId::CmdPluginActionFailed,
3032 MessageId::CmdPluginNoneFound,
3033 MessageId::CmdPluginNotFound,
3034 MessageId::CmdPluginListHeader,
3035 MessageId::CmdPluginDetailDescription,
3036 MessageId::CmdPluginDetailSchema,
3037 MessageId::CmdPluginDetailApproval,
3038 MessageId::CmdPluginDetailPath,
3039 MessageId::CmdMemoryDescription,
3040 MessageId::CmdModeDescription,
3041 MessageId::CmdModelDescription,
3042 MessageId::CmdModelsDescription,
3043 MessageId::ModelsListHeader,
3044 MessageId::ModelsListHint,
3045 MessageId::ModelsUpdateSummary,
3046 MessageId::ModelsUpdatePartial,
3047 MessageId::ModelsCodexHint,
3048 MessageId::ModelsSourceFallback,
3049 MessageId::CmdModelDbDescription,
3050 MessageId::CmdNetworkDescription,
3051 MessageId::CmdUpdateDescription,
3052 MessageId::CmdNoteDescription,
3053 MessageId::CmdProviderDescription,
3054 MessageId::CmdQueueDescription,
3055 MessageId::CmdQueueUsage,
3056 MessageId::CmdQueueDraftHeader,
3057 MessageId::CmdQueueNoMessages,
3058 MessageId::CmdQueueListHeader,
3059 MessageId::CmdQueueTip,
3060 MessageId::CmdQueueAlreadyEditing,
3061 MessageId::CmdQueueNotFound,
3062 MessageId::CmdQueueEditingStatus,
3063 MessageId::CmdQueueEditingMessage,
3064 MessageId::CmdQueueDropped,
3065 MessageId::CmdQueueAlreadyEmpty,
3066 MessageId::CmdQueueCleared,
3067 MessageId::CmdQueueMissingIndex,
3068 MessageId::CmdQueueIndexPositive,
3069 MessageId::CmdQueueIndexMin,
3070 MessageId::CmdRelayDescription,
3071 MessageId::CmdRemoteControlDescription,
3072 MessageId::CmdRemoteEnvDescription,
3073 MessageId::CmdRemoteEnvOverview,
3074 MessageId::CmdRemoteEnvOpening,
3075 MessageId::CmdRemoteEnvUnavailable,
3076 MessageId::CmdRemoteEnvSourceCustodyPolicy,
3077 MessageId::CmdRemoteEnvBrowserLabel,
3078 MessageId::CmdRenameDescription,
3079 MessageId::CmdTitleDescription,
3080 MessageId::CmdRestoreDescription,
3081 MessageId::CmdRetryDescription,
3082 MessageId::CmdReviewDescription,
3083 MessageId::CmdRlmDescription,
3084 MessageId::CmdSaveDescription,
3085 MessageId::CmdFullscreenDescription,
3086 MessageId::CmdInlineDescription,
3087 MessageId::CmdNewDescription,
3088 MessageId::CmdSessionsDescription,
3089 MessageId::CmdSettingsDescription,
3090 MessageId::CmdSidebarDescription,
3091 MessageId::CmdSkillDescription,
3092 MessageId::CmdSkillsDescription,
3093 MessageId::CmdStashDescription,
3094 MessageId::CmdStatusDescription,
3095 MessageId::CmdStatuslineDescription,
3096 MessageId::CmdStructcopyDescription,
3097 MessageId::CmdStructcopyKindTurn,
3098 MessageId::CmdStructcopyKindTool,
3099 MessageId::CmdStructcopyKindPlan,
3100 MessageId::CmdStructcopyKindWorkflow,
3101 MessageId::CmdStructcopyUsageError,
3102 MessageId::CmdStructcopyUnavailable,
3103 MessageId::CmdStructcopyBusy,
3104 MessageId::CmdStructcopyPrepareFailed,
3105 MessageId::CmdStructcopyClipboardQueued,
3106 MessageId::CmdStructcopyClipboardAccepted,
3107 MessageId::CmdStructcopyClipboardFailed,
3108 MessageId::CmdStructcopyReceiptTooLarge,
3109 MessageId::CmdFleetDescription,
3110 MessageId::PetUnobserved,
3111 MessageId::PetDozing,
3112 MessageId::PetWatchUnavailable,
3113 MessageId::PetWatchRestored,
3114 MessageId::PetWatchStorageUnavailable,
3115 MessageId::PetWatchExported,
3116 MessageId::PetWatchExportFailed,
3117 MessageId::PetWatchExportQueued,
3118 MessageId::PetWatchExportUnavailable,
3119 MessageId::PetHabitatTitle,
3120 MessageId::PetHabitatHints,
3121 MessageId::PetHabitatQueued,
3122 MessageId::PetWatchSoundOn,
3123 MessageId::PetWatchSoundOff,
3124 MessageId::PetWatchSoundPaused,
3125 MessageId::PetWatchSoundUnavailable,
3126 MessageId::CmdPetDescription,
3127 MessageId::PetModeOn,
3128 MessageId::PetModeOff,
3129 MessageId::PetModeOnLabel,
3130 MessageId::PetModeOffLabel,
3131 MessageId::PetViewOpen,
3132 MessageId::PetViewClosed,
3133 MessageId::CmdLaneDescription,
3134 MessageId::CmdWorkflowDescription,
3135 MessageId::CmdWorkflowsDescription,
3136 MessageId::CmdAutoDescription,
3137 MessageId::AutoReceiptOn,
3138 MessageId::AutoReceiptPlanNote,
3139 MessageId::CmdHotbarDescription,
3140 MessageId::CmdSetupDescription,
3141 MessageId::CmdSubagentsDescription,
3142 MessageId::CmdAdvisorDescription,
3143 MessageId::CmdSystemDescription,
3144 MessageId::CmdAutomationDescription,
3145 MessageId::CmdTaskDescription,
3146 MessageId::CmdTokensDescription,
3147 MessageId::CmdTranslateDescription,
3148 MessageId::CmdTranslateOff,
3149 MessageId::CmdTranslateOn,
3150 MessageId::TranslationInProgress,
3151 MessageId::TranslationComplete,
3152 MessageId::TranslationFailed,
3153 MessageId::CmdTrustDescription,
3154 MessageId::CmdLspDescription,
3155 MessageId::CmdShareDescription,
3156 MessageId::CmdWorkspaceDescription,
3157 MessageId::CmdUndoDescription,
3158 MessageId::CmdVerboseDescription,
3159 MessageId::CmdCacheAdvice,
3160 MessageId::CmdCacheFootnote,
3161 MessageId::CmdCacheHeader,
3162 MessageId::CmdCacheNoData,
3163 MessageId::CmdCacheTotals,
3164 MessageId::CmdChangeDescription,
3165 MessageId::CmdChangeHeader,
3166 MessageId::CmdChangeTranslationQueued,
3167 MessageId::CmdChangeTranslationUnavailable,
3168 MessageId::CmdChangePreviousVersion,
3169 MessageId::CmdCostReport,
3170 MessageId::CmdCostReportSubtotal,
3171 MessageId::CmdCostReportUnknown,
3172 MessageId::CmdCostUnknownValue,
3173 MessageId::CmdCostEstimateOnly,
3174 MessageId::CmdCostCoverage,
3175 MessageId::CmdCostCoverageUnknownLegacy,
3176 MessageId::CmdCostUnpricedTurns,
3177 MessageId::CmdCostUnpricedClasses,
3178 MessageId::CmdCostPricingProvenance,
3179 MessageId::CmdCostLivePricingDowngraded,
3180 MessageId::CmdCostLivePricingUnavailable,
3181 MessageId::CmdCostRoutesHeader,
3182 MessageId::CmdTokensCacheWriteTotal,
3183 MessageId::CmdTokensCacheBoth,
3184 MessageId::CmdTokensCacheHitOnly,
3185 MessageId::CmdTokensCacheMissOnly,
3186 MessageId::CmdTokensContextUnknownWindow,
3187 MessageId::CmdTokensContextWithWindow,
3188 MessageId::CmdTokensNotReported,
3189 MessageId::CmdTokensReport,
3190 MessageId::FooterAgentSingular,
3191 MessageId::FooterAgentsPlural,
3192 MessageId::HeaderAgentsChip,
3193 MessageId::FooterPressCtrlCAgain,
3194 MessageId::FooterWorking,
3195 MessageId::FooterBalancePrefix,
3196 MessageId::HelpSectionActions,
3197 MessageId::HelpSectionClipboard,
3198 MessageId::HelpSectionPointer,
3199 MessageId::HelpSectionEditing,
3200 MessageId::HelpSectionHelp,
3201 MessageId::HelpSectionModes,
3202 MessageId::HelpSectionNavigation,
3203 MessageId::HelpSectionSessions,
3204 MessageId::KbScrollTranscript,
3205 MessageId::KbNavigateHistory,
3206 MessageId::KbScrollTranscriptAlt,
3207 MessageId::KbBrowseHistory,
3208 MessageId::KbScrollPage,
3209 MessageId::KbJumpTopBottom,
3210 MessageId::KbJumpTopBottomEmpty,
3211 MessageId::KbJumpToolBlocks,
3212 MessageId::KbMoveCursor,
3213 MessageId::KbJumpLineStartEnd,
3214 MessageId::KbDeleteChar,
3215 MessageId::KbDeleteWord,
3216 MessageId::KbYank,
3217 MessageId::KbToggleFileTree,
3218 MessageId::KbSelectText,
3219 MessageId::KbSelectAllDraft,
3220 MessageId::KbClearDraft,
3221 MessageId::KbRestoreClearedDraft,
3222 MessageId::KbStashDraft,
3223 MessageId::KbSearchHistory,
3224 MessageId::KbInsertNewline,
3225 MessageId::KbSendDraft,
3226 MessageId::KbSteerCurrentTurn,
3227 MessageId::KbCloseMenu,
3228 MessageId::KbCancelOrExit,
3229 MessageId::KbShellControls,
3230 MessageId::KbExitEmpty,
3231 MessageId::KbCommandPalette,
3232 MessageId::KbSettings,
3233 MessageId::KbCancelBackgroundShellJobs,
3234 MessageId::KbFuzzyFilePicker,
3235 MessageId::KbCompactInspector,
3236 MessageId::KbCompactContext,
3237 MessageId::KbLastMessagePager,
3238 MessageId::KbSelectedDetails,
3239 MessageId::KbToolDetailsPager,
3240 MessageId::KbReasoningDetail,
3241 MessageId::KbTurnInspector,
3242 MessageId::KbExternalEditor,
3243 MessageId::KbLiveTranscript,
3244 MessageId::KbBacktrackMessage,
3245 MessageId::KbCompleteCycleModes,
3246 MessageId::KbCycleThinking,
3247 MessageId::KbCyclePermissions,
3248 MessageId::KbJumpPlanAgentYolo,
3249 MessageId::KbAltJumpPlanAgentYolo,
3250 MessageId::KbFocusSidebar,
3251 MessageId::KbSessionPicker,
3252 MessageId::KbUpdateInstall,
3253 MessageId::UpdateChangedHint,
3254 MessageId::KbTerminalPaste,
3255 MessageId::KbPasteAttach,
3256 MessageId::KbCopySelection,
3257 MessageId::ClipboardSshPasteHint,
3258 MessageId::KbContextMenu,
3259 MessageId::KbPointerScroll,
3260 MessageId::KbPointerClick,
3261 MessageId::KbPointerDrag,
3262 MessageId::KbAttachPath,
3263 MessageId::KbHelpOverlay,
3264 MessageId::KbCycleWorkDock,
3265 MessageId::KbCycleWorkDockBack,
3266 MessageId::KbToggleHelp,
3267 MessageId::KbToggleHelpSlash,
3268 MessageId::HelpUsageLabel,
3269 MessageId::HelpAliasesLabel,
3270 MessageId::SettingsTitle,
3271 MessageId::SettingsConfigFile,
3272 MessageId::SettingsTuiPrefsFolded,
3273 MessageId::SettingsTuiPrefsKept,
3274 MessageId::SettingsTuiPrefsQuarantined,
3275 MessageId::ClearConversation,
3276 MessageId::ClearConversationBusy,
3277 MessageId::ModelChanged,
3278 MessageId::LinksProjectTitle,
3279 MessageId::LinksDocumentation,
3280 MessageId::LinksCommunity,
3281 MessageId::LinksGitHub,
3282 MessageId::LinksManagedApp,
3283 MessageId::LinksManagedAppNote,
3284 MessageId::LinksTitle,
3285 MessageId::LinksDashboard,
3286 MessageId::LinksDocs,
3287 MessageId::LinksKimiCodeRouteNote,
3288 MessageId::LinksTip,
3289 MessageId::SubagentsFetching,
3290 MessageId::SubagentsNoCurrentSessionFleetWorkers,
3291 MessageId::SubagentsCurrentSessionFleetWorkersTitle,
3292 MessageId::SubagentsCurrentSessionFleetWorkerRoles,
3293 MessageId::SubagentsCurrentSessionFleetWorkersStatus,
3294 MessageId::SubagentsEmptyGuidance,
3295 MessageId::SubagentsStatusRunning,
3296 MessageId::SubagentsStatusCompleted,
3297 MessageId::SubagentsStatusInterrupted,
3298 MessageId::SubagentsStatusFailed,
3299 MessageId::SubagentsStatusCancelled,
3300 MessageId::SubagentsRowStatusInterrupted,
3301 MessageId::SubagentsRowStatusCancelled,
3302 MessageId::SubagentsRowStatusBudgetExhausted,
3303 MessageId::SubagentsSummaryItem,
3304 MessageId::SubagentsGroupHeading,
3305 MessageId::SubagentsHeaderRoster,
3306 MessageId::SubagentsHeaderColumns,
3307 MessageId::SubagentsActionRefresh,
3308 MessageId::SubagentsActionRosterSetup,
3309 MessageId::SubagentsLabelReason,
3310 MessageId::SubagentsLabelRole,
3311 MessageId::SubagentsLabelPosture,
3312 MessageId::SubagentsLabelGit,
3313 MessageId::SubagentsLabelObjective,
3314 MessageId::SubagentsLabelResult,
3315 MessageId::SubagentsPostureDetails,
3316 MessageId::SubagentsValueOn,
3317 MessageId::SubagentsValueOff,
3318 MessageId::SubagentsShellNone,
3319 MessageId::SubagentsShellReadOnly,
3320 MessageId::SubagentsShellFull,
3321 MessageId::SubagentsBranch,
3322 MessageId::SubagentsBranchWithWorkspace,
3323 MessageId::SubagentsRoleWorker,
3324 MessageId::SubagentsRoleScout,
3325 MessageId::SubagentsRolePlanner,
3326 MessageId::SubagentsRoleBuilder,
3327 MessageId::SubagentsRoleVerifier,
3328 MessageId::SubagentsRoleReviewer,
3329 MessageId::SubagentsRoleConsultant,
3330 MessageId::SubagentsRoleCustom,
3331 MessageId::HelpUnknownCommand,
3332 MessageId::HomeDashboardTitle,
3333 MessageId::HomeModel,
3334 MessageId::HomeMode,
3335 MessageId::HomeWorkspace,
3336 MessageId::HomeHistory,
3337 MessageId::HomeTokens,
3338 MessageId::HomeQueued,
3339 MessageId::HomeSubagents,
3340 MessageId::HomeSkill,
3341 MessageId::HomeQuickActions,
3342 MessageId::HomeQuickLinks,
3343 MessageId::HomeQuickSkills,
3344 MessageId::HomeQuickConfig,
3345 MessageId::HomeQuickSettings,
3346 MessageId::HomeQuickModel,
3347 MessageId::HomeQuickSubagents,
3348 MessageId::HomeQuickTaskList,
3349 MessageId::HomeQuickHelp,
3350 MessageId::HomeQuickWorkspace,
3351 MessageId::HomeQuickRestore,
3352 MessageId::HomeQuickTokens,
3353 MessageId::HomeModeTips,
3354 MessageId::HomeAgentModeTip,
3355 MessageId::HomeAgentModeReviewTip,
3356 MessageId::HomeAgentModeYoloTip,
3357 MessageId::HomeYoloModeTip,
3358 MessageId::HomeYoloModeCaution,
3359 MessageId::HomePlanModeTip,
3360 MessageId::HomePlanModeChecklistTip,
3361 MessageId::HomeOperateModeTip,
3362 MessageId::HomeOperateModeFleetTip,
3363 MessageId::HomeGoalModeTip,
3364 MessageId::OnboardWelcomeTitle,
3365 MessageId::OnboardWelcomeLead,
3366 MessageId::OnboardWelcomeBegin,
3367 MessageId::OnboardActionBack,
3368 MessageId::OnboardActionExit,
3369 MessageId::OnboardStepsTitle,
3370 MessageId::OnboardLanguageTitle,
3371 MessageId::OnboardLanguageBlurb,
3372 MessageId::OnboardLanguagePick,
3373 MessageId::OnboardLanguageKeep,
3374 MessageId::OnboardProviderTitle,
3375 MessageId::OnboardProviderBlurb,
3376 MessageId::OnboardProviderChoose,
3377 MessageId::OnboardProviderOffline,
3378 MessageId::KimiCodePlanApiKeyHint,
3379 MessageId::KimiCodePlanRouteHint,
3380 MessageId::KimiCodePlanNoImportHint,
3381 MessageId::StepfunBillingRouteTitle,
3382 MessageId::StepfunBillingRouteIntro,
3383 MessageId::StepfunBillingRoutePaygOption,
3384 MessageId::StepfunBillingRoutePlanOption,
3385 MessageId::StepfunPlanApiKeyHint,
3386 MessageId::StepfunPlanRouteHint,
3387 MessageId::OnboardApiKeyRejectedEnv,
3388 MessageId::OnboardTrustTitle,
3389 MessageId::OnboardTrustQuestion,
3390 MessageId::OnboardTrustLocationPrefix,
3391 MessageId::OnboardTrustRiskHint,
3392 MessageId::OnboardTrustEffectHint,
3393 MessageId::OnboardTrustActionTrust,
3394 MessageId::OnboardTrustActionSkip,
3395 MessageId::OnboardTrustActionQuit,
3396 MessageId::OnboardTrustEnterHint,
3397 MessageId::OnboardTrustUntrustedNotice,
3398 MessageId::RedactionGateSaveFailed,
3399 MessageId::RedactionGateTitle,
3400 MessageId::RedactionGateQuestion,
3401 MessageId::RedactionGateDangerNotice,
3402 MessageId::RedactionGateRisk,
3403 MessageId::RedactionGateEffect,
3404 MessageId::RedactionGateRollbackHint,
3405 MessageId::RedactionGateEnterHint,
3406 MessageId::RedactionGateActionConfirm,
3407 MessageId::RedactionGateActionKeep,
3408 MessageId::RedactionGateActionQuit,
3409 MessageId::RedactionGateConfirmTitle,
3410 MessageId::RedactionGateConfirmQuestion,
3411 MessageId::RedactionGateActionBack,
3412 MessageId::OnboardOfflineOption,
3413 MessageId::OnboardOfflineNotice,
3414 MessageId::OnboardReadyTitle,
3415 MessageId::OnboardReadyLead,
3416 MessageId::OnboardReadyStart,
3417 MessageId::OnboardReadyCustomize,
3418 MessageId::OnboardSeedCodeProject,
3419 MessageId::OnboardSeedFolder,
3420 MessageId::SetupWizardTitle,
3421 MessageId::SetupWizardWhy,
3422 MessageId::SetupWizardProgress,
3423 MessageId::SetupActionBack,
3424 MessageId::SetupActionContinue,
3425 MessageId::SetupActionSkip,
3426 MessageId::SetupActionRetry,
3427 MessageId::SetupActionScrollBody,
3428 MessageId::SetupActionGuided,
3429 MessageId::SetupActionTuneGuided,
3430 MessageId::SetupActionModelDraft,
3431 MessageId::SetupActionFreeform,
3432 MessageId::SetupActionKeepExisting,
3433 MessageId::SetupActionUseRecommended,
3434 MessageId::SetupActionCustomize,
3435 MessageId::SetupActionProvider,
3436 MessageId::SetupActionModel,
3437 MessageId::SetupActionFleet,
3438 MessageId::SetupActionHotbar,
3439 MessageId::SetupActionRemote,
3440 MessageId::SetupActionMode,
3441 MessageId::SetupActionConfig,
3442 MessageId::SetupActionRuntimePreset,
3443 MessageId::SetupActionApplyRuntimePreset,
3444 MessageId::SetupActionUseBundled,
3445 MessageId::SetupActionDefer,
3446 MessageId::SetupActionCancel,
3447 MessageId::SetupStatusNotStarted,
3448 MessageId::SetupStatusRecommended,
3449 MessageId::SetupStatusOptional,
3450 MessageId::SetupStatusDeferred,
3451 MessageId::SetupStatusInProgress,
3452 MessageId::SetupStatusNeedsAction,
3453 MessageId::SetupStatusVerified,
3454 MessageId::SetupStatusSkipped,
3455 MessageId::SetupStatusFailed,
3456 MessageId::SetupStepLanguageTitle,
3457 MessageId::SetupStepLanguageWhy,
3458 MessageId::SetupStepProviderModelTitle,
3459 MessageId::SetupStepProviderModelWhy,
3460 MessageId::SetupStepTrustSandboxTitle,
3461 MessageId::SetupStepTrustSandboxWhy,
3462 MessageId::SetupStepOperateFleetTitle,
3463 MessageId::SetupStepOperateFleetWhy,
3464 MessageId::SetupStepToolsMcpTitle,
3465 MessageId::SetupStepToolsMcpWhy,
3466 MessageId::SetupStepHotbarTitle,
3467 MessageId::SetupStepHotbarWhy,
3468 MessageId::SetupStepRemoteRuntimeTitle,
3469 MessageId::SetupStepRemoteRuntimeWhy,
3470 MessageId::SetupStepPersistenceTitle,
3471 MessageId::SetupStepPersistenceWhy,
3472 MessageId::SetupStepConstitutionTitle,
3473 MessageId::SetupStepConstitutionWhy,
3474 MessageId::SetupStepVerificationTitle,
3475 MessageId::SetupStepVerificationWhy,
3476 MessageId::SetupCheckpointLayerOrder,
3477 MessageId::SetupCheckpointDoneBundled,
3478 MessageId::SetupCheckpointDoneGuided,
3479 MessageId::SetupCheckpointDoneKept,
3480 MessageId::SetupCheckpointDeferred,
3481 MessageId::SetupStepSkipped,
3482 MessageId::SetupStepRetryRecorded,
3483 MessageId::SetupLanguageReviewed,
3484 MessageId::SetupConstitutionChoiceLabel,
3485 MessageId::SetupConstitutionSourceLabel,
3486 MessageId::SetupConstitutionValidityLabel,
3487 MessageId::SetupConstitutionPreviewLabel,
3488 MessageId::SetupConstitutionExistingLabel,
3489 MessageId::SetupConstitutionExpertOverrideLabel,
3490 MessageId::SetupConstitutionGuidedHint,
3491 MessageId::SetupConstitutionGuidedAnswersHint,
3492 MessageId::SetupConstitutionExistingDefaultDetail,
3493 MessageId::SetupConstitutionRepairDefaultDetail,
3494 MessageId::SetupConstitutionPurposeLabel,
3495 MessageId::SetupConstitutionAutonomyLabel,
3496 MessageId::SetupConstitutionEvidenceLabel,
3497 MessageId::SetupConstitutionCommunicationLabel,
3498 MessageId::SetupConstitutionPrivacyLabel,
3499 MessageId::SetupConstitutionPrinciplesLabel,
3500 MessageId::SetupCardRouteLabel,
3501 MessageId::SetupCardModelLabel,
3502 MessageId::SetupCardAuthLabel,
3503 MessageId::SetupCardHealthLabel,
3504 MessageId::SetupCardIntentLabel,
3505 MessageId::SetupCardApprovalLabel,
3506 MessageId::SetupCardShellLabel,
3507 MessageId::SetupCardTrustLabel,
3508 MessageId::SetupCardSandboxLabel,
3509 MessageId::SetupCardNetworkLabel,
3510 MessageId::SetupOperateRuntimeLabel,
3511 MessageId::SetupOperateRosterLabel,
3512 MessageId::SetupOperateConcurrencyLabel,
3513 MessageId::SetupOperateReadinessLabel,
3514 MessageId::SetupOperateReviewHint,
3515 MessageId::SetupOperateReviewed,
3516 MessageId::SetupOperateNeedsActionSaved,
3517 MessageId::SetupHotbarBindingsLabel,
3518 MessageId::SetupHotbarActionsLabel,
3519 MessageId::SetupHotbarReviewHint,
3520 MessageId::SetupHotbarReviewed,
3521 MessageId::SetupToolsMcpServersLabel,
3522 MessageId::SetupToolsMcpSkillsLabel,
3523 MessageId::SetupToolsMcpToolsLabel,
3524 MessageId::SetupToolsMcpPluginsLabel,
3525 MessageId::SetupToolsMcpHotbarLabel,
3526 MessageId::SetupToolsMcpReviewHint,
3527 MessageId::SetupToolsMcpReviewed,
3528 MessageId::SetupToolsMcpNeedsActionSaved,
3529 MessageId::SetupToolsMcpPreviewTitle,
3530 MessageId::SetupToolsMcpOnRampText,
3531 MessageId::SetupToolsMcpDshLabel,
3532 MessageId::SetupToolsMcpDshRow,
3533 MessageId::SetupRemoteCloudsLabel,
3534 MessageId::SetupRemoteBridgesLabel,
3535 MessageId::SetupRemoteProvidersLabel,
3536 MessageId::SetupRemoteModeLabel,
3537 MessageId::SetupRemoteModeLocalOnly,
3538 MessageId::SetupRemoteModeRuntimeApi,
3539 MessageId::SetupRemoteModeMobileLan,
3540 MessageId::SetupRemoteModeChatBridge,
3541 MessageId::SetupRemoteStatusDisabled,
3542 MessageId::SetupRemoteStatusReady,
3543 MessageId::SetupRemoteStatusNeedsAction,
3544 MessageId::SetupRemoteReviewHint,
3545 MessageId::SetupRemotePreviewTitle,
3546 MessageId::SetupRemoteReviewed,
3547 MessageId::SetupPersistenceHomeLabel,
3548 MessageId::SetupPersistenceConfigLabel,
3549 MessageId::SetupPersistenceStateLabel,
3550 MessageId::SetupPersistenceConstitutionLabel,
3551 MessageId::SetupPersistenceMemoryLabel,
3552 MessageId::SetupPersistenceNotesLabel,
3553 MessageId::SetupPersistenceReviewHint,
3554 MessageId::SetupPersistenceReviewed,
3555 MessageId::SetupProviderModelReadyHint,
3556 MessageId::SetupProviderModelNeedsActionHint,
3557 MessageId::SetupProviderModelReviewed,
3558 MessageId::SetupProviderModelNeedsActionSaved,
3559 MessageId::SetupRuntimePostureBoundary,
3560 MessageId::SetupRuntimePostureReviewHint,
3561 MessageId::SetupRuntimePostureReviewed,
3562 MessageId::SetupRuntimePresetSelectedLabel,
3563 MessageId::SetupRuntimePresetDiffLabel,
3564 MessageId::SetupRuntimePresetAskFirstTitle,
3565 MessageId::SetupRuntimePresetAskFirstDescription,
3566 MessageId::SetupRuntimePresetNormalAgentTitle,
3567 MessageId::SetupRuntimePresetNormalAgentDescription,
3568 MessageId::SetupRuntimePresetHighTrustTitle,
3569 MessageId::SetupRuntimePresetHighTrustDescription,
3570 MessageId::SetupRuntimePresetPreviewTitle,
3571 MessageId::SetupRuntimePresetSafetyFloor,
3572 MessageId::SetupRuntimePresetApplyHint,
3573 MessageId::SetupRuntimePresetApplied,
3574 MessageId::SetupRuntimeProjectOverrideLabel,
3575 MessageId::SetupRuntimeProjectOverrideNone,
3576 MessageId::SetupReportFirstRunLabel,
3577 MessageId::SetupReportUpdateLabel,
3578 MessageId::SetupReportOperateLabel,
3579 MessageId::SetupReportSourceLabel,
3580 MessageId::SetupReportAutonomyLabel,
3581 MessageId::SetupReportRuntimePostureLabel,
3582 MessageId::SetupReportPersisted,
3583 MessageId::SetupReportInherited,
3584 MessageId::SetupReportReady,
3585 MessageId::SetupReportRequired,
3586 MessageId::SetupReportOptional,
3587 MessageId::SetupReportRowsLabel,
3588 MessageId::SetupReportNextActionLabel,
3589 MessageId::SetupReportNextActionNone,
3590 MessageId::SetupReportNextActionConstitution,
3591 MessageId::SetupReportNextActionProvider,
3592 MessageId::SetupReportNextActionRuntime,
3593 MessageId::SetupReportNextActionOperate,
3594 MessageId::SetupReportNextActionRequired,
3595 MessageId::SetupReportRecorded,
3596 // Context menu.
3597 MessageId::CtxMenuTitle,
3598 MessageId::CtxMenuCopySelection,
3599 MessageId::CtxMenuCopySelectionDesc,
3600 MessageId::CtxMenuOpenSelection,
3601 MessageId::CtxMenuOpenSelectionDesc,
3602 MessageId::CtxMenuClearSelection,
3603 MessageId::CtxMenuOpenDetails,
3604 MessageId::CtxMenuCopyMessage,
3605 MessageId::CtxMenuCopyMessageDesc,
3606 MessageId::CtxMenuOpenInEditor,
3607 MessageId::CtxMenuOpenInEditorDesc,
3608 MessageId::CtxMenuShowCell,
3609 MessageId::CtxMenuShowCellDesc,
3610 MessageId::CtxMenuHideCell,
3611 MessageId::CtxMenuHideCellDesc,
3612 MessageId::CtxMenuShowHidden,
3613 MessageId::CtxMenuShowHiddenDesc,
3614 MessageId::CtxMenuPaste,
3615 MessageId::CtxMenuPasteDesc,
3616 MessageId::CtxMenuCmdPalette,
3617 MessageId::CtxMenuCmdPaletteDesc,
3618 MessageId::CtxMenuContextInspector,
3619 MessageId::CtxMenuContextInspectorDesc,
3620 MessageId::CtxMenuHelp,
3621 MessageId::CtxMenuHelpDesc,
3622 MessageId::CtxMenuWindowPin,
3623 MessageId::CtxMenuWindowUnpin,
3624 MessageId::CtxMenuWindowPinDesc,
3625 MessageId::CmdPinDescription,
3626 MessageId::WindowPinActive,
3627 MessageId::WindowPinReleased,
3628 MessageId::WindowPinFailed,
3629 MessageId::FanoutCounts,
3630 MessageId::AppModeAgent,
3631 MessageId::AppModeAuto,
3632 MessageId::AppModeYolo,
3633 MessageId::AppModePlan,
3634 MessageId::AppModeOperate,
3635 MessageId::AppModeAgentHint,
3636 MessageId::AppModeAutoHint,
3637 MessageId::AppModePlanHint,
3638 MessageId::AppModeYoloHint,
3639 MessageId::AppModeOperateHint,
3640 MessageId::VimModeNormal,
3641 MessageId::VimModeInsert,
3642 MessageId::VimModeVisual,
3643 MessageId::ApprovalRiskReview,
3644 MessageId::ApprovalRiskElevated,
3645 MessageId::ApprovalRiskDestructive,
3646 MessageId::ApprovalCategorySafe,
3647 MessageId::ApprovalCategoryFileWrite,
3648 MessageId::ApprovalCategoryShell,
3649 MessageId::ApprovalCategoryNetwork,
3650 MessageId::ApprovalCategoryMcpRead,
3651 MessageId::ApprovalCategoryMcpAction,
3652 MessageId::ApprovalCategoryAgent,
3653 MessageId::ApprovalCategoryUnknown,
3654 MessageId::ApprovalFieldType,
3655 MessageId::ApprovalFieldAbout,
3656 MessageId::ApprovalFieldImpact,
3657 MessageId::ApprovalFieldParams,
3658 MessageId::ApprovalOptionApproveOnce,
3659 MessageId::ApprovalOptionApproveAlways,
3660 MessageId::ApprovalOptionAllowExactRepo,
3661 MessageId::ApprovalSaveAskRuleHint,
3662 MessageId::ApprovalOptionDeny,
3663 MessageId::ApprovalOptionAbortTurn,
3664 MessageId::ApprovalBlockTitle,
3665 MessageId::ApprovalControlsHint,
3666 MessageId::ApprovalTruncationHint,
3667 MessageId::ApprovalFullAccessPolicyBlocked,
3668 MessageId::AutoReviewQuestionSkipped,
3669 MessageId::ApprovalChooseHint,
3670 MessageId::ApprovalChooseAction,
3671 MessageId::ApprovalIntentLabel,
3672 MessageId::ApprovalMoreLines,
3673 MessageId::ApprovalAutoDeniedSession,
3674 MessageId::ElevationTitleSandboxDenied,
3675 MessageId::ElevationTitleRequired,
3676 MessageId::ElevationFieldTool,
3677 MessageId::ElevationFieldCmd,
3678 MessageId::ElevationFieldReason,
3679 MessageId::ElevationImpactHeader,
3680 MessageId::ElevationImpactNetwork,
3681 MessageId::ElevationImpactWrite,
3682 MessageId::ElevationImpactFullAccess,
3683 MessageId::ElevationPromptProceed,
3684 MessageId::ElevationOptionNetwork,
3685 MessageId::ElevationOptionWrite,
3686 MessageId::ElevationOptionFullAccess,
3687 MessageId::ElevationOptionAbort,
3688 MessageId::ElevationOptionNetworkDesc,
3689 MessageId::ElevationOptionWriteDesc,
3690 MessageId::ElevationOptionFullAccessDesc,
3691 MessageId::ElevationOptionAbortDesc,
3692 MessageId::ContextAutoCompacting,
3693 MessageId::ContextManualCompacting,
3694 MessageId::ContextCompactionQueued,
3695 MessageId::ContextCompactionAlreadyRunning,
3696 MessageId::ContextCompactionQueueFull,
3697 MessageId::ContextCompactionQueueClosed,
3698 MessageId::ContextCompactionRouteInvalid,
3699 MessageId::CtxInspTitle,
3700 MessageId::CtxInspSessionContext,
3701 MessageId::CtxInspSystemPrompt,
3702 MessageId::CtxInspReferences,
3703 MessageId::CtxInspRecentTools,
3704 MessageId::CtxInspToolSchemaCosts,
3705 MessageId::CtxInspModel,
3706 MessageId::CtxInspWorkspace,
3707 MessageId::CtxInspSession,
3708 MessageId::CtxInspContext,
3709 MessageId::CtxInspTranscript,
3710 MessageId::CtxInspWorkspaceStatus,
3711 MessageId::CtxInspNotSampledYet,
3712 MessageId::CtxInspOk,
3713 MessageId::CtxInspHigh,
3714 MessageId::CtxInspCritical,
3715 MessageId::CtxInspIncluded,
3716 MessageId::CtxInspAttached,
3717 MessageId::CtxInspNotIncluded,
3718 MessageId::CtxInspOutputCaptured,
3719 MessageId::CtxInspNoOutputYet,
3720 MessageId::CtxInspNoSystemPrompt,
3721 MessageId::CtxInspNoReferences,
3722 MessageId::CtxInspNoToolActivity,
3723 MessageId::CtxInspVHint,
3724 MessageId::CtxInspCells,
3725 MessageId::CtxInspApiMessages,
3726 MessageId::CtxInspActive,
3727 MessageId::CtxInspCell,
3728 MessageId::CtxInspMoreReferences,
3729 MessageId::CtxInspStablePrefix,
3730 MessageId::CtxInspVolatileWorkingSet,
3731 MessageId::CtxInspFirstLine,
3732 MessageId::CtxInspTotal,
3733 MessageId::CtxInspTextPromptLayers,
3734 MessageId::CtxInspSingleTextBlob,
3735 MessageId::CtxInspBlocks,
3736 MessageId::CtxInspBlock,
3737 MessageId::CtxInspTokens,
3738 MessageId::CtxInspLayers,
3739 MessageId::CtxInspNone,
3740 MessageId::CtxInspEmpty,
3741 MessageId::CtxInspCacheFriendly,
3742 MessageId::CtxInspChangesByTurn,
3743 MessageId::CtxInspStablePrefixOnly,
3744 MessageId::CtxInspCacheTip,
3745 MessageId::ToolFamilyRead,
3746 MessageId::ToolFamilyPatch,
3747 MessageId::ToolFamilyRun,
3748 MessageId::ToolFamilyFind,
3749 MessageId::ToolFamilyDelegate,
3750 MessageId::ToolFamilyFanout,
3751 MessageId::ToolFamilyRlm,
3752 MessageId::ToolFamilyVerify,
3753 MessageId::ToolFamilyThink,
3754 MessageId::ToolFamilyGeneric,
3755 MessageId::ToolReceiptDone,
3756 MessageId::ToolReceiptLinesSingular,
3757 MessageId::ToolReceiptLinesPlural,
3758 MessageId::CmdVoiceDescription,
3759 MessageId::CmdVoiceSendDescription,
3760 MessageId::CmdVoiceControlDescription,
3761 MessageId::VoiceEnabled,
3762 MessageId::VoiceDisabled,
3763 MessageId::VoiceSendEnabled,
3764 MessageId::VoiceSendDisabled,
3765 MessageId::VoiceControlEnabled,
3766 MessageId::VoiceControlDisabled,
3767 MessageId::VoiceErrNoAuth,
3768 MessageId::VoiceErrNoRecorder,
3769 MessageId::VoiceErrNetwork,
3770 MessageId::VoiceErrEmptySend,
3771 MessageId::VoiceErrTooShort,
3772 MessageId::VoiceRecording,
3773 MessageId::VoiceProcessing,
3774 MessageId::VoiceTranscribed,
3775 MessageId::NotificationApprovalNeeded,
3776 MessageId::NotificationInputNeeded,
3777 MessageId::NotificationElevationNeeded,
3778 MessageId::NotificationDecisionWebHint,
3779 MessageId::NotificationTurnFailed,
3780 MessageId::NotificationProviderFallback,
3781 MessageId::ApprovalNeverPostureBlocked,
3782 MessageId::ApprovalTimedOutDenied,
3783 MessageId::NotificationWebApproved,
3784 MessageId::NotificationWebDenied,
3785 MessageId::NotificationInputSubmitFailed,
3786 MessageId::NotificationTurnComplete,
3787 MessageId::NotificationSubagentComplete,
3788 MessageId::NotificationSubagentFailed,
3789 MessageId::NotificationSubagentInterrupted,
3790 MessageId::NotificationSubagentCancelled,
3791 MessageId::NotificationSubagentBudgetExhausted,
3792 MessageId::FooterWorkedChip,
3793 MessageId::FleetDraftTitle,
3794 MessageId::FleetDraftHeader,
3795 MessageId::SetupRemoteOnRampText,
3796 MessageId::ApprovalDescSafe,
3797 MessageId::ApprovalDescFileWrite,
3798 MessageId::ApprovalDescShell,
3799 MessageId::ApprovalDescNetwork,
3800 MessageId::ApprovalDescMcpRead,
3801 MessageId::ApprovalDescMcpAction,
3802 MessageId::ApprovalDescAgent,
3803 MessageId::ApprovalDescUnknown,
3804 MessageId::ApprovalImpactSafe,
3805 MessageId::ApprovalImpactFileWrite,
3806 MessageId::ApprovalImpactShell,
3807 MessageId::ApprovalImpactNetwork,
3808 MessageId::ApprovalImpactMcpRead,
3809 MessageId::ApprovalImpactMcpAction,
3810 MessageId::ApprovalImpactAgent,
3811 MessageId::ApprovalImpactUnknown,
3812 MessageId::ApprovalLabelCommand,
3813 MessageId::ApprovalLabelDir,
3814 MessageId::ApprovalLabelFile,
3815 MessageId::ApprovalLabelPreview,
3816 MessageId::ApprovalLabelProposedContent,
3817 MessageId::ApprovalLabelReplaceThis,
3818 MessageId::ApprovalLabelWithThis,
3819 MessageId::ApprovalLabelReplacementContent,
3820 MessageId::ApprovalLabelPath,
3821 MessageId::ApprovalLabelTarget,
3822 MessageId::ApprovalLabelInput,
3823 MessageId::ApprovalLabelAction,
3824 MessageId::ApprovalLabelType,
3825 MessageId::ApprovalLabelPrompt,
3826 MessageId::ApprovalLabelAbout,
3827 MessageId::ApprovalLabelImpact,
3828 MessageId::SetupConstitutionFileNotChecked,
3829 MessageId::SetupConstitutionFileMissing,
3830 MessageId::SetupConstitutionFileLoadedSelected,
3831 MessageId::SetupConstitutionFileLoadedInactive,
3832 MessageId::SetupConstitutionFileLoadedUnselected,
3833 MessageId::SetupConstitutionFileEmpty,
3834 MessageId::SetupConstitutionFileInvalid,
3835 MessageId::SetupConstitutionFileUnreadable,
3836 MessageId::SetupConstitutionFilePathError,
3837 MessageId::SetupExpertOverrideNotChecked,
3838 MessageId::SetupExpertOverrideMissing,
3839 MessageId::SetupExpertOverrideActive,
3840 MessageId::SetupExpertOverrideDisabled,
3841 MessageId::SetupExpertOverrideEmpty,
3842 MessageId::SetupExpertOverrideUnreadable,
3843 MessageId::SetupExpertOverridePathError,
3844 MessageId::SetupAutonomyUnspecified,
3845 MessageId::SetupGuidedPurposeCoding,
3846 MessageId::SetupGuidedPurposeResearch,
3847 MessageId::SetupGuidedPurposeOperations,
3848 MessageId::SetupGuidedPurposeMixed,
3849 MessageId::SetupGuidedPurposeAboutCoding,
3850 MessageId::SetupGuidedPurposeAboutResearch,
3851 MessageId::SetupGuidedPurposeAboutOperations,
3852 MessageId::SetupGuidedPurposeAboutMixed,
3853 MessageId::SetupGuidedStyleCoding,
3854 MessageId::SetupGuidedStyleResearch,
3855 MessageId::SetupGuidedStyleOperations,
3856 MessageId::SetupGuidedStyleMixed,
3857 MessageId::SetupGuidedEvidenceAssumptions,
3858 MessageId::SetupGuidedEvidenceTestsAndReceipts,
3859 MessageId::SetupGuidedEvidenceReleaseReceipts,
3860 MessageId::SetupGuidedNotes,
3861 MessageId::LaunchStartTitle,
3862 MessageId::LaunchResumeConfirm,
3863 MessageId::LaunchResumeConfirmTitle,
3864 MessageId::LaunchResumeConfirmBody,
3865 MessageId::LaunchResumeConfirmResume,
3866 MessageId::LaunchResumeConfirmCancel,
3867 MessageId::LaunchWorkDescription,
3868 MessageId::LaunchChatDescription,
3869 MessageId::LaunchWorkspaceGitReady,
3870 MessageId::LaunchWorkspaceFolderReady,
3871 MessageId::LaunchProviderConfigured,
3872 MessageId::LaunchProviderSetupNeeded,
3873 MessageId::LaunchGroupContinue,
3874 MessageId::LaunchGroupMore,
3875 MessageId::LaunchWorkspaceGitShort,
3876 MessageId::LaunchWorkspaceFolderShort,
3877 MessageId::LaunchProviderConfiguredShort,
3878 MessageId::LaunchProviderSetupShort,
3879 MessageId::LaunchMenuChangelog,
3880 MessageId::LaunchWorktreePrompt,
3881 MessageId::LaunchWorktreeNeedsGit,
3882 MessageId::LaunchWorktreeNameLabel,
3883 MessageId::LaunchHintMove,
3884 MessageId::LaunchHintOpen,
3885 MessageId::LaunchTipFlags,
3886 MessageId::LaunchSavedSessionSingular,
3887 MessageId::LaunchSavedSessionsPlural,
3888 MessageId::LaunchCreatingWorktree,
3889 MessageId::LaunchWorktreeFailed,
3890 MessageId::LaunchWorktreeCreated,
3891 MessageId::LaunchNoSavedSessions,
3892 MessageId::LaunchNewSession,
3893 MessageId::LaunchRecentHeading,
3894 MessageId::LaunchHelpLine,
3895 MessageId::LaunchSeeAllSessions,
3896 MessageId::LaunchNoRecentSessions,
3897 MessageId::LaunchResumeFailed,
3898 MessageId::LaunchNoModelConnected,
3899 MessageId::LaunchRunCommand,
3900 MessageId::LaunchMcpConnectedOne,
3901 MessageId::LaunchMcpConnectedMany,
3902 MessageId::LaunchMcpNeedsSignInOne,
3903 MessageId::LaunchMcpNeedsSignInMany,
3904 MessageId::LaunchMenuNewWorktree,
3905 MessageId::LaunchMenuResume,
3906 MessageId::LaunchMenuQuit,
3907 MessageId::LaunchNoticeClaude,
3908 MessageId::ReceiptSessionHooks,
3909 MessageId::PhaseIdle,
3910 MessageId::PhaseDraft,
3911 MessageId::PhaseWorking,
3912 MessageId::PhaseReasoning,
3913 MessageId::PhaseReading,
3914 MessageId::PhaseUsingTool,
3915 MessageId::PhaseSubagents,
3916 MessageId::PhaseVerifying,
3917 MessageId::PhaseWaitingOnYou,
3918 MessageId::PhaseDone,
3919 MessageId::PhaseFailed,
3920 MessageId::PhaseFinishing,
3921 MessageId::ChipModeAct,
3922 MessageId::ChipModePlan,
3923 MessageId::ChipModeOperate,
3924 MessageId::ChipPermissionReadOnly,
3925 MessageId::ChipPermissionAsk,
3926 MessageId::ChipPermissionAuto,
3927 MessageId::ChipPermissionFullAccess,
3928 MessageId::ChipPermissionNever,
3929 MessageId::FooterHintKeys,
3930 MessageId::FooterHintOutput,
3931 MessageId::FooterHintContext,
3932 MessageId::InfoLineHelp,
3933 MessageId::InfoLineContext,
3934 MessageId::InfoLineTtft,
3935 MessageId::InfoLinePeak,
3936 MessageId::InfoLineOffPeak,
3937 MessageId::InfoLineWhales,
3938 MessageId::InfoLineAutomation,
3939 MessageId::InfoLineNotConnected,
3940 MessageId::SessionMetricsTurn,
3941 MessageId::SessionMetricsTurns,
3942 MessageId::SessionMetricsStep,
3943 MessageId::SessionMetricsSteps,
3944 MessageId::SessionMetricsLlm,
3945 MessageId::SessionMetricsTools,
3946 MessageId::SessionMetricsTtft,
3947 MessageId::SessionMetricsTokensPerSecond,
3948 MessageId::RuntimeStoreRecovered,
3949 MessageId::ResumeExactSessionHint,
3950 MessageId::ResumeSavedSessionHint,
3951 MessageId::GoalProgressLabel,
3952 MessageId::GoalProgressReceipt,
3953 MessageId::GoalProgressNow,
3954 MessageId::GoalProgressNext,
3955 MessageId::CmdCacheUnpricedNote,
3956 MessageId::SessionMetricsCache,
3957 MessageId::SessionMetricsInput,
3958 MessageId::SessionMetricsStatusLine,
3959 MessageId::StatusLabelRoute,
3960 MessageId::StatusLabelDirectory,
3961 MessageId::StatusLabelProjectDocs,
3962 MessageId::StatusLabelMode,
3963 MessageId::StatusLabelSafety,
3964 MessageId::StatusLabelMcp,
3965 MessageId::StatusLabelFleet,
3966 MessageId::StatusLabelContextWindow,
3967 MessageId::StatusLabelWindowSource,
3968 MessageId::StatusLabelWindowOverride,
3969 MessageId::StatusLabelCatalog,
3970 MessageId::StatusLabelCloudFacts,
3971 MessageId::StatusLabelSession,
3972 MessageId::StatusLabelSessionTokens,
3973 MessageId::StatusLabelSessionCost,
3974 MessageId::StatusLabelToolOutputs,
3975 MessageId::StatusRouteSummary,
3976 MessageId::StatusProjectDocsNone,
3977 MessageId::StatusPostureSummary,
3978 MessageId::StatusShellOn,
3979 MessageId::StatusShellOff,
3980 MessageId::StatusTrustedWorkspace,
3981 MessageId::StatusWorkspace,
3982 MessageId::StatusApprovalAsk,
3983 MessageId::StatusApprovalAuto,
3984 MessageId::StatusApprovalFullAccess,
3985 MessageId::StatusApprovalNever,
3986 MessageId::StatusMcpConfigured,
3987 MessageId::StatusFleetDrifted,
3988 MessageId::StatusContextUsage,
3989 MessageId::StatusContextSourceConfigured,
3990 MessageId::StatusContextSourceConfiguredModel,
3991 MessageId::StatusContextSourceProviderReported,
3992 MessageId::StatusContextSourceKimiSafeFloor,
3993 MessageId::StatusContextSourceCatalog,
3994 MessageId::StatusContextSourceModelHint,
3995 MessageId::StatusContextSourceFallback,
3996 MessageId::StatusWindowOverrideProvider,
3997 MessageId::StatusWindowOverrideActiveProvider,
3998 MessageId::StatusSessionNotSaved,
3999 MessageId::StatusSessionSummary,
4000 MessageId::StatusSessionTokensSummary,
4001 MessageId::StatusCacheNotReported,
4002 MessageId::StatusCacheSummary,
4003 MessageId::StatusToolRawPressure,
4004 MessageId::StatusToolCompactReceipts,
4005 MessageId::StatusToolArtifacts,
4006 MessageId::StatusToolNone,
4007 MessageId::StatusSafetyReadOnlyUnenforced,
4008 MessageId::StatusSafetyReadOnly,
4009 MessageId::StatusSafetyWorkspaceWriteUnenforcedNetworkOn,
4010 MessageId::StatusSafetyWorkspaceWriteUnenforcedNetworkOff,
4011 MessageId::StatusSafetyWorkspaceWriteNetworkOn,
4012 MessageId::StatusSafetyWorkspaceWriteNetworkOff,
4013 MessageId::StatusSafetyDisabled,
4014 MessageId::StatusSafetyDisabledSetuidBlocked,
4015 MessageId::StatusSafetyDisabledSetuidAllowed,
4016 MessageId::StatusSafetyExternal,
4017 MessageId::StatusPointers,
4018 MessageId::EmptyStateNoGit,
4019 MessageId::EmptyStateMcpLabel,
4020 MessageId::EmptyStatePrompt,
4021 MessageId::SessionsSurfaceTitle,
4022 MessageId::SessionsPaneTitle,
4023 MessageId::SessionsHistoryPaneTitle,
4024 MessageId::SessionsActionResume,
4025 MessageId::SessionsActionSearch,
4026 MessageId::SessionsActionSort,
4027 MessageId::SessionsActionRename,
4028 MessageId::SessionsActionAllWorkspaces,
4029 MessageId::SessionsActionDelete,
4030 MessageId::SessionsActionClose,
4031 MessageId::SessionsScopeSortHeader,
4032 MessageId::SessionsEmptyTitle,
4033 MessageId::SessionsEmptyHint,
4034 MessageId::SessionsShowingAllWorkspaces,
4035 MessageId::SessionsScopedToWorkspace,
4036 MessageId::SessionsNewTitlePrompt,
4037 MessageId::SessionsDeletePrompt,
4038 MessageId::SessionsConfirmDelete,
4039 MessageId::SessionsNewSessionTitle,
4040 MessageId::SessionsOpenedHistory,
4041 MessageId::SessionsSortStatus,
4042 MessageId::SessionsSortRecent,
4043 MessageId::SessionsSortName,
4044 MessageId::SessionsSortSize,
4045 MessageId::SessionsSearchPrompt,
4046 MessageId::SessionsDeleteFailed,
4047 MessageId::SessionsDeleted,
4048 MessageId::SessionsNoSelection,
4049 MessageId::SessionsTitleLength,
4050 MessageId::SessionsOpenFailed,
4051 MessageId::SessionsLoadFailed,
4052 MessageId::SessionsResumed,
4053 MessageId::SessionsRenameFailed,
4054 MessageId::SessionsRenamed,
4055 MessageId::SessionsRailTitle,
4056 MessageId::SessionsRailEmpty,
4057 MessageId::SessionsRailBrowseAll,
4058 MessageId::SessionsRailShowingCount,
4059 MessageId::SessionsRailUnavailable,
4060 MessageId::SessionsActionArchive,
4061 MessageId::SessionsActionShowArchived,
4062 MessageId::SessionsArchived,
4063 MessageId::SessionsRestored,
4064 MessageId::SessionsArchiveFailed,
4065 MessageId::SessionsShowingArchived,
4066 MessageId::SessionsHidingArchived,
4067 MessageId::SessionsArchivedCompact,
4068 MessageId::SessionsNoResults,
4069 MessageId::SessionsDirectoryFailed,
4070 MessageId::SessionsPreviewFailed,
4071 MessageId::SessionsDeleteCancelled,
4072 MessageId::SessionsRenameCancelled,
4073 MessageId::SessionsShowingRange,
4074 MessageId::SessionsMessageCountCompact,
4075 MessageId::SessionsForkCompact,
4076 MessageId::SessionsCurrentCompact,
4077 MessageId::SessionsUnknownMode,
4078 MessageId::SessionsPreviewTitle,
4079 MessageId::SessionsPreviewId,
4080 MessageId::SessionsPreviewUpdated,
4081 MessageId::SessionsPreviewMessagesModel,
4082 MessageId::SessionsPreviewMode,
4083 MessageId::SessionsToolCall,
4084 MessageId::SessionsToolError,
4085 MessageId::SessionsToolResult,
4086 MessageId::SessionsServerTool,
4087 MessageId::SessionsImage,
4088 MessageId::SessionsTimeJustNow,
4089 MessageId::SessionsTimeMinutesAgo,
4090 MessageId::SessionsTimeHoursAgo,
4091 MessageId::SessionsTimeDaysAgo,
4092 MessageId::CtxInspRowSystemPrompt,
4093 MessageId::CtxInspRowMessages,
4094 MessageId::CtxInspRowFree,
4095 MessageId::CtxInspFreeTokensDetail,
4096 MessageId::CtxInspDrillTitle,
4097 MessageId::CtxInspSurfaceTitle,
4098 MessageId::CtxInspActionSelect,
4099 MessageId::CtxInspActionDrillDown,
4100 MessageId::CtxInspActionClose,
4101 MessageId::CtxInspUsedTokens,
4102 MessageId::CtxInspAutoCompactAt,
4103 MessageId::CtxInspRowTokens,
4104 MessageId::CtxInspRowCompaction,
4105 MessageId::CtxInspRowAnchors,
4106 MessageId::CtxInspCompactionNever,
4107 MessageId::CtxInspCompactionDetail,
4108 MessageId::CtxInspCompactionRestored,
4109 MessageId::CtxInspCompactionPathSummary,
4110 MessageId::CtxInspCompactionPathPrune,
4111 MessageId::CtxInspCompactionAssistantKept,
4112 MessageId::CtxInspAnchorsNone,
4113 MessageId::CtxInspAnchorsPresent,
4114 MessageId::RouteSurfaceTitle,
4115 MessageId::RouteBrowseCatalog,
4116 MessageId::RouteActionType,
4117 MessageId::RouteActionSearchAnyModel,
4118 MessageId::RoutePanelHeader,
4119 MessageId::RouteProviderLabel,
4120 MessageId::RouteModelFirstAtomic,
4121 MessageId::PickerActionMove,
4122 MessageId::PickerActionSwitch,
4123 MessageId::PickerActionApply,
4124 MessageId::PickerActionAssignRoute,
4125 MessageId::FleetRoutePickUnavailable,
4126 MessageId::FleetRouteSaved,
4127 MessageId::FleetRouteInherited,
4128 MessageId::FleetRouteNotInCatalog,
4129 MessageId::PickerActionSetStartupDefault,
4130 MessageId::PickerActionPin,
4131 MessageId::PickerActionFleet,
4132 MessageId::PickerActionCancel,
4133 MessageId::PickerActionClear,
4134 MessageId::PickerActionClearSearch,
4135 MessageId::PickerActionBrowseAll,
4136 MessageId::PickerActionCustom,
4137 MessageId::PickerActionJump,
4138 MessageId::PickerActionEditKey,
4139 MessageId::PickerActionModels,
4140 MessageId::PickerActionUnavailable,
4141 MessageId::PickerActionSetKey,
4142 MessageId::PickerActionConfigured,
4143 MessageId::RouteNoModels,
4144 MessageId::RouteNoModelMatch,
4145 MessageId::ProviderNoMatchesTitle,
4146 MessageId::ProviderNoMatchesHint,
4147 MessageId::ProviderNoConfiguredTitle,
4148 MessageId::ProviderNoConfiguredHint,
4149 MessageId::ProviderNoCatalogModels,
4150 MessageId::ProviderExternalActionRevoke,
4151 MessageId::ProviderExternalActionChoices,
4152 MessageId::ProviderExternalActionReuseGrok,
4153 MessageId::ProviderExternalHintCodexReview,
4154 MessageId::ProviderExternalHintXaiReview,
4155 MessageId::ProviderExternalHintXaiApiKey,
4156 MessageId::XaiAuthChoiceTitle,
4157 MessageId::XaiAuthChoiceIntro,
4158 MessageId::XaiAuthChoiceApiKeyOption,
4159 MessageId::XaiAuthChoiceDeviceOAuthOption,
4160 MessageId::ChatgptAuthChoiceTitle,
4161 MessageId::ChatgptAuthChoiceIntro,
4162 MessageId::ChatgptAuthChoicePkceOption,
4163 MessageId::ChatgptAuthChoiceImportOption,
4164 MessageId::ProviderExternalHintChatgptReview,
4165 MessageId::ProviderExternalActionReuseCodex,
4166 MessageId::ProviderExternalDetailScope,
4167 MessageId::ProviderExternalDormant,
4168 MessageId::ProviderExternalOwnerPath,
4169 MessageId::ProviderExternalPinnedPathWarning,
4170 MessageId::ToolProjectionWarning,
4171 MessageId::SnapshotsDisabledTooLarge,
4172 MessageId::SnapshotsDisabledTooManyFiles,
4173 MessageId::SnapshotsDisabledUnsafeLocation,
4174 MessageId::SessionIdDivergedNotice,
4175 MessageId::RuntimeStoreUnreadableNotice,
4176 MessageId::RuntimeStoreUnwritableNotice,
4177 MessageId::ProviderExternalSemanticsRevoke,
4178 MessageId::ProviderExternalRevoke,
4179 MessageId::ProviderExternalChoiceTitle,
4180 MessageId::ProviderExternalActionChoose,
4181 MessageId::ProviderExternalChoiceIntro,
4182 MessageId::ProviderExternalDisabledLabel,
4183 MessageId::ProviderExternalDisabledDetail,
4184 MessageId::ProviderExternalReadOnlyLabel,
4185 MessageId::ProviderExternalReadOnlyDetail,
4186 MessageId::ProviderExternalReadOnlySemantics,
4187 MessageId::ProviderExternalManagedLabel,
4188 MessageId::ProviderExternalManagedDetail,
4189 MessageId::ProviderExternalConfirmTitle,
4190 MessageId::ProviderExternalActionGrant,
4191 MessageId::ProviderExternalOwnerLabel,
4192 MessageId::ProviderExternalExactPathLabel,
4193 MessageId::ProviderExternalSemanticsLabel,
4194 MessageId::ProviderExternalRejectUnsafe,
4195 MessageId::ProviderExternalRevokeLabel,
4196 MessageId::ProviderExternalRouteLabel,
4197 MessageId::ProviderExternalCustodyLine,
4198 MessageId::ProviderExternalBillingLine,
4199 MessageId::ProviderExternalRevokeScope,
4200 MessageId::ProviderExternalOwnerOnly,
4201 MessageId::ProviderExternalPinnedPathChanged,
4202 MessageId::ProviderExternalRevokeConfirmTitle,
4203 MessageId::ProviderExternalGrantedToast,
4204 MessageId::ProviderExternalSaveFailedToast,
4205 MessageId::ProviderExternalRevokedToast,
4206 MessageId::ProviderExternalRevokeFailedToast,
4207 MessageId::ThemeSurfaceTitle,
4208 MessageId::FleetRosterHeaderLabel,
4209 MessageId::FleetRosterTabRoster,
4210 MessageId::FleetRosterTabSetup,
4211 MessageId::FleetRosterWorkers,
4212 MessageId::FleetRosterMembersCount,
4213 MessageId::FleetRosterOperatorFirst,
4214 MessageId::FleetRosterOperatorRow,
4215 MessageId::FleetRosterShadowBadgeProjectOverride,
4216 MessageId::FleetRosterShadowBadgePersonalIgnored,
4217 MessageId::FleetRosterShadowBadgePersonalOverride,
4218 MessageId::FleetRosterShadowBadgeConfigOverride,
4219 MessageId::FleetRosterLayersLabel,
4220 MessageId::FleetRosterLayerWins,
4221 MessageId::FleetRosterLayerIgnored,
4222 MessageId::FleetReadyNotice,
4223 MessageId::FleetProfileIdentityVerifyFailed,
4224 MessageId::FleetProfileIdConflict,
4225 MessageId::FleetProfileProviderUnconfigured,
4226 MessageId::FleetModelAdded,
4227 MessageId::FleetModelAddedAs,
4228 MessageId::FleetModelAddedCreatedNote,
4229 MessageId::FleetModelAddedSelectedNote,
4230 MessageId::FleetModelRemoved,
4231 MessageId::FleetModelRemovedRoles,
4232 MessageId::FleetModelUnchanged,
4233 MessageId::FleetModelReasonOperatorRoute,
4234 MessageId::FleetModelReasonAlreadyPresent,
4235 MessageId::FleetModelErrorNeedsRoute,
4236 MessageId::FleetModelErrorNeedsRole,
4237 MessageId::FleetModelErrorNoSelection,
4238 MessageId::FleetModelErrorOperatorRoute,
4239 MessageId::FleetModelErrorNotInFleet,
4240 MessageId::FleetModelsEmpty,
4241 MessageId::FleetModelsHeader,
4242 MessageId::FleetModelsBroken,
4243 MessageId::FleetModelsFooter,
4244 MessageId::FleetModelsFactPrice,
4245 MessageId::FleetModelsFactContext,
4246 MessageId::FleetModelsFactTools,
4247 MessageId::FleetAddUsage,
4248 MessageId::FleetAddProviderUnconfigured,
4249 MessageId::FleetAddModelNotServed,
4250 MessageId::FleetAddFailed,
4251 MessageId::FleetRemoveUsage,
4252 MessageId::FleetRemoveFailed,
4253 MessageId::FleetToggleFailed,
4254 MessageId::FleetDestStepTitle,
4255 MessageId::FleetDestStepSubtitle,
4256 MessageId::FleetDestProjectLabel,
4257 MessageId::FleetDestPersonalLabel,
4258 MessageId::FleetDestProjectSummary,
4259 MessageId::FleetDestPersonalSummary,
4260 MessageId::FleetDestProjectDescription,
4261 MessageId::FleetDestPersonalDescription,
4262 MessageId::FleetDestPathLine,
4263 MessageId::FleetDestUnavailable,
4264 MessageId::FleetDestReasonNoProjectConfig,
4265 MessageId::FleetDestReasonWorkspaceMissing,
4266 MessageId::FleetDestReasonHomeUnavailable,
4267 MessageId::FleetDestWillReplace,
4268 MessageId::FleetDestOverridesProject,
4269 MessageId::FleetDestOverridesPersonal,
4270 MessageId::FleetDestOverridesBuiltIn,
4271 MessageId::FleetSavesToChip,
4272 MessageId::FleetSavesToUndecided,
4273 MessageId::FleetActionSaveProject,
4274 MessageId::FleetActionSavePersonal,
4275 MessageId::FleetActionReplaceProject,
4276 MessageId::FleetActionReplacePersonal,
4277 MessageId::FleetActionConfirmReplace,
4278 MessageId::FleetActionChangeDestination,
4279 MessageId::FleetActionBack,
4280 MessageId::FleetReviewSavesTo,
4281 MessageId::FleetModelRowBlockedNotice,
4282 MessageId::FleetDestProjectDisabledSave,
4283 MessageId::WorkflowStatusWaiting,
4284 MessageId::WorkflowStatusDegraded,
4285 MessageId::WorkflowRunFailedToast,
4286 MessageId::WorkflowDebrief,
4287 MessageId::WorkflowDispatchFailureLine,
4288 MessageId::WorkflowDispatchFailuresOmitted,
4289 MessageId::WorkflowDispatchFallbackTask,
4290 MessageId::WorkflowTranscriptDetails,
4291 MessageId::WorkflowReceiptRole,
4292 MessageId::WorkflowReceiptReasoning,
4293 MessageId::WorkflowReceiptVia,
4294 MessageId::WorkflowReceiptTokens,
4295 MessageId::WorkflowReceiptTools,
4296 MessageId::WorkflowReceiptDuration,
4297 MessageId::WorkflowReceiptUnknown,
4298 MessageId::WorkflowReceiptProviderReported,
4299 MessageId::WorkflowReceiptEstimated,
4300 MessageId::SidebarTasksLabel,
4301 MessageId::TaskOwnershipUnverified,
4302 MessageId::TaskInventoryUnavailable,
4303 MessageId::SidebarTodoLabel,
4304 MessageId::SidebarStopControl,
4305 MessageId::SidebarDestructiveArmed,
4306 MessageId::WorkSurfaceTodoProgress,
4307 MessageId::WorkSurfaceStopConfirmHint,
4308 MessageId::CoordinationWorkTitle,
4309 MessageId::CoordinationSummaryDecisions,
4310 MessageId::CoordinationSummaryContentions,
4311 MessageId::CoordinationSummaryReconciled,
4312 MessageId::CoordinationSchema,
4313 MessageId::CoordinationSequence,
4314 MessageId::CoordinationPerSectionLimit,
4315 MessageId::CoordinationDecisionsHeading,
4316 MessageId::CoordinationNone,
4317 MessageId::CoordinationNoneValue,
4318 MessageId::CoordinationStatus,
4319 MessageId::CoordinationOwner,
4320 MessageId::CoordinationVersion,
4321 MessageId::CoordinationWriteClaimsHeading,
4322 MessageId::CoordinationIsolated,
4323 MessageId::CoordinationSharedWorkspace,
4324 MessageId::CoordinationPaths,
4325 MessageId::CoordinationContracts,
4326 MessageId::CoordinationContentionsHeading,
4327 MessageId::CoordinationClaimant,
4328 MessageId::CoordinationDisposition,
4329 MessageId::CoordinationNeutralReconciliationHeading,
4330 MessageId::CoordinationCandidates,
4331 MessageId::CoordinationRetry,
4332 MessageId::CoordinationReviewer,
4333 MessageId::CoordinationVerifier,
4334 MessageId::CoordinationVerification,
4335 MessageId::CoordinationContextProjectionsHeading,
4336 MessageId::CoordinationContextDecisions,
4337 MessageId::CoordinationBytes,
4338 MessageId::CoordinationDeduplicated,
4339 MessageId::CoordinationOmitted,
4340 MessageId::CoordinationActiveHotPathsHeading,
4341 MessageId::CoordinationActiveClaims,
4342 MessageId::CoordinationMetricsNoteHeading,
4343 MessageId::CoordinationMetricsNoAuthoritativeSource,
4344 MessageId::CoordinationStatusProposed,
4345 MessageId::CoordinationStatusAccepted,
4346 MessageId::CoordinationStatusSuperseded,
4347 MessageId::ComposerSlashMenuHint,
4348 MessageId::ApprovalRepoLawBadge,
4349 MessageId::ApprovalRepoLawTitle,
4350 MessageId::ApprovalRepoLawWarning,
4351 MessageId::ApprovalRepoLawRuleLabel,
4352 MessageId::FilePickerMatchSingular,
4353 MessageId::FilePickerMatchesPlural,
4354 MessageId::FilePickerScanning,
4355 MessageId::BehavioralTipPlanning,
4356 MessageId::BehavioralTipBackgroundReceipt,
4357 MessageId::BehavioralTipClearedInput,
4358 MessageId::BehavioralTipMcpValidation,
4359 MessageId::BehavioralTipRepeatedCommand,
4360 MessageId::BehavioralTipDurableStateWritten,
4361 MessageId::BehavioralTipTodoWrite,
4362 MessageId::ConfigLabelContextualTips,
4363 MessageId::ConfigHintContextualTips,
4364 MessageId::ContextualTipsNotSaved,
4365 MessageId::SettingLockedDuringTurn,
4366 MessageId::SettingSubjectMode,
4367 MessageId::SettingSubjectThinking,
4368 MessageId::SettingSubjectModel,
4369 MessageId::SettingSubjectModelAndThinking,
4370 MessageId::SettingSubjectProvider,
4371 MessageId::SettingSubjectPermissions,
4372 MessageId::ThinkingControlledByAutoRouting,
4373 MessageId::SavedAsStartupDefault,
4374 MessageId::ModeAlreadyActiveSavedAsDefault,
4375 MessageId::StartupDefaultNotSaved,
4376 MessageId::StartupDefaultSubjectMode,
4377 MessageId::StartupDefaultSubjectThinking,
4378 MessageId::StartupDefaultSubjectModel,
4379 MessageId::StartupDefaultSubjectAll,
4380 MessageId::AutomationUsage,
4381 MessageId::AutomationManagerUnavailable,
4382 MessageId::AutomationListFailed,
4383 MessageId::AutomationActionFailed,
4384 MessageId::AutomationEmpty,
4385 MessageId::AutomationListHeading,
4386 MessageId::AutomationScopeNote,
4387 MessageId::AutomationNoun,
4388 MessageId::AutomationStatusLabel,
4389 MessageId::AutomationStatusActive,
4390 MessageId::AutomationStatusPaused,
4391 MessageId::AutomationRunStatusQueued,
4392 MessageId::AutomationRunStatusRunning,
4393 MessageId::AutomationRunStatusCompleted,
4394 MessageId::AutomationRunStatusFailed,
4395 MessageId::AutomationRunStatusCanceled,
4396 MessageId::AutomationActionInspect,
4397 MessageId::AutomationActionPause,
4398 MessageId::AutomationActionResume,
4399 MessageId::AutomationActionDelete,
4400 MessageId::AutomationActionRun,
4401 MessageId::AutomationActionCancel,
4402 MessageId::AutomationActionPaused,
4403 MessageId::AutomationActionResumed,
4404 MessageId::AutomationNextLabel,
4405 MessageId::AutomationNameLabel,
4406 MessageId::AutomationEditorNew,
4407 MessageId::AutomationEditorEdit,
4408 MessageId::AutomationEditorSchedule,
4409 MessageId::AutomationEditorDaily,
4410 MessageId::AutomationEditorWeekly,
4411 MessageId::AutomationEditorHourly,
4412 MessageId::AutomationEditorOnce,
4413 MessageId::AutomationEditorCustom,
4414 MessageId::AutomationEditorTime,
4415 MessageId::AutomationEditorDate,
4416 MessageId::AutomationEditorDays,
4417 MessageId::AutomationEditorLocalTime,
4418 MessageId::AutomationEditorProvider,
4419 MessageId::AutomationEditorDefaultModel,
4420 MessageId::AutomationEditorInheritedProvider,
4421 MessageId::AutomationEditorEnabled,
4422 MessageId::AutomationEditorControls,
4423 MessageId::AutomationEditorPromptControls,
4424 MessageId::AutomationEditorSaveFailed,
4425 MessageId::AutomationEditorBusy,
4426 MessageId::AutomationEditorSaved,
4427 MessageId::AutomationEditorPreviewUnavailable,
4428 MessageId::AutomationEditorConflict,
4429 MessageId::AutomationEditorInvalidWorkspace,
4430 MessageId::AutomationEditorModelControls,
4431 MessageId::AutomationEditorPausedPreview,
4432 MessageId::AutomationEditorInvalidSchedule,
4433 MessageId::AutomationEditorMonday,
4434 MessageId::AutomationEditorTuesday,
4435 MessageId::AutomationEditorWednesday,
4436 MessageId::AutomationEditorThursday,
4437 MessageId::AutomationEditorFriday,
4438 MessageId::AutomationEditorSaturday,
4439 MessageId::AutomationEditorSunday,
4440 MessageId::AutomationPromptLabel,
4441 MessageId::AutomationCwdLabel,
4442 MessageId::AutomationModeLabel,
4443 MessageId::AutomationAllowShellLabel,
4444 MessageId::AutomationTrustModeLabel,
4445 MessageId::AutomationAutoApproveLabel,
4446 MessageId::AutomationRruleLabel,
4447 MessageId::AutomationDeliveryLabel,
4448 MessageId::AutomationLastLabel,
4449 MessageId::AutomationRecentRunsLabel,
4450 MessageId::AutomationNoRuns,
4451 MessageId::AutomationRunsUnavailable,
4452 MessageId::AutomationTaskLabel,
4453 MessageId::AutomationDeletePreview,
4454 MessageId::AutomationDeleteConfirmationStale,
4455 MessageId::AutomationBandScheduled,
4456 MessageId::AutomationReceiptFired,
4457 MessageId::AutomationReceiptStarted,
4458 MessageId::AutomationReceiptCompleted,
4459 MessageId::AutomationReceiptCoalesced,
4460 MessageId::AutomationReceiptMissed,
4461 MessageId::AutomationReceiptExpired,
4462 MessageId::AutomationReceiptDeleted,
4463 MessageId::AutomationRunLabel,
4464 MessageId::AutomationDeletedRunsDetail,
4465 MessageId::WhaleStateResting,
4466 MessageId::WhaleStateThinking,
4467 MessageId::WhaleStateWorking,
4468 MessageId::WhaleStateWaiting,
4469 MessageId::WhaleStateBlocked,
4470 MessageId::WhaleStateOffline,
4471 MessageId::AgentStatusParked,
4472 MessageId::AgentStatusParkedRecovery,
4473 MessageId::WhaleAnimalScout,
4474 MessageId::WhaleAnimalPatch,
4475 MessageId::WhaleAnimalHarbor,
4476 MessageId::WhaleAnimalEcho,
4477 MessageId::WhaleAnimalKeel,
4478 MessageId::WhaleAnimalLantern,
4479 MessageId::WhaleAnimalPlain,
4480 MessageId::WhaleJobScout,
4481 MessageId::WhaleJobPatch,
4482 MessageId::WhaleJobHarbor,
4483 MessageId::WhaleJobEcho,
4484 MessageId::WhaleJobKeel,
4485 MessageId::WhaleJobLantern,
4486 MessageId::WhaleJobPlain,
4487 MessageId::AgentFocusOpened,
4488 MessageId::AgentFocusClosed,
4489 MessageId::AgentFocusBanner,
4490 MessageId::AgentFocusPosture,
4491 MessageId::AgentFocusPostureWrites,
4492 MessageId::AgentFocusPostureReadOnly,
4493 MessageId::AgentFocusPostureNetwork,
4494 MessageId::AgentFocusPostureNoNetwork,
4495 MessageId::AgentFocusPostureShellFull,
4496 MessageId::AgentFocusPostureShellReadOnly,
4497 MessageId::AgentFocusPostureShellNone,
4498 MessageId::AgentFocusComposerChip,
4499 MessageId::AgentFocusPlaceholder,
4500 MessageId::AgentFocusNoTranscript,
4501 MessageId::AgentFocusOmitted,
4502 MessageId::AgentFocusFollowUpDelivered,
4503 MessageId::AgentFocusFollowUpQueued,
4504 MessageId::AgentFocusFollowUpContinued,
4505 MessageId::AgentFocusFollowUpFailed,
4506 MessageId::FooterHintForAgents,
4507 MessageId::FooterHintToManage,
4508 MessageId::AgentRailQueuedCount,
4509 MessageId::PickerActionTestConnection,
4510 MessageId::ProviderCustomFormBaseUrl,
4511 MessageId::ProviderCustomFormModel,
4512 MessageId::ProviderCustomFormHint,
4513 MessageId::ProviderConnectionChecked,
4514 MessageId::ProviderConnectionCheckedPickModel,
4515 MessageId::ProviderTestConnectionNeedKey,
4516 MessageId::ProviderTestConnectionFailed,
4517 MessageId::ProviderTestConnectionNoEndpoint,
4518 MessageId::ComposerPlaceholderFollowUp,
4519 MessageId::ComposerPlaceholderSendNow,
4520 MessageId::ComposerHintSendWithQueue,
4521 MessageId::ComposerHintQueue,
4522 MessageId::ComposerHintQueueWithCount,
4523 MessageId::ComposerHintOfflineQueue,
4524 MessageId::ComposerHintOfflineConnect,
4525 MessageId::ComposerHintSendNow,
4526 MessageId::ComposerHintSendIntoTurn,
4527 MessageId::PendingSendingIntoTurnPrefix,
4528 MessageId::PendingCouldNotSendIntoTurnPrefix,
4529 MessageId::PendingEditingFollowUpPrefix,
4530 MessageId::PendingQueuedOnePrefix,
4531 MessageId::PendingQueuedManyPrefix,
4532 MessageId::PendingSendNowControls,
4533 MessageId::PendingSendNowDropControls,
4534 MessageId::PendingEscRestore,
4535 MessageId::PendingQueuedFollowUpPrefix,
4536 MessageId::PendingInputsHeader,
4537 MessageId::PendingContextHeader,
4538 MessageId::ToastQueuedFollowUp,
4539 MessageId::ToastQueuedFollowUpCount,
4540 MessageId::ToastQueuedOffline,
4541 MessageId::ToastSentIntoTurn,
4542 MessageId::ToastCouldNotSendIntoTurn,
4543 MessageId::ToastHookBlockedFollowUp,
4544 MessageId::ToastOfflineQueuedCount,
4545 MessageId::OperateBoardHeader,
4546 MessageId::OperateBoardBurnObserved,
4547 MessageId::OperateBoardBurnNoCap,
4548 MessageId::OperateBoardDirectionEmpty,
4549 MessageId::OperateBoardDirectionLine,
4550 MessageId::OperateBoardPlanMissing,
4551 MessageId::OperateBoardPlanHeader,
4552 MessageId::OperateBoardGantt,
4553 MessageId::ConfigCategoryAppearance,
4554 MessageId::ConfigCategoryModelsProviders,
4555 MessageId::ConfigCategoryFleet,
4556 MessageId::ConfigCategoryWork,
4557 MessageId::ConfigCategoryToolsMcp,
4558 MessageId::ConfigCategoryTrust,
4559 MessageId::ConfigCategoryMotion,
4560 MessageId::ConfigCategoryAdvanced,
4561 MessageId::ConfigFactCurrent,
4562 MessageId::ConfigFactSaved,
4563 MessageId::ConfigFactStartup,
4564 MessageId::ConfigFactSource,
4565 MessageId::ConfigFactScope,
4566 MessageId::ConfigFactApply,
4567 MessageId::ConfigFactKind,
4568 MessageId::ConfigFactAvailable,
4569 MessageId::ConfigFactObserved,
4570 MessageId::ConfigFactOpens,
4571 MessageId::ConfigLaneUnobserved,
4572 MessageId::ConfigSourceSession,
4573 MessageId::ConfigSourceUserSettings,
4574 MessageId::ConfigSourceConfig,
4575 MessageId::ConfigSourceManaged,
4576 MessageId::ConfigApplyEffectiveNow,
4577 MessageId::ConfigApplyOnSave,
4578 MessageId::ConfigApplyNextSession,
4579 MessageId::ConfigApplyRestart,
4580 MessageId::ConfigApplyReadOnly,
4581 MessageId::ConfigApplyReload,
4582 MessageId::ConfigApplyUiNowEngineRestart,
4583 MessageId::ConfigKindToggle,
4584 MessageId::ConfigKindChoice,
4585 MessageId::ConfigKindNumber,
4586 MessageId::ConfigKindText,
4587 MessageId::ConfigKindAction,
4588 MessageId::ConfigKindReadOnly,
4589 MessageId::ConfigRowActionNote,
4590 MessageId::ConfigRowDiagnosticNote,
4591 MessageId::ConfigNavHint,
4592 MessageId::ConfigActivateAgain,
4593 MessageId::ConfigSearchLabel,
4594 MessageId::ConfigEditChooseLabel,
4595 MessageId::ConfigChoiceFooter,
4596 MessageId::ConfigChoiceFooterCompact,
4597 MessageId::ConfigEditorApply,
4598 MessageId::ConfigEditorCancel,
4599 MessageId::ConfigLaneUnavailable,
4600 MessageId::ConfigSourceEnvironment,
4601 MessageId::ConfigSourceTerminal,
4602 MessageId::ConfigDescriptionDefault,
4603 MessageId::ConfigValueOn,
4604 MessageId::ConfigValueOff,
4605 MessageId::ConfigValueProviderDefault,
4606 MessageId::ConfigChoiceAsk,
4607 MessageId::ConfigChoiceAutoReview,
4608 MessageId::ConfigChoiceUseTuiDefault,
4609 MessageId::ConfigChoiceFullAccess,
4610 MessageId::ConfigChoiceNever,
4611 MessageId::ConfigChoiceModeAct,
4612 MessageId::ConfigChoiceModePlan,
4613 MessageId::ConfigChoiceModeOperate,
4614 MessageId::ConfigChoicePlacementTop,
4615 MessageId::ConfigChoicePlacementBottom,
4616 MessageId::ConfigChoicePlacementLeft,
4617 MessageId::ConfigChoicePlacementRight,
4618 MessageId::ConfigChoiceRailTasks,
4619 MessageId::ConfigChoiceRailAgents,
4620 MessageId::ConfigChoiceRailContext,
4621 MessageId::ConfigChoiceStatusCw,
4622 MessageId::ConfigChoiceStatusDots,
4623 MessageId::ConfigChoiceDiffFull,
4624 MessageId::ConfigChoiceDiffSummary,
4625 MessageId::ConfigChoiceDetailAsk,
4626 MessageId::ConfigChoiceDetailAutoReview,
4627 MessageId::ConfigChoiceDetailUseTuiDefault,
4628 MessageId::ConfigChoiceDetailFullAccess,
4629 MessageId::ConfigChoiceDetailNever,
4630 MessageId::ConfigChoiceDetailModeAgent,
4631 MessageId::ConfigChoiceDetailModePlan,
4632 MessageId::ConfigChoiceDetailModeOperate,
4633 MessageId::ConfigChoiceDetailPlacementTop,
4634 MessageId::ConfigChoiceDetailPlacementBottom,
4635 MessageId::ConfigChoiceDetailPlacementLeft,
4636 MessageId::ConfigChoiceDetailPlacementRight,
4637 MessageId::ConfigChoiceDetailPlacementOff,
4638 MessageId::ConfigChoiceDetailRailTasks,
4639 MessageId::ConfigChoiceDetailRailAgents,
4640 MessageId::ConfigChoiceDetailRailContext,
4641 MessageId::ConfigChoiceDetailLowMotionOn,
4642 MessageId::ConfigChoiceDetailLowMotionOff,
4643 MessageId::ConfigChoiceDetailFancyOn,
4644 MessageId::ConfigChoiceDetailFancyOff,
4645 MessageId::ConfigChoiceDetailShowThinkingOn,
4646 MessageId::ConfigChoiceDetailShowThinkingOff,
4647 MessageId::ConfigChoiceDetailThinkingHighlightOn,
4648 MessageId::ConfigChoiceDetailThinkingHighlightOff,
4649 MessageId::ConfigHintModel,
4650 MessageId::ConfigHintFastModel,
4651 MessageId::ConfigHintProvider,
4652 MessageId::ConfigHintApprovalMode,
4653 MessageId::ConfigHintPermissionPosture,
4654 MessageId::ConfigHintApprovalPolicy,
4655 MessageId::ConfigHintManagedApprovalPolicy,
4656 MessageId::ConfigHintManagedAllowShell,
4657 MessageId::ConfigHintAllowShell,
4658 MessageId::ConfigHintComposerMultilineMode,
4659 MessageId::ConfigHintBooleanValues,
4660 MessageId::ConfigHintDensity,
4661 MessageId::ConfigHintInlineDiffs,
4662 MessageId::ConfigHintToolCollapse,
4663 MessageId::ConfigHintBackgroundColor,
4664 MessageId::ConfigHintWorkSurfacePlacement,
4665 MessageId::ConfigHintRailPanel,
4666 MessageId::ConfigHintWorkSurfaceTopHeight,
4667 MessageId::ConfigHintWorkSurfaceSideWidth,
4668 MessageId::ConfigHintBaseUrl,
4669 MessageId::ConfigHintContextWindow,
4670 MessageId::ConfigHintEffectiveContextWindow,
4671 MessageId::ConfigHintCostCurrency,
4672 MessageId::ConfigHintCalmMode,
4673 MessageId::ConfigHintLowMotion,
4674 MessageId::ConfigHintFancyAnimations,
4675 MessageId::ConfigHintShowThinking,
4676 MessageId::ConfigHintThinkingDefaultExpanded,
4677 MessageId::ConfigHintThinkingPreviewLines,
4678 MessageId::ConfigHintHelpExpandGroups,
4679 MessageId::ConfigHintPinLastPrompt,
4680 MessageId::ConfigHintThinkingHighlight,
4681 MessageId::ConfigHintSynchronizedOutput,
4682 MessageId::ConfigHintDefaultMode,
4683 MessageId::ConfigHintMaxHistory,
4684 MessageId::ConfigHintAutoCompactThreshold,
4685 MessageId::ConfigHintDefaultModel,
4686 MessageId::ConfigHintReasoningEffort,
4687 MessageId::ConfigHintMcpOpen,
4688 MessageId::ConfigHintMcpReconnect,
4689 MessageId::ConfigHintMcpDiagnose,
4690 MessageId::ConfigHintPluginsOpen,
4691 MessageId::ConfigHintMcpConfigPath,
4692 MessageId::ConfigHintFleetMaxSpawnDepth,
4693 MessageId::ConfigHintFeatureSubagents,
4694 MessageId::ConfigHintFeatureWebSearch,
4695 MessageId::ConfigHintFeatureApplyPatch,
4696 MessageId::ConfigHintFeatureMcp,
4697 MessageId::ConfigHintFeatureExecPolicy,
4698 MessageId::ConfigHintFeatureVisionModel,
4699 MessageId::ConfigHintGoalCommand,
4700 MessageId::ConfigHintWorkflow,
4701 MessageId::SelectionCopiedAsMarkdown,
4702 MessageId::McpShowCachedWhileTurnRuns,
4703 MessageId::McpShowUnavailableWhileTurnRuns,
4704 MessageId::McpLivePoolRefreshDeferredWhileTurnRuns,
4705 MessageId::McpRetryDeferredWhileTurnRuns,
4706 ];
4707
4708 pub fn tr(locale: Locale, id: MessageId) -> Cow<'static, str> {
4709 rust_i18n::t!(format!("{id:?}"), locale = locale.tag())
4710 }
4711
4712 /// Resolve a message by its registry key — the `MessageId` variant name.
4713 ///
4714 /// The settings schema (`codewhale_config::SETTINGS_SCHEMA`) names the string
4715 /// a setting shows rather than carrying its prose, so it needs to resolve a
4716 /// key it holds as a `&str`. An unknown key returns the key itself, which the
4717 /// schema binding test in `crate::tui::views` fails on.
4718 pub fn tr_key(locale: Locale, key: &'static str) -> Cow<'static, str> {
4719 rust_i18n::t!(key, locale = locale.tag())
4720 }
4721
4722 pub fn thinking_translation_placeholder(locale: Locale) -> &'static str {
4723 match locale {
4724 Locale::En => "Thinking; translating when complete...",
4725 Locale::Ja => "思考中です。完了後に日本語へ翻訳します...",
4726 Locale::ZhHans => "正在思考,完成后翻译为简体中文...",
4727 Locale::ZhHant => "正在思考,完成後翻譯為繁體中文...",
4728 Locale::PtBr => "Pensando; traduzindo ao concluir...",
4729 Locale::Es419 => "Pensando; traduciendo al finalizar...",
4730 Locale::Vi => "Đang suy nghĩ; sẽ dịch sau khi hoàn thành...",
4731 Locale::Ko => "생각하는 중입니다. 완료되면 번역합니다...",
4732 Locale::Ca => "S'està pensant; es traduirà en acabar...",
4733 Locale::De => "Denkt nach; Übersetzung folgt nach Abschluss...",
4734 Locale::Fr => "Réflexion en cours ; traduction à la fin...",
4735 Locale::Id => "Sedang berpikir; akan diterjemahkan setelah selesai...",
4736 Locale::Hi => "सोच रहा है; पूरा होने पर अनुवाद होगा...",
4737 Locale::Ru => "Идут размышления; перевод будет после завершения...",
4738 Locale::Uk => "Тривають роздуми; переклад буде після завершення...",
4739 }
4740 }
4741
4742 pub fn thinking_translation_in_progress(locale: Locale) -> &'static str {
4743 match locale {
4744 Locale::En => "Translating thinking content...",
4745 Locale::Ja => "思考内容を翻訳中...",
4746 Locale::ZhHans => "正在翻译思考内容...",
4747 Locale::ZhHant => "正在翻譯思考內容...",
4748 Locale::PtBr => "Traduzindo o conteúdo de raciocínio...",
4749 Locale::Es419 => "Traduciendo el contenido de razonamiento...",
4750 Locale::Vi => "Đang dịch nội dung suy nghĩ...",
4751 Locale::Ko => "생각 내용을 번역하는 중...",
4752 Locale::Ca => "S'està traduint el contingut del raonament...",
4753 Locale::De => "Denkinhalte werden übersetzt...",
4754 Locale::Fr => "Traduction du contenu de réflexion...",
4755 Locale::Id => "Menerjemahkan konten pemikiran...",
4756 Locale::Hi => "विचार सामग्री का अनुवाद हो रहा है...",
4757 Locale::Ru => "Перевод содержимого рассуждений...",
4758 Locale::Uk => "Переклад вмісту міркувань...",
4759 }
4760 }
4761
4762 pub fn thinking_translation_complete(locale: Locale) -> &'static str {
4763 match locale {
4764 Locale::En => "Thinking translation complete",
4765 Locale::Ja => "思考内容の翻訳が完了しました",
4766 Locale::ZhHans => "思考内容翻译完成",
4767 Locale::ZhHant => "思考內容翻譯完成",
4768 Locale::PtBr => "Tradução do raciocínio concluída",
4769 Locale::Es419 => "Traducción del razonamiento completada",
4770 Locale::Vi => "Đã dịch xong nội dung suy nghĩ",
4771 Locale::Ko => "생각 내용 번역 완료",
4772 Locale::Ca => "Traducció del raonament completada",
4773 Locale::De => "Übersetzung der Denkinhalte abgeschlossen",
4774 Locale::Fr => "Traduction de la réflexion terminée",
4775 Locale::Id => "Terjemahan pemikiran selesai",
4776 Locale::Hi => "विचार अनुवाद पूरा हुआ",
4777 Locale::Ru => "Перевод рассуждений завершён",
4778 Locale::Uk => "Переклад міркувань завершено",
4779 }
4780 }
4781
4782 pub fn thinking_translation_failed(locale: Locale) -> &'static str {
4783 match locale {
4784 Locale::En => "Thinking translation failed",
4785 Locale::Ja => "思考内容の翻訳に失敗しました",
4786 Locale::ZhHans => "思考内容翻译失败",
4787 Locale::ZhHant => "思考內容翻譯失敗",
4788 Locale::PtBr => "Falha ao traduzir o raciocínio",
4789 Locale::Es419 => "Falló la traducción del razonamiento",
4790 Locale::Vi => "Dịch nội dung suy nghĩ thất bại",
4791 Locale::Ko => "생각 내용 번역 실패",
4792 Locale::Ca => "Ha fallat la traducció del raonament",
4793 Locale::De => "Übersetzung der Denkinhalte fehlgeschlagen",
4794 Locale::Fr => "Échec de la traduction de la réflexion",
4795 Locale::Id => "Terjemahan pemikiran gagal",
4796 Locale::Hi => "विचार अनुवाद विफल",
4797 Locale::Ru => "Не удалось перевести рассуждения",
4798 Locale::Uk => "Не вдалося перекласти міркування",
4799 }
4800 }
4801
4802 pub fn hidden_translation_failed(locale: Locale) -> &'static str {
4803 match locale {
4804 Locale::En => "Translation failed; original text is hidden.",
4805 Locale::Ja => "翻訳に失敗しました。原文は非表示です。",
4806 Locale::ZhHans => "翻译失败,原文已隐藏。",
4807 Locale::ZhHant => "翻譯失敗,原文已隱藏。",
4808 Locale::PtBr => "A tradução falhou; o texto original está oculto.",
4809 Locale::Es419 => "La traducción falló; el texto original está oculto.",
4810 Locale::Vi => "Dịch thất bại; văn bản gốc đã bị ẩn.",
4811 Locale::Ko => "번역에 실패했습니다. 원문은 숨겨져 있습니다.",
4812 Locale::Ca => "La traducció ha fallat; el text original està amagat.",
4813 Locale::De => "Übersetzung fehlgeschlagen; der Originaltext ist ausgeblendet.",
4814 Locale::Fr => "La traduction a échoué ; le texte original est masqué.",
4815 Locale::Id => "Terjemahan gagal; teks asli disembunyikan.",
4816 Locale::Hi => "अनुवाद विफल; मूल पाठ छिपा हुआ है.",
4817 Locale::Ru => "Перевод не удался; исходный текст скрыт.",
4818 Locale::Uk => "Переклад не вдався; оригінальний текст приховано.",
4819 }
4820 }
4821
4822 pub fn normalize_configured_locale(input: &str) -> Option<&'static str> {
4823 let normalized = normalize_locale_input(input);
4824 if matches!(normalized.as_str(), "" | "auto" | "system") {
4825 return Some("auto");
4826 }
4827 parse_locale(&normalized).map(Locale::tag)
4828 }
4829
4830 /// Whether a configured locale selects a shipped pack that intentionally
4831 /// relies on English fallback for missing messages.
4832 #[must_use]
4833 pub fn configured_locale_is_partial_pack(input: &str) -> bool {
4834 let normalized = normalize_locale_input(input);
4835 if matches!(normalized.as_str(), "" | "auto" | "system") {
4836 return false;
4837 }
4838 parse_locale(&normalized).is_some_and(|locale| {
4839 Locale::shipped().contains(&locale)
4840 && locale.is_partial_pack()
4841 && !Locale::shipped_complete().contains(&locale)
4842 })
4843 }
4844
4845 /// Human-facing list of accepted `locale` setting values, derived from the
4846 /// shipped packs so config hints and error messages cannot go stale as new
4847 /// locales land. `separator` is `", "` for prose and `" | "` for hints.
4848 #[must_use]
4849 pub fn configured_locale_values(separator: &str) -> String {
4850 let mut out = String::from("auto");
4851 for locale in Locale::shipped() {
4852 out.push_str(separator);
4853 out.push_str(locale.tag());
4854 }
4855 out
4856 }
4857
4858 pub fn resolve_locale(setting: &str) -> Locale {
4859 resolve_locale_with_env(setting, |key| std::env::var(key).ok())
4860 }
4861
4862 pub fn resolve_locale_with_env<F>(setting: &str, env: F) -> Locale
4863 where
4864 F: Fn(&str) -> Option<String>,
4865 {
4866 let normalized = normalize_locale_input(setting);
4867 if !matches!(normalized.as_str(), "" | "auto" | "system") {
4868 return parse_locale(&normalized).unwrap_or(Locale::En);
4869 }
4870
4871 for key in ["LC_ALL", "LC_MESSAGES", "LANG"] {
4872 if let Some(value) = env(key)
4873 && let Some(locale) = parse_locale(&normalize_locale_input(&value))
4874 {
4875 return locale;
4876 }
4877 }
4878
4879 Locale::En
4880 }
4881
4882 #[allow(dead_code)]
4883 pub fn truncate_to_width(text: &str, max_width: usize) -> String {
4884 if max_width == 0 {
4885 return String::new();
4886 }
4887 if text.width() <= max_width {
4888 return text.to_string();
4889 }
4890
4891 let ellipsis_width = '…'.width().unwrap_or(1);
4892 if max_width <= ellipsis_width {
4893 return "…".to_string();
4894 }
4895
4896 let limit = max_width - ellipsis_width;
4897 let mut out = String::new();
4898 let mut width = 0usize;
4899 // Iterate extended grapheme clusters, not chars: a Devanagari conjunct
4900 // (क + ् + ष), a combined mark (e + ́), or a ZWJ emoji sequence must
4901 // never be cut apart — a trailing virama or orphaned combining mark
4902 // renders as visibly broken shaping in the terminal.
4903 for cluster in text.graphemes(true) {
4904 let cluster_width = UnicodeWidthStr::width(cluster);
4905 if width + cluster_width > limit {
4906 break;
4907 }
4908 out.push_str(cluster);
4909 width += cluster_width;
4910 }
4911 out.push('…');
4912 out
4913 }
4914
4915 fn normalize_locale_input(input: &str) -> String {
4916 input
4917 .split('.')
4918 .next()
4919 .unwrap_or(input)
4920 .split('@')
4921 .next()
4922 .unwrap_or(input)
4923 .trim()
4924 .replace('_', "-")
4925 .to_lowercase()
4926 }
4927
4928 fn parse_locale(value: &str) -> Option<Locale> {
4929 if value == "c" || value == "posix" || value.starts_with("en") {
4930 return Some(Locale::En);
4931 }
4932 if value.starts_with("ja") {
4933 return Some(Locale::Ja);
4934 }
4935 if value.starts_with("zh") {
4936 if value.contains("hant")
4937 || value.contains("-tw")
4938 || value.contains("-hk")
4939 || value.contains("-mo")
4940 {
4941 return Some(Locale::ZhHant);
4942 }
4943 return Some(Locale::ZhHans);
4944 }
4945 if value.starts_with("pt") || value == "br" {
4946 return Some(Locale::PtBr);
4947 }
4948 if value.starts_with("es") {
4949 return Some(Locale::Es419);
4950 }
4951 if value.starts_with("vi") {
4952 return Some(Locale::Vi);
4953 }
4954 if value.starts_with("ko") {
4955 return Some(Locale::Ko);
4956 }
4957 if value.starts_with("ca") {
4958 return Some(Locale::Ca);
4959 }
4960 if value.starts_with("de") {
4961 return Some(Locale::De);
4962 }
4963 if value.starts_with("fr") {
4964 return Some(Locale::Fr);
4965 }
4966 if value.starts_with("id") {
4967 return Some(Locale::Id);
4968 }
4969 if value.starts_with("hi") {
4970 return Some(Locale::Hi);
4971 }
4972 if value.starts_with("ru") {
4973 return Some(Locale::Ru);
4974 }
4975 if value.starts_with("uk") {
4976 return Some(Locale::Uk);
4977 }
4978 None
4979 }
4980
4981 #[cfg(test)]
4982 mod tests {
4983 use super::*;
4984 use ratatui::{
4985 buffer::Buffer,
4986 layout::Rect,
4987 widgets::{Paragraph, Widget, Wrap},
4988 };
4989
4990 #[test]
4991 fn locale_setting_normalizes_supported_tags() {
4992 assert_eq!(normalize_configured_locale("auto"), Some("auto"));
4993 assert_eq!(normalize_configured_locale("ja_JP.UTF-8"), Some("ja"));
4994 assert_eq!(normalize_configured_locale("zh-CN"), Some("zh-Hans"));
4995 assert_eq!(normalize_configured_locale("zh-TW"), Some("zh-Hant"));
4996 assert_eq!(normalize_configured_locale("zh_HK.UTF-8"), Some("zh-Hant"));
4997 assert_eq!(normalize_configured_locale("pt"), Some("pt-BR"));
4998 assert_eq!(normalize_configured_locale("pt-PT"), Some("pt-BR"));
4999 assert_eq!(normalize_configured_locale("es"), Some("es-419"));
5000 assert_eq!(normalize_configured_locale("es-MX"), Some("es-419"));
5001 assert_eq!(normalize_configured_locale("ca-ES"), Some("ca"));
5002 assert_eq!(normalize_configured_locale("de_DE.UTF-8"), Some("de"));
5003 assert_eq!(normalize_configured_locale("fr-FR"), Some("fr"));
5004 assert_eq!(normalize_configured_locale("id-ID"), Some("id"));
5005 assert_eq!(normalize_configured_locale("hi_IN.UTF-8"), Some("hi"));
5006 assert_eq!(normalize_configured_locale("ru-RU"), Some("ru"));
5007 assert_eq!(normalize_configured_locale("uk_UA.UTF-8"), Some("uk"));
5008 }
5009
5010 #[test]
5011 fn partial_pack_status_tracks_the_shipped_locale_registry() {
5012 assert!(!configured_locale_is_partial_pack("auto"));
5013 assert!(!configured_locale_is_partial_pack("system"));
5014 assert!(!configured_locale_is_partial_pack("zh-Hant"));
5015 assert!(!configured_locale_is_partial_pack("zh_TW.UTF-8"));
5016 assert!(!configured_locale_is_partial_pack("vi"));
5017 assert!(!configured_locale_is_partial_pack("ko"));
5018
5019 for locale in Locale::shipped() {
5020 assert_eq!(
5021 configured_locale_is_partial_pack(locale.tag()),
5022 locale.is_partial_pack(),
5023 "{} partial-pack classification drifted",
5024 locale.tag()
5025 );
5026 assert_ne!(
5027 Locale::shipped_complete().contains(locale),
5028 locale.is_partial_pack(),
5029 "{} must be exactly one of complete or partial",
5030 locale.tag()
5031 );
5032 }
5033 }
5034
5035 #[test]
5036 fn locale_resolution_uses_config_then_environment_then_english() {
5037 assert_eq!(
5038 resolve_locale_with_env("ja", |_| Some("pt_BR.UTF-8".to_string())),
5039 Locale::Ja
5040 );
5041 assert_eq!(
5042 resolve_locale_with_env("auto", |key| {
5043 (key == "LANG").then(|| "zh_CN.UTF-8".to_string())
5044 }),
5045 Locale::ZhHans
5046 );
5047 assert_eq!(
5048 resolve_locale_with_env("auto", |key| {
5049 (key == "LANG").then(|| "zh_TW.UTF-8".to_string())
5050 }),
5051 Locale::ZhHant
5052 );
5053 assert_eq!(resolve_locale_with_env("auto", |_| None), Locale::En);
5054 }
5055
5056 pub fn missing_message_ids(locale: Locale) -> Vec<MessageId> {
5057 ALL_MESSAGE_IDS
5058 .iter()
5059 .copied()
5060 .filter(|id| tr(locale, *id).eq(&format!("{id:?}")))
5061 .collect()
5062 }
5063
5064 fn locale_json_source(locale: Locale) -> &'static str {
5065 match locale {
5066 Locale::En => include_str!("../locales/en.json"),
5067 Locale::Ja => include_str!("../locales/ja.json"),
5068 Locale::ZhHans => include_str!("../locales/zh-Hans.json"),
5069 Locale::ZhHant => include_str!("../locales/zh-Hant.json"),
5070 Locale::PtBr => include_str!("../locales/pt-BR.json"),
5071 Locale::Es419 => include_str!("../locales/es-419.json"),
5072 Locale::Vi => include_str!("../locales/vi.json"),
5073 Locale::Ko => include_str!("../locales/ko.json"),
5074 Locale::Ca => include_str!("../locales/ca.json"),
5075 Locale::De => include_str!("../locales/de.json"),
5076 Locale::Fr => include_str!("../locales/fr.json"),
5077 Locale::Id => include_str!("../locales/id.json"),
5078 Locale::Hi => include_str!("../locales/hi.json"),
5079 Locale::Ru => include_str!("../locales/ru.json"),
5080 Locale::Uk => include_str!("../locales/uk.json"),
5081 }
5082 }
5083
5084 #[test]
5085 fn shipped_complete_packs_have_no_missing_core_messages() {
5086 for locale in Locale::shipped_complete() {
5087 assert!(
5088 missing_message_ids(*locale).is_empty(),
5089 "{} is missing messages",
5090 locale.tag()
5091 );
5092 }
5093 }
5094
5095 #[test]
5096 fn work_stop_confirmation_is_explicitly_localized() {
5097 for locale in Locale::shipped_complete() {
5098 if *locale == Locale::En {
5099 continue;
5100 }
5101 assert_ne!(tr(*locale, MessageId::SidebarStopControl), "stop");
5102 assert_ne!(
5103 tr(*locale, MessageId::WorkSurfaceStopConfirmHint),
5104 "confirm stop · Esc cancels"
5105 );
5106 }
5107 }
5108
5109 #[test]
5110 fn coordination_work_chrome_is_explicitly_localized() {
5111 for locale in Locale::shipped_complete() {
5112 if *locale == Locale::En {
5113 continue;
5114 }
5115 assert_ne!(
5116 tr(*locale, MessageId::CoordinationWorkTitle),
5117 tr(Locale::En, MessageId::CoordinationWorkTitle),
5118 "{} fell back to the English Coordination Work title",
5119 locale.tag()
5120 );
5121 assert_ne!(
5122 tr(*locale, MessageId::CoordinationMetricsNoAuthoritativeSource),
5123 tr(
5124 Locale::En,
5125 MessageId::CoordinationMetricsNoAuthoritativeSource
5126 ),
5127 "{} fell back to the English coordination metrics note",
5128 locale.tag()
5129 );
5130 }
5131 }
5132
5133 fn raw_locale_messages(locale: Locale) -> serde_json::Map<String, serde_json::Value> {
5134 serde_json::from_str::<serde_json::Map<String, serde_json::Value>>(locale_json_source(
5135 locale,
5136 ))
5137 .unwrap_or_else(|err| panic!("{} locale json should parse: {err}", locale.tag()))
5138 }
5139
5140 fn raw_locale_keys(locale: Locale) -> std::collections::BTreeSet<String> {
5141 raw_locale_messages(locale).keys().cloned().collect()
5142 }
5143
5144 fn message_placeholders(value: &str) -> std::collections::BTreeSet<String> {
5145 value
5146 .split('{')
5147 .skip(1)
5148 .filter_map(|suffix| suffix.split_once('}').map(|(name, _)| name.to_string()))
5149 .collect()
5150 }
5151
5152 /// #5906: the parked-agent vocabulary is new copy on the busiest rows in
5153 /// the product, so it gets the same hard parity gate coordination copy
5154 /// has — and the recovery line must keep the tool tokens it names, or it
5155 /// tells an operator to type a verb that does not exist.
5156 #[test]
5157 fn parked_agent_copy_is_translated_and_keeps_its_tool_verbs() {
5158 for locale in Locale::shipped_complete() {
5159 let word = tr(*locale, MessageId::AgentStatusParked);
5160 assert!(
5161 !word.trim().is_empty(),
5162 "{} has no parked status word",
5163 locale.tag()
5164 );
5165 let recovery = tr(*locale, MessageId::AgentStatusParkedRecovery);
5166 assert!(
5167 recovery.contains("resume_from"),
5168 "{} lost the resume verb the agent tool exposes: {recovery}",
5169 locale.tag()
5170 );
5171 assert!(
5172 recovery.contains("cancel"),
5173 "{} lost the dismiss verb: {recovery}",
5174 locale.tag()
5175 );
5176 if *locale == Locale::En {
5177 continue;
5178 }
5179 assert_ne!(
5180 word,
5181 tr(Locale::En, MessageId::AgentStatusParked),
5182 "{} fell back to the English parked status word",
5183 locale.tag()
5184 );
5185 assert_ne!(
5186 recovery,
5187 tr(Locale::En, MessageId::AgentStatusParkedRecovery),
5188 "{} fell back to the English parked recovery line",
5189 locale.tag()
5190 );
5191 }
5192 }
5193
5194 #[test]
5195 fn coordination_complete_packs_have_raw_key_and_placeholder_parity() {
5196 let english = raw_locale_messages(Locale::En);
5197 let coordination_keys = english
5198 .keys()
5199 .filter(|key| key.starts_with("Coordination"))
5200 .collect::<Vec<_>>();
5201 assert_eq!(coordination_keys.len(), 39);
5202
5203 for locale in Locale::shipped_complete() {
5204 let pack = raw_locale_messages(*locale);
5205 for key in &coordination_keys {
5206 let english_value = english
5207 .get(*key)
5208 .and_then(serde_json::Value::as_str)
5209 .unwrap_or_else(|| panic!("English {key} must be a string"));
5210 let translated = pack
5211 .get(*key)
5212 .and_then(serde_json::Value::as_str)
5213 .unwrap_or_else(|| panic!("{} is missing raw key {key}", locale.tag()));
5214 assert_eq!(
5215 message_placeholders(translated),
5216 message_placeholders(english_value),
5217 "{} changed placeholders for {key}",
5218 locale.tag()
5219 );
5220 }
5221 }
5222 }
5223
5224 #[test]
5225 fn automation_complete_packs_have_raw_key_and_placeholder_parity() {
5226 let english = raw_locale_messages(Locale::En);
5227 let automation_keys = english
5228 .keys()
5229 .filter(|key| key.starts_with("Automation"))
5230 .collect::<Vec<_>>();
5231 // New room/editor strings are part of the same complete-pack contract.
5232 assert!(!automation_keys.is_empty());
5233
5234 for locale in Locale::shipped_complete() {
5235 let pack = raw_locale_messages(*locale);
5236 for key in &automation_keys {
5237 let english_value = english
5238 .get(*key)
5239 .and_then(serde_json::Value::as_str)
5240 .unwrap_or_else(|| panic!("English {key} must be a string"));
5241 let translated = pack
5242 .get(*key)
5243 .and_then(serde_json::Value::as_str)
5244 .unwrap_or_else(|| panic!("{} is missing raw key {key}", locale.tag()));
5245 assert_eq!(
5246 message_placeholders(translated),
5247 message_placeholders(english_value),
5248 "{} changed placeholders for {key}",
5249 locale.tag()
5250 );
5251 }
5252 }
5253 }
5254
5255 /// The `/cost` and `/tokens` honesty block is assembled by `{placeholder}`
5256 /// substitution, so a translation that drops or renames one silently ships a
5257 /// line with a literal `{priced}` in it — or worse, omits the count that
5258 /// makes the sentence true. Cost copy is exactly where a mistranslation
5259 /// becomes a false claim about money, so it gets the same hard parity gate
5260 /// the coordination pack has (#4318).
5261 #[test]
5262 fn cost_copy_has_raw_key_and_placeholder_parity_across_complete_packs() {
5263 let english = raw_locale_messages(Locale::En);
5264 let cost_keys = english
5265 .keys()
5266 .filter(|key| key.starts_with("CmdCost") || key.starts_with("CmdTokensCache"))
5267 .cloned()
5268 .collect::<Vec<_>>();
5269 // Guard against the filter silently matching nothing after a rename.
5270 assert!(
5271 cost_keys.len() >= 12,
5272 "expected the full CmdCost*/CmdTokensCache* set, found {cost_keys:?}"
5273 );
5274 // The keys this pass added must be in the set the gate covers.
5275 for required in [
5276 "CmdCostEstimateOnly",
5277 "CmdCostCoverage",
5278 "CmdCostCoverageUnknownLegacy",
5279 "CmdCostUnpricedTurns",
5280 "CmdCostUnpricedClasses",
5281 "CmdCostPricingProvenance",
5282 "CmdCostLivePricingDowngraded",
5283 "CmdCostLivePricingUnavailable",
5284 "CmdCostRoutesHeader",
5285 "CmdTokensCacheWriteTotal",
5286 ] {
5287 assert!(
5288 cost_keys.iter().any(|key| key == required),
5289 "{required} is missing from en.json"
5290 );
5291 }
5292
5293 for locale in Locale::shipped_complete() {
5294 let pack = raw_locale_messages(*locale);
5295 for key in &cost_keys {
5296 let english_value = english
5297 .get(key)
5298 .and_then(serde_json::Value::as_str)
5299 .unwrap_or_else(|| panic!("English {key} must be a string"));
5300 let translated = pack
5301 .get(key)
5302 .and_then(serde_json::Value::as_str)
5303 .unwrap_or_else(|| panic!("{} is missing raw key {key}", locale.tag()));
5304 assert_eq!(
5305 message_placeholders(translated),
5306 message_placeholders(english_value),
5307 "{} changed placeholders for {key}",
5308 locale.tag()
5309 );
5310 }
5311 }
5312 }
5313
5314 /// Key parity proves a pack *has* the subtotal and audited-route lines; it
5315 /// does not prove anyone translated them. A pack that copies the English
5316 /// string passes every structural gate and still ships English text to a
5317 /// Japanese user — and these two lines are the ones that say a money figure
5318 /// is incomplete and name the routes it was built from, which is exactly
5319 /// the copy a reader must be able to understand (#4318).
5320 #[test]
5321 fn every_complete_pack_localizes_the_subtotal_and_audited_route_copy() {
5322 for locale in Locale::shipped_complete()
5323 .iter()
5324 .filter(|locale| **locale != Locale::En)
5325 {
5326 for id in [
5327 MessageId::CmdCostReportSubtotal,
5328 MessageId::CmdCostReportUnknown,
5329 MessageId::CmdCostRoutesHeader,
5330 MessageId::CmdCostUnknownValue,
5331 MessageId::CmdCostCoverageUnknownLegacy,
5332 ] {
5333 let localized = tr(*locale, id);
5334 let english = tr(Locale::En, id);
5335 assert!(
5336 !localized.trim().is_empty(),
5337 "{} has empty copy for {id:?}",
5338 locale.tag()
5339 );
5340 assert_ne!(
5341 localized,
5342 english,
5343 "{} still ships the English string for {id:?}",
5344 locale.tag()
5345 );
5346 }
5347 // The subtotal headline must still carry its amount, and must not
5348 // reuse the complete-total wording — those two states are the whole
5349 // point of having separate keys.
5350 let subtotal = tr(*locale, MessageId::CmdCostReportSubtotal);
5351 assert!(
5352 subtotal.contains("{cost}"),
5353 "{} subtotal headline lost its amount",
5354 locale.tag()
5355 );
5356 assert_ne!(
5357 subtotal,
5358 tr(*locale, MessageId::CmdCostReport),
5359 "{} cannot distinguish a subtotal from a complete total",
5360 locale.tag()
5361 );
5362 // The unknown headline names no amount at all.
5363 let unknown = tr(*locale, MessageId::CmdCostReportUnknown);
5364 assert!(
5365 !unknown.contains("{cost}"),
5366 "{} unknown headline must not interpolate an amount",
5367 locale.tag()
5368 );
5369 }
5370 }
5371
5372 /// Both money surfaces must say "estimate". `/tokens` quotes the same total
5373 /// as `/cost`, so it cannot present it as settled while `/cost` hedges.
5374 #[test]
5375 fn every_complete_pack_marks_the_cost_total_as_an_estimate() {
5376 for locale in Locale::shipped_complete() {
5377 let disclaimer = tr(*locale, MessageId::CmdCostEstimateOnly);
5378 assert!(
5379 !disclaimer.trim().is_empty(),
5380 "{} has no cost estimate disclaimer",
5381 locale.tag()
5382 );
5383 let coverage = tr(*locale, MessageId::CmdCostCoverage);
5384 assert!(
5385 coverage.contains("{priced}") && coverage.contains("{turns}"),
5386 "{} coverage line lost its counts",
5387 locale.tag()
5388 );
5389 }
5390 }
5391
5392 /// `missing_message_ids` is blind to keys that exist in en but not in a
5393 /// "complete" pack — the English fallback returns the English string, so
5394 /// nothing looks missing. Keep the enum, en.json, and ALL_MESSAGE_IDS in
5395 /// exact sync so every other parity gate actually sees every message.
5396 #[test]
5397 fn message_id_list_english_pack_stay_in_exact_sync() {
5398 let en = raw_locale_keys(Locale::En);
5399 let ids: std::collections::BTreeSet<String> =
5400 ALL_MESSAGE_IDS.iter().map(|id| format!("{id:?}")).collect();
5401 assert_eq!(
5402 ids.len(),
5403 ALL_MESSAGE_IDS.len(),
5404 "ALL_MESSAGE_IDS contains duplicates"
5405 );
5406 let unlisted: Vec<_> = en.difference(&ids).collect();
5407 assert!(
5408 unlisted.is_empty(),
5409 "en.json keys absent from ALL_MESSAGE_IDS — every parity test is blind to them: {unlisted:?}"
5410 );
5411 let untranslatable: Vec<_> = ids.difference(&en).collect();
5412 assert!(
5413 untranslatable.is_empty(),
5414 "ALL_MESSAGE_IDS entries without an en.json string: {untranslatable:?}"
5415 );
5416 }
5417
5418 /// Raw key-set parity for every pack that claims completeness, in both
5419 /// directions. This is the test that fails when a new en key ships
5420 /// without translations instead of silently falling back to English.
5421 #[test]
5422 fn shipped_complete_packs_have_raw_key_parity_with_english() {
5423 let en = raw_locale_keys(Locale::En);
5424 for locale in Locale::shipped_complete() {
5425 if *locale == Locale::En {
5426 continue;
5427 }
5428 let pack = raw_locale_keys(*locale);
5429 let missing: Vec<_> = en.difference(&pack).collect();
5430 assert!(
5431 missing.is_empty(),
5432 "{} claims completeness but lacks {} key(s); the English fallback hides these at runtime: {missing:?}",
5433 locale.tag(),
5434 missing.len()
5435 );
5436 let extra: Vec<_> = pack.difference(&en).collect();
5437 assert!(
5438 extra.is_empty(),
5439 "{} defines key(s) en.json lacks: {extra:?}",
5440 locale.tag()
5441 );
5442 }
5443 }
5444
5445 #[test]
5446 fn current_session_pod_worker_copy_has_complete_locale_and_placeholder_parity() {
5447 let current_session_ids = [
5448 MessageId::SubagentsNoCurrentSessionFleetWorkers,
5449 MessageId::SubagentsCurrentSessionFleetWorkersTitle,
5450 MessageId::SubagentsCurrentSessionFleetWorkerRoles,
5451 MessageId::SubagentsCurrentSessionFleetWorkersStatus,
5452 ];
5453 let modal_ids = [
5454 MessageId::SubagentsEmptyGuidance,
5455 MessageId::SubagentsStatusRunning,
5456 MessageId::SubagentsStatusCompleted,
5457 MessageId::SubagentsStatusInterrupted,
5458 MessageId::SubagentsStatusFailed,
5459 MessageId::SubagentsStatusCancelled,
5460 MessageId::SubagentsRowStatusInterrupted,
5461 MessageId::SubagentsRowStatusCancelled,
5462 MessageId::SubagentsRowStatusBudgetExhausted,
5463 MessageId::SubagentsSummaryItem,
5464 MessageId::SubagentsGroupHeading,
5465 MessageId::SubagentsHeaderRoster,
5466 MessageId::SubagentsHeaderColumns,
5467 MessageId::SubagentsActionRefresh,
5468 MessageId::SubagentsActionRosterSetup,
5469 MessageId::SubagentsLabelReason,
5470 MessageId::SubagentsLabelRole,
5471 MessageId::SubagentsLabelPosture,
5472 MessageId::SubagentsLabelGit,
5473 MessageId::SubagentsLabelObjective,
5474 MessageId::SubagentsLabelResult,
5475 MessageId::SubagentsPostureDetails,
5476 MessageId::SubagentsValueOn,
5477 MessageId::SubagentsValueOff,
5478 MessageId::SubagentsShellNone,
5479 MessageId::SubagentsShellReadOnly,
5480 MessageId::SubagentsShellFull,
5481 MessageId::SubagentsBranch,
5482 MessageId::SubagentsBranchWithWorkspace,
5483 MessageId::SubagentsRoleWorker,
5484 MessageId::SubagentsRoleScout,
5485 MessageId::SubagentsRolePlanner,
5486 MessageId::SubagentsRoleBuilder,
5487 MessageId::SubagentsRoleVerifier,
5488 MessageId::SubagentsRoleReviewer,
5489 MessageId::SubagentsRoleConsultant,
5490 MessageId::SubagentsRoleCustom,
5491 ];
5492 let english = raw_locale_messages(Locale::En);
5493
5494 for locale in Locale::shipped_complete() {
5495 let pack = raw_locale_messages(*locale);
5496 for id in current_session_ids.iter().chain(modal_ids.iter()) {
5497 let id = *id;
5498 let key = format!("{id:?}");
5499 let english_value = english
5500 .get(&key)
5501 .and_then(serde_json::Value::as_str)
5502 .unwrap_or_else(|| panic!("English pack is missing {key}"));
5503 let translated = pack
5504 .get(&key)
5505 .and_then(serde_json::Value::as_str)
5506 .unwrap_or_else(|| panic!("{} is missing {key}", locale.tag()));
5507
5508 assert_eq!(
5509 message_placeholders(translated),
5510 message_placeholders(english_value),
5511 "{} changed placeholders for {key}",
5512 locale.tag()
5513 );
5514 if *locale != Locale::En && current_session_ids.contains(&id) {
5515 assert_ne!(
5516 translated,
5517 english_value,
5518 "{} must translate {key} instead of copying English",
5519 locale.tag()
5520 );
5521 }
5522 }
5523 }
5524 }
5525
5526 #[test]
5527 fn home_subagents_keeps_the_current_session_boundary_in_every_complete_pack() {
5528 let expected = [
5529 (Locale::Ca, "Treballadors de flota de la sessió actual:"),
5530 (Locale::De, "Flotten-Worker der aktuellen Sitzung:"),
5531 (Locale::En, "Fleet workers this session:"),
5532 (Locale::Es419, "Workers de flota de la sesión actual:"),
5533 (Locale::Fr, "Workers de la flotte de la session actuelle :"),
5534 (Locale::Hi, "वर्तमान सत्र के बेड़ा वर्कर:"),
5535 (Locale::Id, "Worker armada sesi saat ini:"),
5536 (Locale::Ja, "現在のセッションの艦隊ワーカー:"),
5537 (Locale::Ko, "현재 세션의 플릿 워커:"),
5538 (Locale::PtBr, "Workers da frota da sessão atual:"),
5539 (Locale::Ru, "Воркеры флота текущего сеанса:"),
5540 (Locale::Uk, "Воркери флоту поточного сеансу:"),
5541 (Locale::Vi, "Worker hạm đội của phiên hiện tại:"),
5542 (Locale::ZhHans, "当前会话的舰队工作器:"),
5543 (Locale::ZhHant, "目前工作階段的艦隊工作器:"),
5544 ];
5545 assert_eq!(expected.len(), Locale::shipped_complete().len());
5546
5547 for (locale, value) in expected {
5548 assert_eq!(
5549 tr(locale, MessageId::HomeSubagents),
5550 value,
5551 "{}",
5552 locale.tag()
5553 );
5554 }
5555 }
5556
5557 #[test]
5558 fn es_419_setup_review_hint_records_only_the_setup_snapshot() {
5559 assert_eq!(
5560 tr(Locale::Es419, MessageId::SetupOperateReviewHint),
5561 "Enter registra esta instantánea de configuración."
5562 );
5563 }
5564
5565 #[test]
5566 fn status_report_copy_has_placeholder_parity_across_complete_packs() {
5567 let english = raw_locale_messages(Locale::En);
5568 let status_ids = ALL_MESSAGE_IDS
5569 .iter()
5570 .filter(|id| format!("{id:?}").starts_with("Status"));
5571
5572 for id in status_ids {
5573 let key = format!("{id:?}");
5574 let english_value = english
5575 .get(&key)
5576 .and_then(serde_json::Value::as_str)
5577 .unwrap_or_else(|| panic!("English {key} must be a string"));
5578 for locale in Locale::shipped_complete() {
5579 let pack = raw_locale_messages(*locale);
5580 let translated = pack
5581 .get(&key)
5582 .and_then(serde_json::Value::as_str)
5583 .unwrap_or_else(|| panic!("{} is missing raw key {key}", locale.tag()));
5584 assert_eq!(
5585 message_placeholders(translated),
5586 message_placeholders(english_value),
5587 "{} changed placeholders for {key}",
5588 locale.tag()
5589 );
5590 }
5591 }
5592 }
5593
5594 #[test]
5595 fn status_report_copy_preserves_technical_identities_across_complete_packs() {
5596 let required: &[(MessageId, &[&str])] = &[
5597 (MessageId::StatusLabelMcp, &["MCP"]),
5598 (MessageId::StatusContextSourceKimiSafeFloor, &["Kimi Code"]),
5599 (
5600 MessageId::StatusWindowOverrideProvider,
5601 &["[providers.{table}]", "context_window", "config.toml"],
5602 ),
5603 (
5604 MessageId::StatusWindowOverrideActiveProvider,
5605 &["context_window", "config.toml"],
5606 ),
5607 (
5608 MessageId::StatusSafetyWorkspaceWriteUnenforcedNetworkOn,
5609 &["workspace-write"],
5610 ),
5611 (
5612 MessageId::StatusSafetyWorkspaceWriteUnenforcedNetworkOff,
5613 &["workspace-write"],
5614 ),
5615 (
5616 MessageId::StatusSafetyWorkspaceWriteNetworkOn,
5617 &["workspace-write"],
5618 ),
5619 (
5620 MessageId::StatusSafetyWorkspaceWriteNetworkOff,
5621 &["workspace-write"],
5622 ),
5623 (MessageId::StatusPointers, &["/tokens", "/statusline"]),
5624 ];
5625
5626 for locale in Locale::shipped_complete() {
5627 for (id, literals) in required {
5628 let translated = tr(*locale, *id);
5629 for literal in *literals {
5630 assert!(
5631 translated.contains(literal),
5632 "{} changed protected literal {literal:?} in {id:?}: {translated}",
5633 locale.tag()
5634 );
5635 }
5636 }
5637 }
5638 }
5639
5640 #[test]
5641 fn config_command_prose_is_translated_in_complete_locales() {
5642 let ids = [
5643 MessageId::ConfigCommandSource,
5644 MessageId::ConfigCommandInvalidValue,
5645 MessageId::ConfigSearchUpdated,
5646 MessageId::ConfigPromptSuggestionUpdated,
5647 MessageId::ConfigNotificationsSetHint,
5648 MessageId::ConfigNotificationUpdated,
5649 MessageId::ConfigNotificationsWholeNumber,
5650 MessageId::ConfigAuditSearchProvider,
5651 MessageId::ConfigAuditPromptSuggestion,
5652 MessageId::ConfigAuditNotifications,
5653 MessageId::ConfigHelpDiscoverable,
5654 ];
5655 for locale in Locale::shipped_complete() {
5656 for id in ids {
5657 let localized = tr(*locale, id);
5658 assert!(!localized.trim().is_empty(), "{} {id:?}", locale.tag());
5659 if *locale != Locale::En {
5660 assert_ne!(localized, tr(Locale::En, id), "{} {id:?}", locale.tag());
5661 }
5662 }
5663 }
5664
5665 assert!(tr(Locale::En, MessageId::ConfigCommandSource).contains("{source}"));
5666 assert!(tr(Locale::En, MessageId::ConfigCommandInvalidValue).contains("{choices}"));
5667 assert!(tr(Locale::En, MessageId::ConfigNotificationUpdated).contains("{scope}"));
5668 }
5669
5670 #[test]
5671 fn remote_env_strings_are_explicitly_localized_in_every_complete_pack() {
5672 let ids = [
5673 MessageId::CmdRemoteEnvDescription,
5674 MessageId::CmdRemoteEnvOverview,
5675 MessageId::CmdRemoteEnvOpening,
5676 MessageId::CmdRemoteEnvUnavailable,
5677 MessageId::CmdRemoteEnvSourceCustodyPolicy,
5678 MessageId::CmdRemoteEnvBrowserLabel,
5679 ];
5680
5681 for locale in Locale::shipped_complete() {
5682 let messages = serde_json::from_str::<serde_json::Map<String, serde_json::Value>>(
5683 locale_json_source(*locale),
5684 )
5685 .unwrap_or_else(|err| panic!("{} locale JSON should parse: {err}", locale.tag()));
5686 for id in ids {
5687 let key = format!("{id:?}");
5688 let value = messages
5689 .get(&key)
5690 .and_then(serde_json::Value::as_str)
5691 .unwrap_or_else(|| panic!("{} must explicitly define {key}", locale.tag()));
5692 assert!(
5693 !value.trim().is_empty(),
5694 "{} {key} must not be empty",
5695 locale.tag()
5696 );
5697 }
5698 }
5699 }
5700
5701 #[test]
5702 fn todo_write_tip_is_localized_and_keeps_the_command_placeholder() {
5703 let english = tr(Locale::En, MessageId::BehavioralTipTodoWrite);
5704 assert!(english.contains("{command}"));
5705
5706 for locale in Locale::shipped_complete() {
5707 let tip = tr(*locale, MessageId::BehavioralTipTodoWrite);
5708 assert!(
5709 tip.contains("{command}"),
5710 "{} todo_write tip must compose the command in code",
5711 locale.tag()
5712 );
5713 if *locale != Locale::En {
5714 assert_ne!(
5715 tip,
5716 english,
5717 "{} todo_write tip must be translated instead of copying English",
5718 locale.tag()
5719 );
5720 }
5721 }
5722 }
5723
5724 #[test]
5725 fn zh_hant_has_reached_en_parity_and_is_complete() {
5726 assert!(
5727 !Locale::ZhHant.is_partial_pack(),
5728 "zh-Hant is now a complete pack and must not be marked partial"
5729 );
5730 assert!(
5731 Locale::shipped_complete().contains(&Locale::ZhHant),
5732 "zh-Hant must be included in shipped_complete now that it has full en.json parity"
5733 );
5734 let en_keys = serde_json::from_str::<serde_json::Map<String, serde_json::Value>>(
5735 locale_json_source(Locale::En),
5736 )
5737 .expect("en locale json");
5738 let zh_hant_keys = serde_json::from_str::<serde_json::Map<String, serde_json::Value>>(
5739 locale_json_source(Locale::ZhHant),
5740 )
5741 .expect("zh-Hant locale json");
5742 assert_eq!(
5743 zh_hant_keys.len(),
5744 en_keys.len(),
5745 "zh-Hant must have the same number of keys as en.json"
5746 );
5747 }
5748
5749 #[test]
5750 fn shipped_setup_strings_are_explicitly_localized() {
5751 let setup_keys = ALL_MESSAGE_IDS
5752 .iter()
5753 .map(|id| format!("{id:?}"))
5754 .filter(|id| id.starts_with("Setup"))
5755 .collect::<Vec<_>>();
5756
5757 for locale in Locale::shipped_complete() {
5758 let messages = serde_json::from_str::<serde_json::Map<String, serde_json::Value>>(
5759 locale_json_source(*locale),
5760 )
5761 .unwrap_or_else(|err| panic!("{} locale json should parse: {err}", locale.tag()));
5762 for key in &setup_keys {
5763 assert!(
5764 messages.contains_key(key),
5765 "{} should define {key} explicitly",
5766 locale.tag()
5767 );
5768 }
5769 }
5770 }
5771
5772 #[test]
5773 fn zh_hans_constitution_copy_uses_charter_term() {
5774 let messages = serde_json::from_str::<serde_json::Map<String, serde_json::Value>>(
5775 locale_json_source(Locale::ZhHans),
5776 )
5777 .expect("zh-Hans locale json");
5778
5779 for (key, value) in &messages {
5780 let Some(value) = value.as_str() else {
5781 continue;
5782 };
5783 for literal_metaphor in ["宪法", "教义", "自由原则", "仓库法则"] {
5784 assert!(
5785 !value.contains(literal_metaphor),
5786 "zh-Hans {key} should use functional terminology instead of {literal_metaphor}: {value}"
5787 );
5788 }
5789 }
5790
5791 let setup_intro = tr(Locale::ZhHans, MessageId::SetupStepConstitutionWhy);
5792 assert!(setup_intro.contains("Codewhale"));
5793 assert!(setup_intro.contains("宪章"));
5794 assert!(!setup_intro.contains("代码"));
5795 // The romanized-brand guard lives on `setup_intro` above: the welcome
5796 // lead names commands, not the product, so asserting "Codewhale" here
5797 // would only force a brand into copy that does not need one (#5442).
5798 let welcome = tr(Locale::ZhHans, MessageId::OnboardWelcomeLead);
5799 assert!(!welcome.contains("代码"));
5800 assert!(
5801 tr(
5802 Locale::ZhHans,
5803 MessageId::SetupConstitutionFileLoadedUnselected
5804 )
5805 .contains("constitution.json")
5806 );
5807 }
5808
5809 #[test]
5810 fn home_quick_rows_name_flagship_capabilities_in_every_complete_pack() {
5811 // #5442: /home must name the shipped surfaces a new user never finds
5812 // from governance copy alone. First-run onboarding no longer carries a
5813 // command tour — contextual help and /setup own that job — so the
5814 // flagship-command guard lives on the /home surface that still shows it.
5815 for locale in Locale::shipped_complete() {
5816 for id in [
5817 MessageId::HomeQuickWorkspace,
5818 MessageId::HomeQuickRestore,
5819 MessageId::HomeQuickTokens,
5820 ] {
5821 let text = tr(*locale, id);
5822 assert!(!text.trim().is_empty(), "{} {id:?} is empty", locale.tag());
5823 }
5824 assert!(
5825 tr(*locale, MessageId::HomeQuickWorkspace).contains("/workspace"),
5826 "{} /home lost /workspace",
5827 locale.tag()
5828 );
5829 assert!(
5830 tr(*locale, MessageId::HomeQuickRestore).contains("/restore"),
5831 "{} /home lost /restore",
5832 locale.tag()
5833 );
5834 assert!(
5835 tr(*locale, MessageId::HomeQuickTokens).contains("/tokens"),
5836 "{} /home lost /tokens",
5837 locale.tag()
5838 );
5839 }
5840 }
5841
5842 #[test]
5843 fn home_quick_action_rows_share_one_command_column_in_every_pack() {
5844 // The quick-action block is a fixed-width list. The command name and
5845 // its padding are composed in English and must survive translation
5846 // byte-for-byte, or the column goes ragged in that locale alone.
5847 const ROWS: &[MessageId] = &[
5848 MessageId::HomeQuickWorkspace,
5849 MessageId::HomeQuickRestore,
5850 MessageId::HomeQuickTokens,
5851 MessageId::HomeQuickLinks,
5852 MessageId::HomeQuickSkills,
5853 MessageId::HomeQuickConfig,
5854 MessageId::HomeQuickSettings,
5855 MessageId::HomeQuickModel,
5856 MessageId::HomeQuickSubagents,
5857 MessageId::HomeQuickTaskList,
5858 MessageId::HomeQuickHelp,
5859 ];
5860 for id in ROWS {
5861 let english = tr(Locale::En, *id);
5862 let dash = english.find(" - ").expect("quick-action row separator");
5863 let prefix = &english[..dash + " - ".len()];
5864 for locale in Locale::shipped_complete() {
5865 let row = tr(*locale, *id);
5866 assert!(
5867 row.starts_with(prefix),
5868 "{} {id:?} moved the command column: expected prefix {prefix:?}, got {row:?}",
5869 locale.tag()
5870 );
5871 }
5872 }
5873 }
5874
5875 #[test]
5876 fn restore_copy_never_promises_to_rewind_the_conversation() {
5877 // #5442: `/restore` rolls *workspace files* back to a snapshot. `/undo`
5878 // is what drops a conversation turn. Copy that says "rewind a turn"
5879 // sends new users to the wrong command.
5880 for locale in Locale::shipped_complete() {
5881 let text = tr(*locale, MessageId::HomeQuickRestore);
5882 assert!(
5883 text.contains("/restore"),
5884 "{} HomeQuickRestore stopped naming /restore: {text}",
5885 locale.tag()
5886 );
5887 }
5888 let english = tr(Locale::En, MessageId::HomeQuickRestore);
5889 assert!(
5890 !english.contains("rewind a turn") && !english.contains("rewind turn"),
5891 "HomeQuickRestore describes /restore as rewinding a turn: {english}"
5892 );
5893 }
5894
5895 #[test]
5896 fn route_and_provider_picker_strings_are_translated_in_complete_locales() {
5897 // High-visibility model/provider empty states and footers must not
5898 // leak English through the fallback chain in complete packs.
5899 let ids = [
5900 MessageId::PickerActionMove,
5901 MessageId::PickerActionSwitch,
5902 MessageId::PickerActionApply,
5903 MessageId::PickerActionAssignRoute,
5904 MessageId::FleetRoutePickUnavailable,
5905 MessageId::FleetRouteSaved,
5906 MessageId::FleetRouteInherited,
5907 MessageId::FleetRouteNotInCatalog,
5908 MessageId::StatusFleetDrifted,
5909 MessageId::PickerActionSetStartupDefault,
5910 MessageId::PickerActionPin,
5911 MessageId::PickerActionFleet,
5912 MessageId::PickerActionCancel,
5913 MessageId::PickerActionClear,
5914 MessageId::PickerActionClearSearch,
5915 MessageId::PickerActionBrowseAll,
5916 MessageId::PickerActionCustom,
5917 MessageId::PickerActionJump,
5918 MessageId::PickerActionEditKey,
5919 MessageId::PickerActionModels,
5920 MessageId::PickerActionConfigured,
5921 MessageId::RouteNoModels,
5922 MessageId::RouteNoModelMatch,
5923 MessageId::ProviderNoMatchesTitle,
5924 MessageId::ProviderNoMatchesHint,
5925 MessageId::ProviderNoConfiguredTitle,
5926 MessageId::ProviderNoConfiguredHint,
5927 MessageId::ProviderNoCatalogModels,
5928 MessageId::ProviderCustomFormBaseUrl,
5929 MessageId::ProviderCustomFormModel,
5930 MessageId::ConfigHintProviderUrl,
5931 MessageId::SessionsOpenedHistory,
5932 MessageId::SessionsTimeJustNow,
5933 ];
5934 for locale in Locale::shipped_complete() {
5935 if *locale == Locale::En {
5936 continue;
5937 }
5938 for id in ids {
5939 let localized = tr(*locale, id);
5940 assert!(!localized.is_empty(), "{} empty for {id:?}", locale.tag());
5941 // Catalan "models" is the correct translation of the English
5942 // picker action — the words coincide. Every other id must
5943 // differ from English, or the pack is leaking the fallback.
5944 if matches!((*locale, id), (Locale::Ca, MessageId::PickerActionModels)) {
5945 continue;
5946 }
5947 assert_ne!(
5948 localized,
5949 tr(Locale::En, id),
5950 "{} should translate {id:?}",
5951 locale.tag()
5952 );
5953 }
5954 }
5955 }
5956
5957 #[test]
5958 fn launch_copy_is_translated_in_complete_locales() {
5959 let ids = [
5960 MessageId::ComposerPlaceholder,
5961 MessageId::ComposerPlaceholderFollowUp,
5962 MessageId::ComposerPlaceholderSendNow,
5963 MessageId::ComposerHintQueue,
5964 MessageId::EmptyStatePrompt,
5965 ];
5966 for locale in Locale::shipped_complete() {
5967 if *locale == Locale::En {
5968 continue;
5969 }
5970 for id in ids {
5971 let localized = tr(*locale, id);
5972 assert!(!localized.is_empty(), "{} empty for {id:?}", locale.tag());
5973 assert_ne!(
5974 localized,
5975 tr(Locale::En, id),
5976 "{} should translate {id:?}",
5977 locale.tag()
5978 );
5979 }
5980 }
5981 }
5982
5983 #[test]
5984 fn launch_choice_and_readiness_prose_is_translated_in_complete_locales() {
5985 let ids = [
5986 MessageId::LaunchStartTitle,
5987 MessageId::LaunchWorkDescription,
5988 MessageId::LaunchChatDescription,
5989 MessageId::LaunchWorkspaceFolderReady,
5990 MessageId::LaunchProviderSetupNeeded,
5991 MessageId::LaunchNewSession,
5992 MessageId::LaunchRecentHeading,
5993 MessageId::LaunchSeeAllSessions,
5994 MessageId::LaunchNoRecentSessions,
5995 MessageId::LaunchResumeFailed,
5996 MessageId::LaunchNoticeClaude,
5997 ];
5998 for locale in Locale::shipped_complete() {
5999 if *locale == Locale::En {
6000 continue;
6001 }
6002 for id in ids {
6003 let localized = tr(*locale, id);
6004 assert!(!localized.is_empty(), "{} empty for {id:?}", locale.tag());
6005 assert_ne!(
6006 localized,
6007 tr(Locale::En, id),
6008 "{} should translate {id:?}",
6009 locale.tag()
6010 );
6011 }
6012 }
6013 }
6014
6015 #[test]
6016 fn kimi_import_and_new_mcp_recommendations_have_complete_locale_parity() {
6017 let ids = [
6018 MessageId::McpRecommendedUnknownId,
6019 MessageId::McpRecommendationsHeading,
6020 MessageId::McpRecommendationsSafety,
6021 MessageId::McpRecommendationGithub,
6022 MessageId::McpRecommendationChrome,
6023 MessageId::McpRecommendationPlaywright,
6024 MessageId::McpRecommendationContainerUse,
6025 MessageId::PluginKimiUsage,
6026 MessageId::PluginKimiManagedRootHeading,
6027 MessageId::PluginKimiNoneFound,
6028 MessageId::PluginKimiLicenseUnspecified,
6029 MessageId::PluginKimiApplicable,
6030 MessageId::PluginKimiNotApplicable,
6031 MessageId::PluginKimiCandidateSummary,
6032 MessageId::PluginKimiCandidateDetails,
6033 MessageId::PluginKimiRejectedHeading,
6034 MessageId::PluginKimiInspectionFooter,
6035 MessageId::PluginKimiCandidateMissing,
6036 MessageId::PluginKimiCandidateChanged,
6037 MessageId::PluginKimiHomeMissing,
6038 MessageId::PluginKimiRootInspectFailed,
6039 MessageId::PluginKimiRootMustBeDirectory,
6040 MessageId::PluginKimiRootCanonicalizeFailed,
6041 MessageId::PluginKimiRootListFailed,
6042 MessageId::PluginKimiEntryReadFailed,
6043 MessageId::PluginKimiEntryLimit,
6044 MessageId::PluginKimiEntryInspectFailed,
6045 MessageId::PluginKimiEntryLinksRefused,
6046 MessageId::PluginKimiEntryOutsideRoot,
6047 MessageId::PluginKimiEntryCanonicalizeFailed,
6048 MessageId::PluginKimiManifestUnreadable,
6049 MessageId::PluginKimiManifestMustBeFile,
6050 MessageId::PluginKimiManifestInvalid,
6051 MessageId::PluginKimiDirectoryNameMismatch,
6052 MessageId::PluginKimiHashUnavailable,
6053 MessageId::PluginKimiRollbackDestinationMissing,
6054 MessageId::PluginKimiMismatchRemoved,
6055 MessageId::PluginKimiMismatchRollbackFailed,
6056 MessageId::PluginKimiUserPluginDirectory,
6057 MessageId::PluginKimiMarketplaceZipUnsupported,
6058 MessageId::PluginKimiMarketplaceRemoteUnsupported,
6059 MessageId::PluginKimiMarketplaceGzipTarball,
6060 ];
6061 let english = raw_locale_messages(Locale::En);
6062 for locale in Locale::shipped_complete() {
6063 let pack = raw_locale_messages(*locale);
6064 for id in ids {
6065 let key = format!("{id:?}");
6066 let english_value = english
6067 .get(&key)
6068 .and_then(serde_json::Value::as_str)
6069 .unwrap_or_else(|| panic!("English pack is missing {key}"));
6070 let translated = pack
6071 .get(&key)
6072 .and_then(serde_json::Value::as_str)
6073 .unwrap_or_else(|| panic!("{} is missing {key}", locale.tag()));
6074 assert_eq!(
6075 message_placeholders(translated),
6076 message_placeholders(english_value),
6077 "{} changed placeholders for {key}",
6078 locale.tag()
6079 );
6080 if *locale != Locale::En {
6081 assert_ne!(
6082 translated,
6083 english_value,
6084 "{} must translate {key} instead of copying English",
6085 locale.tag()
6086 );
6087 }
6088 }
6089 }
6090 }
6091
6092 #[test]
6093 fn extensions_modal_has_complete_translated_placeholder_parity() {
6094 let english = raw_locale_messages(Locale::En);
6095 let keys = english
6096 .keys()
6097 .filter(|key| key.starts_with("Extensions"))
6098 .cloned()
6099 .collect::<Vec<_>>();
6100 assert_eq!(keys.len(), 95, "the complete extensions locale set changed");
6101
6102 let prose_keys = [
6103 "ExtensionsMcpEmpty",
6104 "ExtensionsMcpBrowse",
6105 "ExtensionsMarketplaceUnavailable",
6106 "ExtensionsMcpNotInspected",
6107 "ExtensionsMcpRefresh",
6108 "ExtensionsNoItems",
6109 "ExtensionsNoMatches",
6110 "ExtensionsProductBrowserUseDescription",
6111 "ExtensionsProductChromeDescription",
6112 "ExtensionsProductPlaywrightDescription",
6113 "ExtensionsProductSandboxDescription",
6114 ];
6115 for locale in Locale::shipped_complete() {
6116 let pack = raw_locale_messages(*locale);
6117 for key in &keys {
6118 let english_value = english
6119 .get(key)
6120 .and_then(serde_json::Value::as_str)
6121 .unwrap_or_else(|| panic!("English {key} must be a string"));
6122 let translated = pack
6123 .get(key)
6124 .and_then(serde_json::Value::as_str)
6125 .unwrap_or_else(|| panic!("{} is missing raw key {key}", locale.tag()));
6126 assert_eq!(
6127 message_placeholders(translated),
6128 message_placeholders(english_value),
6129 "{} changed placeholders for {key}",
6130 locale.tag()
6131 );
6132 }
6133 if *locale != Locale::En {
6134 for key in prose_keys {
6135 assert_ne!(
6136 pack.get(key),
6137 english.get(key),
6138 "{} copied English prose for {key}",
6139 locale.tag()
6140 );
6141 }
6142 }
6143 }
6144 }
6145
6146 #[test]
6147 fn mcp_capability_metadata_copy_has_complete_locale_parity() {
6148 let ids = [
6149 MessageId::McpCapabilitiesAdvertised,
6150 MessageId::McpCapabilitiesLegacyFallback,
6151 MessageId::McpCapabilitiesNotObserved,
6152 ];
6153 let english = raw_locale_messages(Locale::En);
6154 for locale in Locale::shipped_complete() {
6155 let pack = raw_locale_messages(*locale);
6156 for id in ids {
6157 let key = format!("{id:?}");
6158 let english_value = english
6159 .get(&key)
6160 .and_then(serde_json::Value::as_str)
6161 .unwrap_or_else(|| panic!("English pack is missing {key}"));
6162 let translated = pack
6163 .get(&key)
6164 .and_then(serde_json::Value::as_str)
6165 .unwrap_or_else(|| panic!("{} is missing {key}", locale.tag()));
6166 assert_eq!(
6167 message_placeholders(translated),
6168 message_placeholders(english_value),
6169 "{} changed placeholders for {key}",
6170 locale.tag()
6171 );
6172 if *locale != Locale::En {
6173 assert_ne!(
6174 translated,
6175 english_value,
6176 "{} must translate {key} instead of copying English",
6177 locale.tag()
6178 );
6179 }
6180 }
6181 }
6182 }
6183
6184 #[test]
6185 fn tool_receipt_strings_have_complete_locale_parity() {
6186 let ids = [
6187 MessageId::ToolReceiptDone,
6188 MessageId::ToolReceiptLinesSingular,
6189 MessageId::ToolReceiptLinesPlural,
6190 ];
6191 let english = raw_locale_messages(Locale::En);
6192 for locale in Locale::shipped_complete() {
6193 let pack = raw_locale_messages(*locale);
6194 for id in ids {
6195 let key = format!("{id:?}");
6196 let english_value = english
6197 .get(&key)
6198 .and_then(serde_json::Value::as_str)
6199 .unwrap_or_else(|| panic!("English pack is missing {key}"));
6200 let translated = pack
6201 .get(&key)
6202 .and_then(serde_json::Value::as_str)
6203 .unwrap_or_else(|| panic!("{} is missing {key}", locale.tag()));
6204 assert_eq!(
6205 message_placeholders(translated),
6206 message_placeholders(english_value),
6207 "{} changed placeholders for {key}",
6208 locale.tag()
6209 );
6210 if *locale != Locale::En {
6211 assert_ne!(
6212 translated,
6213 english_value,
6214 "{} must translate {key} instead of copying English",
6215 locale.tag()
6216 );
6217 }
6218 }
6219 }
6220 }
6221
6222 #[test]
6223 fn mode_picker_strings_are_translated_in_non_english_locales() {
6224 // The mode hints are full sentences; every shipped non-English locale
6225 // must provide a real translation rather than leaking the English
6226 // string through the fallback chain.
6227 let sentences = [
6228 MessageId::AppModeAgentHint,
6229 MessageId::AppModeAutoHint,
6230 MessageId::AppModePlanHint,
6231 MessageId::AppModeYoloHint,
6232 MessageId::AppModeOperateHint,
6233 ];
6234 for locale in Locale::shipped_complete() {
6235 if *locale == Locale::En {
6236 continue;
6237 }
6238 for id in sentences {
6239 let localized = tr(*locale, id);
6240 assert!(!localized.is_empty(), "{} empty for {id:?}", locale.tag());
6241 assert_ne!(
6242 localized,
6243 tr(Locale::En, id),
6244 "{} should translate {id:?}",
6245 locale.tag()
6246 );
6247 }
6248 }
6249 }
6250
6251 #[test]
6252 fn zh_hant_hotbar_command_and_keybinding_strings_are_native() {
6253 for id in [
6254 MessageId::CmdHotbarDescription,
6255 MessageId::KbJumpPlanAgentYolo,
6256 MessageId::KbAltJumpPlanAgentYolo,
6257 ] {
6258 let localized = tr(Locale::ZhHant, id);
6259 assert!(!localized.is_empty(), "zh-Hant empty for {id:?}");
6260 assert_ne!(
6261 localized,
6262 tr(Locale::En, id),
6263 "zh-Hant should translate {id:?}"
6264 );
6265 }
6266 }
6267
6268 #[test]
6269 fn unsupported_locale_falls_back_to_english() {
6270 assert_eq!(
6271 resolve_locale_with_env("ar", |_| None),
6272 Locale::En,
6273 "Arabic is planned for QA but not shipped in the v0.7.6 core pack"
6274 );
6275 }
6276
6277 #[test]
6278 fn provider_description_is_present_for_all_locales() {
6279 for locale in Locale::shipped_complete() {
6280 let description = tr(*locale, MessageId::CmdProviderDescription);
6281 assert!(
6282 !description.is_empty(),
6283 "{} provider description should not be empty",
6284 locale.tag()
6285 );
6286 assert!(
6287 !description.contains("codewhale |"),
6288 "{} provider description should not name codewhale as a backend: {description}",
6289 locale.tag()
6290 );
6291 }
6292 }
6293
6294 #[test]
6295 fn width_truncation_handles_cjk_rtl_indic_and_latin_samples() {
6296 let samples = [
6297 ("zh-Hans", "输入以筛选配置"),
6298 ("ar", "تصفية الإعدادات"),
6299 ("hi", "सेटिंग खोजें"),
6300 ("pt-BR", "configurações filtradas"),
6301 ];
6302
6303 for (tag, sample) in samples {
6304 let truncated = truncate_to_width(sample, 12);
6305 assert!(
6306 truncated.width() <= 12,
6307 "{tag} sample overflowed: {truncated:?}"
6308 );
6309 }
6310 }
6311
6312 #[test]
6313 fn planned_script_samples_render_in_narrow_terminal_buffer() {
6314 let samples = [
6315 ("CJK", "输入以筛选配置"),
6316 ("RTL", "تصفية الإعدادات"),
6317 ("Indic", "सेटिंग खोजें"),
6318 ("Latin Global South", "configurações filtradas"),
6319 ];
6320
6321 for (label, sample) in samples {
6322 let area = Rect::new(0, 0, 18, 4);
6323 let mut buf = Buffer::empty(area);
6324 Paragraph::new(sample)
6325 .wrap(Wrap { trim: false })
6326 .render(area, &mut buf);
6327 let dump = buffer_text(&buf, area);
6328
6329 assert!(
6330 dump.chars().any(|ch| !ch.is_whitespace()),
6331 "{label} sample produced an empty render"
6332 );
6333 }
6334 }
6335
6336 fn buffer_text(buf: &Buffer, area: Rect) -> String {
6337 let mut out = String::new();
6338 for y in area.top()..area.bottom() {
6339 for x in area.left()..area.right() {
6340 out.push_str(buf[(x, y)].symbol());
6341 }
6342 out.push('\n');
6343 }
6344 out
6345 }
6346
6347 fn visible_row_text(buf: &Buffer, area: Rect, y: u16) -> String {
6348 let mut out = String::new();
6349 let mut skip_cells = 0usize;
6350 for x in area.left()..area.right() {
6351 if skip_cells > 0 {
6352 skip_cells -= 1;
6353 continue;
6354 }
6355 let symbol = buf[(x, y)].symbol();
6356 out.push_str(symbol);
6357 skip_cells = UnicodeWidthStr::width(symbol).saturating_sub(1);
6358 }
6359 out
6360 }
6361
6362 // --- Unicode / CJK / terminal-width QA (issue #3488) -------------------
6363 // `truncate_to_width` is the localization-layer truncation helper. These
6364 // verify it clips by display width (never byte/char count), preserves
6365 // semantic prefixes, never splits a grapheme cluster, and that mixed
6366 // English/CJK rows wrap inside a narrow (40-col) and medium (80-col)
6367 // terminal buffer without overflowing the column.
6368
6369 #[test]
6370 fn truncate_to_width_clips_cjk_by_display_width_and_keeps_prefix_intact() {
6371 // Each Han glyph is two columns. A 12-column budget fits the six-glyph
6372 // title exactly, so no truncation/ellipsis happens and the prefix survives.
6373 let title = "项目报告结果"; // 12 columns
6374 assert_eq!(truncate_to_width(title, 12), title);
6375
6376 // Oversized: clip on a whole-glyph boundary, append the ellipsis, and
6377 // stay within the budget by display width.
6378 let out = truncate_to_width("数据库迁移任务结果", 7); // 10 glyphs = 20 cols
6379 assert!(
6380 UnicodeWidthStr::width(out.as_str()) <= 7,
6381 "{out:?} overflowed"
6382 );
6383 assert!(out.ends_with('…'), "expected ellipsis, got {out:?}");
6384 assert!(!out.contains('\u{FFFD}'), "split a wide glyph: {out:?}");
6385 // The kept body is whole wide glyphs (each two columns) — never a half cell.
6386 let body = out.strip_suffix('…').unwrap_or(&out);
6387 assert!(
6388 body.chars()
6389 .map(|c| UnicodeWidthChar::width(c).unwrap_or(0))
6390 .sum::<usize>()
6391 <= 6,
6392 "body exceeded budget-minus-ellipsis: {out:?}"
6393 );
6394
6395 // A semantic ASCII prefix (e.g. a status verb) survives when it fits.
6396 let row = "running 数据库迁移任务结果预览测试";
6397 let out = truncate_to_width(row, 16);
6398 assert!(
6399 out.starts_with("running"),
6400 "semantic prefix dropped: {out:?}"
6401 );
6402 assert!(UnicodeWidthStr::width(out.as_str()) <= 16);
6403 assert!(!out.contains('\u{FFFD}'));
6404 }
6405
6406 #[test]
6407 fn truncate_to_width_never_splits_combining_marks_or_emoji() {
6408 // Combining mark (U+0301) and ZWJ are zero-width; they must not be
6409 // counted as columns and must never be cut mid-cluster into U+FFFD.
6410 let cafe = "cafe\u{0301}"; // "café", 4 columns
6411 assert_eq!(truncate_to_width(cafe, 10), cafe);
6412 let out = truncate_to_width("cafe\u{0301} overflow here", 6);
6413 assert!(UnicodeWidthStr::width(out.as_str()) <= 6);
6414 assert!(!out.contains('\u{FFFD}'));
6415
6416 // Emoji is two columns; truncation lands on a cluster boundary.
6417 let out = truncate_to_width("\u{1F433}\u{1F433}\u{1F433} whales everywhere", 5);
6418 assert!(UnicodeWidthStr::width(out.as_str()) <= 5);
6419 assert!(!out.contains('\u{FFFD}'));
6420 }
6421
6422 #[test]
6423 fn narrow_and_medium_terminal_wraps_mixed_width_rows_without_overflow() {
6424 // Issue #3488 acceptance: at a 40-col (narrow, macOS-Terminal-like) and
6425 // 80-col (medium) terminal, mixed English/CJK task titles and transcript
6426 // lines must (a) truncate to the column by display width, and (b) wrap
6427 // inside the buffer so no rendered row exceeds the terminal width.
6428 let fixtures = [
6429 "Task: 数据库迁移任务 — verify provider routing for issue #3488",
6430 "抹香鲸 is running codex/issue-3439-zhipu-glm-fixture @ issue-3439",
6431 "满員電車🫠 — full-width punctuation:『』【】 mixes with ASCII ids",
6432 ];
6433
6434 for width in [40usize, 80] {
6435 // (a) The truncation helper clips by display width.
6436 for fixture in fixtures {
6437 let out = truncate_to_width(fixture, width);
6438 assert!(
6439 UnicodeWidthStr::width(out.as_str()) <= width,
6440 "width={width}: truncated row overflowed: {out:?}"
6441 );
6442 assert!(
6443 !out.contains('\u{FFFD}'),
6444 "width={width}: split a glyph: {out:?}"
6445 );
6446 }
6447
6448 // (b) Wrapping the full mixed-width line inside a buffer of `width`
6449 // columns never lets a rendered row exceed the terminal width.
6450 for fixture in fixtures {
6451 let area = Rect::new(0, 0, width as u16, 6);
6452 let mut buf = Buffer::empty(area);
6453 Paragraph::new(fixture)
6454 .wrap(Wrap { trim: false })
6455 .render(area, &mut buf);
6456 let mut saw_text = false;
6457 for (row_idx, y) in (area.top()..area.bottom()).enumerate() {
6458 let row = visible_row_text(&buf, area, y);
6459 let trimmed = row.trim_end_matches('\u{0}').trim_end();
6460 assert!(
6461 UnicodeWidthStr::width(trimmed) <= width,
6462 "width={width} row {row_idx}: wrapped row overflowed ({} cols): {trimmed:?}",
6463 UnicodeWidthStr::width(trimmed)
6464 );
6465 saw_text |= trimmed.chars().any(|ch| !ch.is_whitespace());
6466 }
6467 assert!(
6468 saw_text,
6469 "width={width}: mixed fixture produced an empty render"
6470 );
6471 }
6472 }
6473 }
6474
6475 // --- Cyrillic script fixtures (ru/uk, #3092 / #4791) -------------------
6476 // Russian and Ukrainian share the Cyrillic script but are different
6477 // languages. These fixtures lock the failure modes seen in real
6478 // machine-translated packs: Russian-only letters (ы/э/ъ) leaking into
6479 // the Ukrainian pack, Ukrainian-only letters (і/ї/є/ґ) leaking into the
6480 // Russian pack, untranslated English prose hiding behind the fallback,
6481 // and one pack copied into the other.
6482
6483 fn has_cyrillic(value: &str) -> bool {
6484 value
6485 .chars()
6486 .any(|ch| ('\u{0400}'..='\u{04FF}').contains(&ch))
6487 }
6488
6489 fn has_devanagari(value: &str) -> bool {
6490 value
6491 .chars()
6492 .any(|ch| ('\u{0900}'..='\u{097F}').contains(&ch))
6493 }
6494
6495 /// Latin words remaining after the exempt categories are stripped:
6496 /// `code spans`, {placeholders}, URLs, slash commands, env-style
6497 /// ALL-CAPS tokens, and the product-term allowlist from
6498 /// `locales/AGENTS.md`. Anything left over in a Cyrillic or Devanagari
6499 /// string is mixed-language copy.
6500 fn latin_words_in_translated_copy(value: &str) -> Vec<String> {
6501 const ALLOWED: &[&str] = &[
6502 "codewhale",
6503 "deepseek",
6504 "fleet",
6505 "plan",
6506 "act",
6507 "operate",
6508 "ask",
6509 "auto",
6510 "review",
6511 "full",
6512 "access",
6513 "enter",
6514 "esc",
6515 "alt",
6516 "ctrl",
6517 "shift",
6518 "tab",
6519 "space",
6520 "backspace",
6521 "delete",
6522 "api",
6523 "json",
6524 "toml",
6525 "yaml",
6526 "yml",
6527 "tui",
6528 "ci",
6529 "cd",
6530 "mcp",
6531 "url",
6532 "uri",
6533 "dns",
6534 "ssh",
6535 "http",
6536 "https",
6537 "git",
6538 "github",
6539 "gitee",
6540 "openai",
6541 "anthropic",
6542 "gemini",
6543 "kimi",
6544 "codex",
6545 "claude",
6546 "vllm",
6547 "ollama",
6548 "sglang",
6549 "npm",
6550 "rust",
6551 "cargo",
6552 "linux",
6553 "macos",
6554 "windows",
6555 "id",
6556 "ok",
6557 "true",
6558 "false",
6559 "utf",
6560 "ascii",
6561 "cli",
6562 "ui",
6563 "md",
6564 "ai",
6565 "llm",
6566 "gpt",
6567 "faq",
6568 "docs",
6569 "admin",
6570 "oauth",
6571 "ssl",
6572 "tls",
6573 "jwt",
6574 "svg",
6575 "png",
6576 "wasm",
6577 "app",
6578 "slash",
6579 "skill",
6580 "plugin",
6581 "shell",
6582 ];
6583 let mut scrubbed = String::with_capacity(value.len());
6584 let mut chars = value.chars();
6585 let mut in_backtick = false;
6586 let mut in_brace = false;
6587 for ch in chars.by_ref() {
6588 match ch {
6589 '`' => in_backtick = !in_backtick,
6590 '{' if !in_backtick => in_brace = true,
6591 '}' if in_brace => in_brace = false,
6592 _ if !in_backtick && !in_brace => scrubbed.push(ch),
6593 _ => {}
6594 }
6595 }
6596 scrubbed
6597 .split(|c: char| !c.is_ascii_alphanumeric() && c != '-' && c != '/')
6598 .filter(|token| token.len() >= 2)
6599 .filter(|token| !token.contains('/') && !token.contains("://"))
6600 .filter(|token| token.is_ascii())
6601 .filter(|token| !token.chars().any(|c| c.is_ascii_digit()))
6602 .filter(|token| !token.chars().all(|c| c.is_ascii_uppercase()))
6603 .filter(|token| !ALLOWED.contains(&token.to_ascii_lowercase().as_str()))
6604 .map(str::to_string)
6605 .collect()
6606 }
6607
6608 /// High-visibility chrome where mixed-language copy is most visible.
6609 const SCRIPT_FIXTURE_IDS: &[MessageId] = &[
6610 MessageId::ComposerPlaceholder,
6611 MessageId::HistorySearchTitle,
6612 MessageId::HistorySearchPlaceholder,
6613 MessageId::StatusPickerTitle,
6614 MessageId::StatusPickerInstruction,
6615 MessageId::ConfigTitle,
6616 MessageId::CommandPaletteTitle,
6617 MessageId::AppModeAgentHint,
6618 MessageId::AppModePlanHint,
6619 MessageId::RouteNoModels,
6620 MessageId::ProviderNoMatchesTitle,
6621 MessageId::SessionsOpenedHistory,
6622 ];
6623
6624 #[test]
6625 fn cyrillic_packs_have_script_purity_and_no_mixed_language_fixtures() {
6626 for locale in [Locale::Ru, Locale::Uk] {
6627 let messages = raw_locale_messages(locale);
6628 let total = messages.len();
6629 let with_cyrillic = messages
6630 .values()
6631 .filter(|v| v.as_str().is_some_and(has_cyrillic))
6632 .count();
6633 assert!(
6634 with_cyrillic * 100 >= total * 85,
6635 "{}: only {with_cyrillic}/{total} values contain Cyrillic — pack looks under-translated",
6636 locale.tag()
6637 );
6638 for (key, value) in &messages {
6639 let Some(value) = value.as_str() else {
6640 continue;
6641 };
6642 if locale == Locale::Uk {
6643 assert!(
6644 !value.chars().any(|c| "ыэъЫЭЪ".contains(c)),
6645 "uk {key} contains a Russian-only letter: {value}"
6646 );
6647 } else {
6648 assert!(
6649 !value.chars().any(|c| "іІїЇєЄґҐ".contains(c)),
6650 "ru {key} contains a Ukrainian-only letter: {value}"
6651 );
6652 }
6653 }
6654 for id in SCRIPT_FIXTURE_IDS {
6655 let value = tr(locale, *id);
6656 assert!(
6657 has_cyrillic(&value),
6658 "{} {id:?} fixture has no Cyrillic: {value}",
6659 locale.tag()
6660 );
6661 let leaked = latin_words_in_translated_copy(&value);
6662 assert!(
6663 leaked.is_empty(),
6664 "{} {id:?} mixes Latin prose into Cyrillic copy: {leaked:?} in {value}",
6665 locale.tag()
6666 );
6667 }
6668 }
6669 // The two packs are translations of the same source, not copies of
6670 // each other: sentence-length fixtures must differ between ru and uk.
6671 for id in [
6672 MessageId::ComposerPlaceholder,
6673 MessageId::StatusPickerInstruction,
6674 MessageId::AppModeAgentHint,
6675 MessageId::AppModePlanHint,
6676 MessageId::ProviderNoMatchesTitle,
6677 ] {
6678 assert_ne!(
6679 tr(Locale::Ru, id),
6680 tr(Locale::Uk, id),
6681 "ru and uk share an identical sentence for {id:?} — one pack was copied from the other"
6682 );
6683 }
6684 }
6685
6686 #[test]
6687 fn hindi_pack_uses_devanagari_for_prose_fixtures() {
6688 let messages = raw_locale_messages(Locale::Hi);
6689 let total = messages.len();
6690 let with_devanagari = messages
6691 .values()
6692 .filter(|v| v.as_str().is_some_and(has_devanagari))
6693 .count();
6694 assert!(
6695 with_devanagari * 100 >= total * 80,
6696 "hi: only {with_devanagari}/{total} values contain Devanagari — pack looks under-translated"
6697 );
6698 for id in SCRIPT_FIXTURE_IDS {
6699 let value = tr(Locale::Hi, *id);
6700 assert!(
6701 has_devanagari(&value),
6702 "hi {id:?} fixture has no Devanagari: {value}"
6703 );
6704 let leaked = latin_words_in_translated_copy(&value);
6705 assert!(
6706 leaked.is_empty(),
6707 "hi {id:?} mixes Latin prose into Devanagari copy: {leaked:?} in {value}"
6708 );
6709 }
6710 }
6711
6712 #[test]
6713 fn no_shipped_locale_renders_a_missing_message_marker() {
6714 // rust_i18n falls back to en for absent keys, so a "{MessageId}"
6715 // debug string in the UI would mean the fallback chain itself broke.
6716 for locale in Locale::shipped() {
6717 assert!(
6718 missing_message_ids(*locale).is_empty(),
6719 "{} renders raw message ids (missing-marker UI)",
6720 locale.tag()
6721 );
6722 }
6723 }
6724
6725 // --- Devanagari grapheme safety (#4790 spike) --------------------------
6726
6727 #[test]
6728 fn truncate_to_width_never_splits_devanagari_clusters() {
6729 // क्ष is क + ् + ष — a single cluster. A budget landing inside it
6730 // must drop the whole cluster; a dangling virama (U+094D) renders as
6731 // visibly broken shaping (क् instead of a conjunct).
6732 let conjuncts = "क्षत्रिय ज्ञान श्रृंखला प्रत्यक्ष";
6733 for budget in [1usize, 2, 3, 5, 7, 40, 60, 80] {
6734 let out = truncate_to_width(conjuncts, budget);
6735 assert!(
6736 UnicodeWidthStr::width(out.as_str()) <= budget,
6737 "budget={budget}: overflowed: {out:?}"
6738 );
6739 assert!(!out.contains('\u{FFFD}'), "budget={budget}: {out:?}");
6740 let body = out.strip_suffix('…').unwrap_or(&out);
6741 assert!(
6742 !body.ends_with('\u{094D}'),
6743 "budget={budget}: dangling virama: {out:?}"
6744 );
6745 assert!(
6746 !body.ends_with('\u{200D}'),
6747 "budget={budget}: dangling ZWJ: {out:?}"
6748 );
6749 if let Some(last) = body.chars().last() {
6750 let cp = last as u32;
6751 let combining = (0x0900..=0x0903).contains(&cp) || (0x093A..=0x094F).contains(&cp);
6752 assert!(
6753 !combining,
6754 "budget={budget}: trailing combining mark: {out:?}"
6755 );
6756 }
6757 }
6758 }
6759
6760 #[test]
6761 fn cyrillic_latin_extended_and_devanagari_rows_wrap_within_terminal_columns() {
6762 // Width/grapheme QA for the v0.9.2 scripts at narrow (40), medium
6763 // (60), and standard (80) terminal columns: truncation clips by
6764 // display width and wrapped rows never overflow the buffer.
6765 let fixtures = [
6766 (
6767 "ru",
6768 "Задача: миграция базы данных — проверка маршрутизации провайдера #3092",
6769 ),
6770 (
6771 "uk",
6772 "Завдання: міграція бази даних — перевірка маршрутизації провайдера #4791",
6773 ),
6774 (
6775 "de",
6776 "Aufgabe: Datenbankmigration — Anbieter-Routing für #4788 prüfen",
6777 ),
6778 (
6779 "fr",
6780 "Tâche : migration de la base — vérifier le routage fournisseur #4788",
6781 ),
6782 (
6783 "ca",
6784 "Tasca: migració de la base de dades — comprovar l'encaminament #4788",
6785 ),
6786 (
6787 "id",
6788 "Tugas: migrasi basis data — periksa perutean penyedia untuk #4789",
6789 ),
6790 ("hi", "कार्य: डेटाबेस माइग्रेशन — प्रदाता रूटिंग की जांच करें #4790"),
6791 ];
6792
6793 for width in [40usize, 60, 80] {
6794 for (tag, fixture) in fixtures {
6795 let out = truncate_to_width(fixture, width);
6796 assert!(
6797 UnicodeWidthStr::width(out.as_str()) <= width,
6798 "{tag} width={width}: truncated row overflowed: {out:?}"
6799 );
6800 assert!(
6801 !out.contains('\u{FFFD}'),
6802 "{tag} width={width}: split a glyph: {out:?}"
6803 );
6804
6805 let area = Rect::new(0, 0, width as u16, 6);
6806 let mut buf = Buffer::empty(area);
6807 Paragraph::new(fixture)
6808 .wrap(Wrap { trim: false })
6809 .render(area, &mut buf);
6810 let mut saw_text = false;
6811 for (row_idx, y) in (area.top()..area.bottom()).enumerate() {
6812 let row = visible_row_text(&buf, area, y);
6813 let trimmed = row.trim_end_matches('\u{0}').trim_end();
6814 assert!(
6815 UnicodeWidthStr::width(trimmed) <= width,
6816 "{tag} width={width} row {row_idx}: wrapped row overflowed ({} cols): {trimmed:?}",
6817 UnicodeWidthStr::width(trimmed)
6818 );
6819 saw_text |= trimmed.chars().any(|ch| !ch.is_whitespace());
6820 }
6821 assert!(
6822 saw_text,
6823 "{tag} width={width}: fixture produced an empty render"
6824 );
6825 }
6826 }
6827 }
6828 }
6829
6829 lines RUST