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