| 1 | package i18n |
| 2 | |
| 3 | // English is the baseline catalogue. The drift-guard test reflects over its |
| 4 | // fields, so every other catalogue must populate the same set. |
| 5 | var English = Messages{ |
| 6 | WelcomeTitleFmt: "Welcome to %s", |
| 7 | NoConfigYet: "No configuration found yet — let's set it up.", |
| 8 | |
| 9 | InitHint: "Project memory (AGENTS.md) is generated in-session: run `reasonix`, then `/init` — the model analyzes the codebase and writes it. For configuration, use `reasonix setup`.", |
| 10 | |
| 11 | ChatTip: "Context is kept across turns. Type 'exit' or Ctrl-D to quit.", |
| 12 | TurnCancelled: "cancelled — back to prompt", |
| 13 | InterruptedRecovery: "This turn was interrupted. Partial output is kept for reference; only completed tool pairs and a bounded recovery summary enter the next model turn. Inspect the workspace before continuing or reverting changes.", |
| 14 | RecoveryPaused: "Automatic retries paused. Reasonix stopped repeated attempts and kept completed work. Send “Continue” to start a fresh attempt, or add instructions to change direction.", |
| 15 | NoSessionToResume: "no saved session to resume — start a new one with `reasonix`", |
| 16 | ResumeRequiresTTY: "--resume needs an interactive terminal; pass --continue for the most recent session", |
| 17 | PickSessionLabel: "Resume which session?", |
| 18 | |
| 19 | ResumeBusy: "finish or cancel the current turn before resuming", |
| 20 | ResumeBadIndexFmt: "pick a session 1–%d (run /resume to list)", |
| 21 | ResumeAlreadyActive: "already in that session", |
| 22 | ResumedTitle: "resumed session", |
| 23 | |
| 24 | RenameUsage: "usage: /rename <new title> or /rename <n> <new title>", |
| 25 | RenameNoSession: "no active session to rename", |
| 26 | RenameDoneFmt: "session renamed to %q", |
| 27 | ResumePickTitle: "Resume a saved session", |
| 28 | ResumePickHint: "↑/↓ move · Enter resume · Esc cancel", |
| 29 | ResumeRecoveryBadgeFmt: "[recovery copy · parent %s]", |
| 30 | |
| 31 | ChatThinking: "thinking…", |
| 32 | ChatThoughtForFmt: "thought for %ds", |
| 33 | ChatStatusThinkingFmt: "%s thinking… (%ds · Esc cancels)", |
| 34 | ChatToolWorkingFmt: "%s working · %ds", |
| 35 | ChatSubagentPhaseQueued: "queued", |
| 36 | ChatSubagentPhaseRunning: "running", |
| 37 | ChatSubagentPhaseReasoning: "reasoning", |
| 38 | ChatSubagentPhaseResponding: "responding", |
| 39 | ChatSubagentPhaseTool: "using tools", |
| 40 | ChatSubagentPhaseRetrying: "retrying", |
| 41 | ChatSubagentPhaseCompleted: "completed", |
| 42 | ChatSubagentPhaseFailed: "failed", |
| 43 | ChatSubagentPhaseCancelled: "cancelled", |
| 44 | ChatSubagentProgressFmt: "%s · %ds · %ds ago", |
| 45 | ChatSubagentProgressDoneFmt: "%s · %ds", |
| 46 | ChatSubagentPreviewLabel: "▎", |
| 47 | ChatStatusRetryingFmt: "%s retrying (%d/%d)… (Esc cancels)", |
| 48 | ChatStatusCancellingFmt: "%s stopping… (%ds · Ctrl+C exits)", |
| 49 | ChatStatusIdle: "ready", |
| 50 | ChatStatusYoloIdle: "tool approvals skipped", |
| 51 | ChatStatusCycleHint: "Shift+Tab ask/auto/plan · Ctrl+Y YOLO", |
| 52 | ChatStatusCycleHintCompact: "Shift+Tab ask/auto/plan · Ctrl+Y YOLO", |
| 53 | ChatTurnReceiptLabel: "TURN", |
| 54 | ChatStatusModelLabel: "MODEL", |
| 55 | ChatStatusEffortLabel: "EFFORT", |
| 56 | ChatStatusWorkLabel: "WORK", |
| 57 | ChatStatusCacheLabel: "CACHE", |
| 58 | ChatStatusContextLabel: "CTX", |
| 59 | ChatStatusCompactLabel: "COMPACT", |
| 60 | ChatStatusJobsLabel: "JOBS", |
| 61 | ChatStatusBalanceLabel: "BAL", |
| 62 | ChatStatusCacheNowFmt: "turn hit %s", |
| 63 | ChatStatusCacheAvgFmt: "avg %s", |
| 64 | ChatStatusPlanApproval: "1 execute · 2 revise · 3 exit without executing · n/Esc keeps planning · PgUp/PgDn/Ctrl+Home/End scrolls", |
| 65 | PlanApprovalPrompt: "Plan ready above — choose what to do next", |
| 66 | PlanApprovalChoices: "1. Start execution\n2. Revise plan (keep planning)\n3. Exit without executing\nChoose [1/2/3] (y starts; n/Esc keeps planning)", |
| 67 | ChatStatusToolApproval: "1 approve once · 2 allow scope this session · 3/4 prefix or save when offered · n/Esc deny · Ctrl-C cancels turn", |
| 68 | AskTypeSomething: "Type something else", |
| 69 | AskTypingHint: "type below, Enter to confirm", |
| 70 | AskChatInstead: "None — just chat", |
| 71 | ChatStatusQuestion: "↑/↓ move · number to pick · space multi · Enter confirm · ←/→ switch · Esc cancel", |
| 72 | StatusResumePicker: "↑/↓ move · Enter resume · Esc cancel", |
| 73 | AskSubmitTitle: "Submit answers", |
| 74 | AskUnanswered: "(unanswered)", |
| 75 | AskSubmitHint: "Enter submits · ← returns to edit", |
| 76 | ToolApprovalPromptFmt: "Permission required\n\nWill call tool %s%s.\n%s\n%s", |
| 77 | ToolApprovalChoices: "1. Allow once\n2. Allow %s for this session\n3. Always allow %s (save to config)\n4. Deny\nChoose [1/2/3/4] (y/a/p/n also work)", |
| 78 | BashPrefixChoices: "1. Allow once\n2. Allow %s for this session\n3. Always allow %s (save to config)\n4. Deny\nChoose [1/2/3/4] (y/a/p/n also work)", |
| 79 | PlanModeReadOnlyCommandChoices: "1. Trust once\n2. Trust this prefix for this session\n3. Always trust this prefix for plan mode (save to config)\n4. Deny\nChoose [1/2/3/4] (y/a/p/n also work)", |
| 80 | FreshHumanApprovalChoices: "1. Allow once\n2. Deny\nChoose [1/2] (y/n also work)", |
| 81 | RecoveryApprovalChoices: "1. Continue once\n2. Try another approach", |
| 82 | RecoveryPlanChangeChoices: "1. Adopt the new plan and continue\n2. Do not adopt; let Auto adjust", |
| 83 | RecoveryPlanDecisionPrompt: "The execution plan needs your decision", |
| 84 | RecoveryPlanBeforeFmt: "Previous plan: %s", |
| 85 | RecoveryPlanAfterFmt: "Proposed plan: %s", |
| 86 | RecoveryTaskGrantChoices: "1. Continue once\n2. Continue and allow similar actions in this task\n3. Try another approach", |
| 87 | SandboxEscapeApprovalChoices: "1. Allow once\n2. Use real environment for this session\n3. Deny\nChoose [1/2/3] (y/a/n also work)", |
| 88 | ApprovalNeededFmt: "approval needed: %s", |
| 89 | ApprovalNeededWithSubjectFmt: "approval needed: %s %s", |
| 90 | ToolApprovalSourceFmt: "Source: %s", |
| 91 | ToolApprovalBuiltIn: "built-in tool", |
| 92 | ToolApprovalImageUse: "It will read provided image input for image understanding.", |
| 93 | ApprovalToolLabelBash: "bash", |
| 94 | ApprovalToolLabelEditFile: "edit file", |
| 95 | ApprovalToolLabelWriteFile: "write file", |
| 96 | ApprovalToolLabelMultiEdit: "multi edit", |
| 97 | ApprovalToolLabelMoveFile: "move file", |
| 98 | ApprovalToolLabelWebFetch: "web fetch", |
| 99 | ApprovalToolLabelRunSkill: "run skill", |
| 100 | ApprovalToolLabelRemember: "remember", |
| 101 | ApprovalToolLabelForget: "forget", |
| 102 | ApprovalToolLabelSandboxEscape: "bash sandbox escape", |
| 103 | ApprovalToolLabelPlanModeReadOnly: "plan-mode read-only command", |
| 104 | MemoryApprovalSaveUpdate: "Save/update memory", |
| 105 | MemoryApprovalBodyLabel: "body", |
| 106 | MemoryApprovalArchiveFmt: "Archive memory %q", |
| 107 | PlanModeBashTrustSubjectFmt: "Trust %q as a read-only command prefix while planning\nCommand: %s", |
| 108 | PlanModeBashTrustReason: "This bash command is not in Reasonix's built-in read-only set. Confirm only if this exact prefix is read-only for planning and research. Auto/YOLO approval cannot answer this trust prompt.", |
| 109 | PlanModeBashTrustDeclined: "the user declined to trust this bash command as read-only for plan mode - do not retry it; continue with other trusted read-only tools or ask how to proceed.", |
| 110 | SandboxEscapeSubjectFallback: "run shell command unconfined once", |
| 111 | SandboxEscapeSubjectPrefix: "run unconfined once: ", |
| 112 | SandboxEscapeWrapReason: "Windows does not provide an OS-level Bash sandbox for this command. Run it unconfined one time? This bypasses OS isolation for this command only.", |
| 113 | SandboxEscapeRuntimeReason: "The OS sandbox could not start this command. Run it unconfined one time? This bypasses OS isolation for this command only.", |
| 114 | SandboxEscapeDeclined: "the user declined to run this command without the OS sandbox - do not retry it unconfined; ask how they would like to proceed.", |
| 115 | ApprovalToolLabelConfigWrite: "Reasonix config write", |
| 116 | ConfigWriteSubjectPrefix: "write Reasonix config: ", |
| 117 | ConfigWriteReason: "This write targets a Reasonix-managed configuration file outside the workspace. It can change providers, sandbox rules, permissions, and MCP servers for future sessions, so it needs your explicit approval.", |
| 118 | ConfigWriteDeclined: "the user declined this Reasonix config write - do not retry it; ask how they would like to proceed.", |
| 119 | ConfigWriteApprovalChoices: "1. Allow once\n2. Allow for this session\n3. Deny\nChoose [1/2/3] (y/a/n also work)", |
| 120 | PermissionSavedFmt: "permission saved to %s: %s", |
| 121 | PermissionAlreadyAllowedFmt: "permission already covered in %s: %s", |
| 122 | PermissionSaveFailedFmt: "permission save failed for %s: %v", |
| 123 | PlanModeReadOnlyCommandTrustSavedFmt: "plan-mode read-only command trust saved to %s: %s", |
| 124 | PlanModeReadOnlyCommandTrustAlreadyFmt: "plan-mode read-only command trust already saved in %s: %s", |
| 125 | PlanModeReadOnlyCommandTrustFailedFmt: "plan-mode read-only command trust save failed for %s: %v", |
| 126 | DiffFoldedFmt: "… +%d more lines", |
| 127 | DiffFoldEnabledFmt: "diff folded to %d lines (/diff-fold to expand)", |
| 128 | DiffFoldDisabled: "diff expanded — showing all lines (/diff-fold to fold)", |
| 129 | |
| 130 | OutputStyleNone: "no output styles available", |
| 131 | ThemeHeader: "themes:", |
| 132 | ThemeHint: "switch with /theme <auto|light|dark|style>", |
| 133 | ThemeChangedFmt: "theme switched to %s / %s", |
| 134 | ThemeUnknownFmt: "unknown theme %q", |
| 135 | LanguageHeader: "languages:", |
| 136 | LanguageHint: "switch with /language <auto|en|zh>", |
| 137 | LanguageChangedFmt: "language set to %s (resolved: %s)", |
| 138 | CurrencyHeader: "pricing currency:", |
| 139 | CurrencyHint: "switch with /currency <auto|CNY|USD>", |
| 140 | CurrencyChangedFmt: "pricing currency set to %s (resolved: %s)", |
| 141 | RuntimeRefreshBusy: "finish or cancel active work and stop background jobs before changing this setting", |
| 142 | RuntimeRefreshUnavailable: "runtime refresh is unavailable in this session", |
| 143 | |
| 144 | CompactionWorking: "compacting conversation…", |
| 145 | CompactionTitle: "Context compacted", |
| 146 | CompactionUnit: "messages", |
| 147 | CompactionAuto: "auto", |
| 148 | CompactionManual: "manual", |
| 149 | |
| 150 | ExtFormFieldsHint: "fields are collected through the usual prompts", |
| 151 | ExtRunActionFmt: "run %s", |
| 152 | SlashCompactFailed: "compaction failed", |
| 153 | SlashNewDone: "new session started — previous transcript saved", |
| 154 | SlashNewFailed: "could not start a new session", |
| 155 | SlashClearPrompt: "Clear current context without saving?", |
| 156 | SlashClearDone: "current context cleared", |
| 157 | SlashClearFailed: "could not clear current context", |
| 158 | SlashClsDone: "screen cleared", |
| 159 | SlashUnknown: "unknown command", |
| 160 | SlashUnknownSentAsMessage: "sent as a regular message", |
| 161 | SlashTodoCleared: "task list dismissed", |
| 162 | |
| 163 | SkillPickerAvailableFmt: "%d available", |
| 164 | SkillPickerMatchingFmt: "%d matching · %d total", |
| 165 | SkillPickerHint: "↑↓ navigate · Space toggle · Enter save · / search · s sources · r rescan · Esc cancel", |
| 166 | SkillPickerDetailHint: "↑↓ navigate · Enter select · Space toggle · Esc back", |
| 167 | SkillPickerSearchEmpty: "No skills match your search", |
| 168 | SkillPickerSearchPlaceholder: "Search skills...", |
| 169 | SkillPickerSourceTitle: "Sources", |
| 170 | SkillPickerSourceActiveFmt: "%d active", |
| 171 | SkillPickerSourceHint: "↑↓ navigate · Enter skills · d diagnostics · s skills · r rescan · Esc close", |
| 172 | SkillPickerDiagHidden: "d show diagnostics", |
| 173 | SkillPickerDiagShown: "d hide diagnostics", |
| 174 | SkillPickerBuiltinSource: "builtin", |
| 175 | SkillPickerRescanned: "skills rescanned", |
| 176 | SkillPickerNoDescription: "(no description)", |
| 177 | SkillPickerScopeProject: "project", |
| 178 | SkillPickerScopeCustom: "custom", |
| 179 | SkillPickerScopeGlobal: "global", |
| 180 | SkillPickerScopeBuiltin: "builtin", |
| 181 | SkillPickerSubagent: "subagent", |
| 182 | SkillPickerAvailableLabel: "on", |
| 183 | SkillPickerDisabledLabel: "off", |
| 184 | SkillPickerNoChanges: "Skills dialog dismissed: No changes", |
| 185 | SkillPickerSourceSkillsHint: "↑↓ navigate · Space toggle · Enter details · Esc sources", |
| 186 | SkillPickerSourceSkillsEmpty: "No skills in this source", |
| 187 | SkillPickerActionToggle: "Toggle enabled", |
| 188 | SkillPickerActionDelete: "Delete skill", |
| 189 | SkillPickerDeleteTitleFmt: "Delete skill /%s?", |
| 190 | SkillPickerDeleteConfirm: "Delete", |
| 191 | SkillPickerDeleteCancel: "Cancel", |
| 192 | SkillPickerDeleteHint: "Enter confirm · y delete · n/Esc cancel", |
| 193 | SkillPickerDeletedFmt: "deleted skill %s", |
| 194 | SkillPickerMoreAboveFmt: "↑ %d more above", |
| 195 | SkillPickerMoreBelowFmt: "↓ %d more below", |
| 196 | SkillPickerTokenFmt: "~%d tok", |
| 197 | SkillPickerDetailMetaFmt: "Scope: %s Run as: %s", |
| 198 | SkillPickerSkillsUnit: "skills", |
| 199 | SkillPickerLinesUnit: "lines", |
| 200 | SkillPickerStatusLabel: "skill picker", |
| 201 | SkillPickerStatusOK: "ok", |
| 202 | SkillPickerStatusMissing: "missing", |
| 203 | SkillPickerStatusNotDir: "not-directory", |
| 204 | SkillPickerStatusUnreadable: "unreadable", |
| 205 | SlashPromptEmpty: "the MCP prompt returned no content to send", |
| 206 | SlashMCPNone: "no MCP servers configured — add a [[plugins]] entry in reasonix.toml", |
| 207 | CtrlCQuitHint: "press Ctrl+C again to quit", |
| 208 | CompHintSlash: "↑/↓ move · Tab/Enter select · Esc close", |
| 209 | CompHintFile: "↑/↓ move · Tab/Enter open folder or pick file · Esc close", |
| 210 | MouseCopiedHint: "copied to clipboard", |
| 211 | ClipboardCopyOSC52Hint: "copy sent via OSC 52 — terminal permission may be required", |
| 212 | ClipboardCopyFallbackHint: "native clipboard unavailable — copy sent via OSC 52", |
| 213 | ClipboardTextPasteRemoteHint: "mouse paste cannot read your local clipboard or PRIMARY selection over SSH — use the terminal paste shortcut or /mouse", |
| 214 | ClipboardTextPasteFailedFmt: "paste text failed: %v", |
| 215 | ClipboardImagePastingHint: "Pasting image…", |
| 216 | ClipboardImagePasteFailedFmt: "paste image failed: %v", |
| 217 | MouseCaptureOnHint: "mouse capture on — in-app drag-select/scrollbar/wheel active", |
| 218 | MouseCaptureOffHint: "mouse capture off — your terminal now handles selection and right-click", |
| 219 | MouseCaptureTag: "native mouse", |
| 220 | |
| 221 | ShellExecEmpty: "usage: !<command> (e.g. !ls -la)", |
| 222 | ShellExecFailedFmt: "shell command failed: %v", |
| 223 | ShellExecTimeoutFmt: "shell command timed out (> %s)", |
| 224 | ShellModeHint: "Enter runs shell · Esc cancels · click output to expand", |
| 225 | |
| 226 | CmdNew: "start new session; save transcript", |
| 227 | CmdClear: "discard current context", |
| 228 | CmdCls: "clear screen only (keep LLM context)", |
| 229 | CmdCompact: "compact context", |
| 230 | CmdRewind: "rewind to an earlier turn", |
| 231 | CmdTree: "show conversation branches", |
| 232 | CmdBranch: "create a conversation branch", |
| 233 | CmdSwitchBranch: "switch conversation branch", |
| 234 | CmdResume: "resume a saved session", |
| 235 | CmdRename: "rename a session", |
| 236 | CmdModel: "switch model", |
| 237 | CmdStatus: "show session status", |
| 238 | CmdWorkMode: "switch work mode", |
| 239 | CmdDocs: "search version-matched embedded documentation", |
| 240 | CmdMemory: "inspect instructions, memory, and recovery", |
| 241 | CmdMigrate: "retry legacy data migration", |
| 242 | CmdGoal: "set or clear the active goal", |
| 243 | CmdRemember: "save a memory note", |
| 244 | CmdForget: "archive a saved memory", |
| 245 | CmdMcp: "MCP servers", |
| 246 | CmdRemote: "remote SSH hosts", |
| 247 | CmdHooks: "manage hooks", |
| 248 | CmdPlugins: "manage plugin packages", |
| 249 | CmdPasteImage: "paste clipboard image", |
| 250 | CmdOutputStyle: "list output styles", |
| 251 | CmdTheme: "switch CLI theme", |
| 252 | CmdLanguage: "switch CLI language", |
| 253 | CmdCurrency: "switch pricing currency", |
| 254 | CmdSkill: "manage skills", |
| 255 | CmdVerbose: "toggle thinking text", |
| 256 | CmdReloadCmd: "reload custom commands", |
| 257 | CmdReload: "reload the agent runtime (tools, skills, commands, hooks, providers) keeping this session", |
| 258 | CmdDiffFold: "toggle diff fold/expand", |
| 259 | CmdSandbox: "show sandbox status", |
| 260 | CmdEffort: "set reasoning effort", |
| 261 | CmdMouse: "toggle in-app mouse capture (off = native terminal selection/right-click)", |
| 262 | CmdReasonLang: "set visible reasoning language", |
| 263 | CmdHelp: "list commands", |
| 264 | CmdTodo: "dismiss the task list", |
| 265 | CmdQuit: "exit the session", |
| 266 | CmdCopy: "pick a response to copy to clipboard", |
| 267 | CmdExport: "export session as markdown", |
| 268 | SlashCopyDone: "copied response to clipboard", |
| 269 | SlashCopyEmpty: "no assistant response to copy", |
| 270 | SlashCopyListHeader: "pick a response to copy:", |
| 271 | SlashExportDoneFmt: "session exported to %s", |
| 272 | SlashExportEmpty: "no messages to export", |
| 273 | ArgSkillShow: "show a skill's body", |
| 274 | ArgSkillNew: "scaffold a new skill", |
| 275 | ArgSkillPaths: "show discovery paths", |
| 276 | ArgMcpAdd: "connect a server", |
| 277 | ArgMcpRemove: "disconnect a server", |
| 278 | ArgMcpConnected: "connected", |
| 279 | ArgHooksList: "list active hooks", |
| 280 | ArgModelCurrent: "current", |
| 281 | ArgEffortAuto: "use the model default", |
| 282 | ArgEffortLow: "lighter reasoning", |
| 283 | ArgEffortMedium: "balanced reasoning", |
| 284 | ArgEffortHigh: "deeper reasoning", |
| 285 | ArgEffortXHigh: "extra deep reasoning", |
| 286 | ArgEffortMax: "maximum reasoning", |
| 287 | ArgThemeCurrent: "current", |
| 288 | ArgLanguageAuto: "auto-detect from REASONIX_LANG / locale", |
| 289 | ArgLanguageEn: "English", |
| 290 | ArgLanguageZh: "中文", |
| 291 | |
| 292 | ListModelsHeaderFmt: "models (active: %s)", |
| 293 | ListModelsHint: "switch with the model switcher, or type /model <provider/model>", |
| 294 | ListMemorySaved: "saved memories", |
| 295 | ListMemoryArchived: "archived memories", |
| 296 | ListMemoryNone: "memory: none — add with “/remember <note>” or run /init to generate AGENTS.md", |
| 297 | ListSkillsHeaderFmt: "skills (%d)", |
| 298 | ListSkillsNone: "skills: none defined — invoke a built-in like /init, or author one with install_skill", |
| 299 | ListHooksHeaderFmt: "hooks (%d active)", |
| 300 | ListHooksNone: "hooks: none active — configure in .reasonix/settings.json (project) or <Reasonix home>/settings.json (global)", |
| 301 | ListMcpHeader: "mcp servers", |
| 302 | ListMcpNone: "mcp: no servers connected — add one in reasonix.toml ([[plugins]]) or a project .mcp.json", |
| 303 | |
| 304 | MemoryEditHint: "edit doc files or use “/remember <note>”; doc edits apply next session", |
| 305 | ForgetUsage: "usage: /forget <name> — the slug shown under “saved memories” in /memory", |
| 306 | ForgetDoneFmt: "forgot and archived memory: %s", |
| 307 | QuickRememberEmpty: "nothing to remember", |
| 308 | QuickRememberDoneFmt: "remembered → %s", |
| 309 | GoalEmpty: "goal: none — set one with /goal <objective>", |
| 310 | GoalCurrentFmt: "goal: %s", |
| 311 | GoalSetFmt: "goal set → %s", |
| 312 | GoalCleared: "goal cleared", |
| 313 | GoalNotRunning: "no running goal to pause", |
| 314 | GoalNotPaused: "no paused or blocked goal to resume", |
| 315 | GoalPaused: "goal paused — /goal resume continues it", |
| 316 | GoalPausedReason: "paused by the user", |
| 317 | GoalPausedFmt: "goal is paused (%s) — use /goal resume to continue", |
| 318 | GoalBudgetExtended: "goal resumed — one additional turn slice added", |
| 319 | GoalRuntimeFmt: "runtime: turns %d/%d, tokens %d, no-progress %d/%d, extensions %d", |
| 320 | GoalRuntimeLastReason: "last reason", |
| 321 | ModelSwitchUnavailable: "model switching is unavailable in this session", |
| 322 | ModelSwitchBusy: "finish or cancel active work and stop background jobs before switching models", |
| 323 | ModelAlreadyOnFmt: "already on %s", |
| 324 | ModelSwitchingFmt: "switching to %s…", |
| 325 | ModelSwitchedFmt: "switched to %s (conversation carried over; prompt cache resets)", |
| 326 | ModelListHeader: "models (/model <provider/model> to switch)", |
| 327 | RuntimeSwitchPending: "wait for the current runtime switch to finish", |
| 328 | RuntimeReloadQueued: "reload queued — will run when the current work finishes", |
| 329 | RuntimeReloaded: "runtime reloaded", |
| 330 | RuntimeReloadedGenerationFmt: "runtime reloaded (generation %d)", |
| 331 | WorkModeStatusFmt: "work %s", |
| 332 | WorkModeListHeaderFmt: "work modes (current: %s)", |
| 333 | WorkModeListHint: "switch with /work-mode economy|balanced|delivery (/profile is an alias)", |
| 334 | WorkModeEconomyLabel: "economy", |
| 335 | WorkModeBalancedLabel: "balanced", |
| 336 | WorkModeDeliveryLabel: "delivery", |
| 337 | WorkModeEconomyDesc: "lower token use; optional tool sources connect on demand", |
| 338 | WorkModeBalancedDesc: "full tool surface; model decides how much work is needed", |
| 339 | WorkModeDeliveryDesc: "complete, verified delivery; stronger skill and plugin use", |
| 340 | WorkModeUsage: "usage: /work-mode economy|balanced|delivery", |
| 341 | WorkModeSwitchUnavailable: "work-mode switching is unavailable in this session", |
| 342 | WorkModeSwitchBusy: "finish or cancel active work before switching work modes", |
| 343 | WorkModeAlreadyOnFmt: "work mode is already %s", |
| 344 | WorkModeSwitchingFmt: "switching work mode to %s…", |
| 345 | WorkModeSwitchedFmt: "work mode switched to %s (conversation carried over; prompt cache resets)", |
| 346 | RewindNone: "nothing to rewind yet", |
| 347 | RewindCodeConversation: "Code + conversation", |
| 348 | RewindConversationOnly: "Conversation only", |
| 349 | RewindCodeOnly: "Code only", |
| 350 | RewindFork: "Fork (new branch, keep code)", |
| 351 | RewindSummarizeFrom: "Summarize from here", |
| 352 | RewindSummarizeUpto: "Summarize up to here", |
| 353 | RewindPickTitle: "⟲ Rewind — pick a turn", |
| 354 | RewindPickHint: "↑/↓ move · Enter choose · Esc close", |
| 355 | RewindRestoreTitleFmt: "⟲ Restore to turn %d ", |
| 356 | RewindApplyHint: "↑/↓ · Enter apply · Esc back", |
| 357 | RewindCoverageTitle: "⚠ Partial file coverage", |
| 358 | RewindCoverageWarningFmt: "%d coverage gap(s) mean some file changes may not be restored.", |
| 359 | RewindConfirmHint: "Enter/y confirm · Esc back", |
| 360 | RewindUnavailableFmt: "rewind unavailable: %s", |
| 361 | RewindEmpty: "(empty)", |
| 362 | |
| 363 | EnterAPIKeysHeader: "Enter API keys (Enter to skip and set later):", |
| 364 | WroteFileFmt: "Wrote %s", |
| 365 | SetupComplete: "Setup complete.", |
| 366 | SetupCancelled: "setup cancelled.", |
| 367 | TryHintFmt: "Try: %s", |
| 368 | NextHint: "Next: set your API key (run `reasonix setup` or export DEEPSEEK_API_KEY=...), then run `reasonix run \"your task\"`.", |
| 369 | ConfirmReconfigureFmt: "%s already exists. Reconfigure and overwrite?", |
| 370 | NotOverwritingFmt: "%s already exists; not overwriting", |
| 371 | SetupManagerTitle: "Provider configuration", |
| 372 | SetupAddOpenAI: "Add OpenAI-compatible provider", |
| 373 | SetupAddAnthropic: "Add Anthropic-compatible provider", |
| 374 | SetupProviderExistsFmt: "Provider %q already exists. Manage the existing provider to edit its models or settings.", |
| 375 | SetupSaveExit: "Save and exit", |
| 376 | SetupSaveExitDesc: "write staged changes", |
| 377 | SetupCancel: "Cancel", |
| 378 | SetupCancelDesc: "discard all staged changes", |
| 379 | SetupModelsUnit: "models", |
| 380 | SetupKeySet: "key set", |
| 381 | SetupKeyMissing: "key missing", |
| 382 | SetupDefaultBadge: "default", |
| 383 | SetupProviderActionsFmt: "Manage %s", |
| 384 | SetupEditProvider: "Edit provider", |
| 385 | SetupUpdateKey: "Update API key", |
| 386 | SetupTestRefresh: "Test connection / refresh models", |
| 387 | SetupSetDefault: "Set default model", |
| 388 | SetupRemoveProvider: "Remove provider", |
| 389 | SetupBack: "Back", |
| 390 | SetupPromptModels: "Models (comma-separated)", |
| 391 | SetupSharedKeyWarningFmt: "%s is also used by %s at %s. Share this credential?", |
| 392 | SetupPromptAPIKeyFmt: "Enter new value for %s", |
| 393 | SetupSelectDefaultModel: "Select default model", |
| 394 | SetupConfirmRemoveFmt: "Remove provider %s?", |
| 395 | SetupSummaryTitle: "Pending changes:", |
| 396 | SetupSummaryAddedFmt: "Added: %s", |
| 397 | SetupSummaryEditedFmt: "Edited: %s", |
| 398 | SetupSummaryRemovedFmt: "Removed: %s", |
| 399 | SetupSummaryDefaultFmt: "Default model: %s", |
| 400 | SetupSummaryKeysFmt: "API keys updated: %d", |
| 401 | SetupSummaryNoChanges: "No changes", |
| 402 | SetupConfirmSave: "Save these changes?", |
| 403 | SetupConcurrentChangeFmt: "Configuration changed while setup was open (%s). No staged setup changes were saved; run setup again to review the latest configuration.", |
| 404 | |
| 405 | // model fetching |
| 406 | FetchingModelsFmt: "Fetching models for %s...", |
| 407 | FetchModelsSuccessFmt: "Found %d models for %s", |
| 408 | FetchModelsFailedFmt: "Failed to fetch models for %s: %v", |
| 409 | FetchModelsUsingPresetsFmt: "Live fetch unavailable for %s, using preset model list", |
| 410 | SelectModelsLabel: "Select models to enable for %s", |
| 411 | CustomFetchEmpty: "/models returned an empty list — falling back to manual entry", |
| 412 | AnthropicFetchEmpty: "/models returned an empty list — Anthropic-compatible providers usually don't expose one, falling back to manual entry", |
| 413 | APIKeyAlreadySetFmt: "reusing existing value for %s", |
| 414 | APIKeyResetPromptFmt: "Re-enter %s?", |
| 415 | InvalidAPIKeyEnvFmt: "%q is not a valid API Key variable name. Use letters, numbers, and underscores (for example, MY_PROVIDER_API_KEY); do not enter a model name.", |
| 416 | RepairedAPIKeyEnvFmt: "provider %s: replaced invalid API Key variable name %q with %q", |
| 417 | |
| 418 | // custom provider |
| 419 | CustomProviderDesc: "Add third-party OpenAI compatible model", |
| 420 | CustomAddMethodLabel: "Add third-party OpenAI compatible model - Select add method", |
| 421 | CustomMethodManual: "Enter model name manually", |
| 422 | CustomMethodURL: "Fetch models from URL", |
| 423 | CustomPromptModel: "Enter model name", |
| 424 | CustomPromptBaseURL: "Enter Base URL", |
| 425 | CustomPromptKeyEnv: "API Key variable name (press Enter to use the default; not the model name)", |
| 426 | CustomPromptAPIKey: "Enter API Key", |
| 427 | CustomAddedFmt: "Added custom model: %s", |
| 428 | |
| 429 | // Anthropic compatible provider |
| 430 | AnthropicProviderDesc: "Add third-party Anthropic compatible model", |
| 431 | AnthropicAddMethodLabel: "Add third-party Anthropic compatible model - Select add method", |
| 432 | AnthropicMethodManual: "Enter model name manually", |
| 433 | AnthropicMethodURL: "Fetch models from URL", |
| 434 | AnthropicPromptModel: "Enter model name", |
| 435 | AnthropicPromptBaseURL: "Enter Base URL", |
| 436 | AnthropicPromptKeyEnv: "API Key variable name (press Enter to use the default; not the model name)", |
| 437 | AnthropicPromptAPIKey: "Enter API Key", |
| 438 | AnthropicAddedFmt: "Added Anthropic compatible model: %s", |
| 439 | AnthropicFetchingModelsFmt: "Fetching models for %s...", |
| 440 | AnthropicFetchModelsSuccessFmt: "Found %d models for %s", |
| 441 | AnthropicFetchModelsFailedFmt: "Failed to fetch models for %s: %v", |
| 442 | AnthropicSelectModelsLabel: "Select models to enable for %s", |
| 443 | |
| 444 | RemoteConnectingFmt: "connecting to %s…", |
| 445 | RemoteConnectedFmt: "connected to %s", |
| 446 | RemoteReconnectingFmt: "reconnecting to %s (attempt %d)…", |
| 447 | RemoteDegradedFmt: "connected to %s, but some forwards are down", |
| 448 | RemoteDisconnected: "disconnected (remote serve keeps running)", |
| 449 | RemoteServeReadyFmt: "remote serve ready: %s", |
| 450 | RemoteHostKeyPromptFmt: "unknown host key for %s\n type: %s\n fingerprint: %s", |
| 451 | RemotePassphrasePromptFmt: "passphrase for %s:", |
| 452 | RemotePasswordPromptFmt: "password for %s:", |
| 453 | RemoteBootstrapStepFmt: "remote serve: %s %s", |
| 454 | RemoteNoHostsHint: "no remote hosts configured; add one with `reasonix remote add <name> [user@]host`", |
| 455 | |
| 456 | UnknownCommandFmt: "unknown command %q", |
| 457 | UsageRunHint: "usage: reasonix -p [--model NAME] <task>", |
| 458 | ErrorPrefix: "error:", |
| 459 | ReconfigureOnUnknownModel: "Configured model is no longer available — re-running setup.", |
| 460 | WriteConfigErr: "write config:", |
| 461 | WriteEnvErr: "write .env:", |
| 462 | |
| 463 | ProviderErrBadRequest: "Malformed request (HTTP 400): the request body was rejected. This is likely a bug — please report it if it persists.", |
| 464 | ProviderErrAuth: "Authentication failed (HTTP 401): your API key is missing or unset. Add it to .env or run `reasonix setup`.", |
| 465 | ProviderErrAuthRejected: "Authentication failed (HTTP 401): the server rejected your API key. It may be wrong or expired, or the provider hit a transient auth/quota issue — retried with backoff and still failed. Try again shortly, or check the key in .env / run `reasonix setup`.", |
| 466 | ProviderErrInsufficientBalance: "Insufficient balance (HTTP 402): your account is out of credit. Top up your account, then retry.", |
| 467 | ProviderErrUnprocessable: "Invalid parameters (HTTP 422): a request parameter was rejected. This is likely a bug — please report it if it persists.", |
| 468 | ProviderErrInputSensitive: "MiniMax rejected the input during content review (error 1026). The review may include conversation history and tool results; adjust the relevant content or start a new session with only the necessary context. Repeating the same request is unlikely to help.", |
| 469 | ProviderErrOutputSensitive: "MiniMax rejected the generated output during content review (error 1027). Adjust the request and try again, or use another provider if the rejection persists.", |
| 470 | ProviderErrRateLimited: "Rate limit reached (HTTP 429): too many requests (TPM/RPM). Retried with backoff — slow down or try again shortly.", |
| 471 | ProviderErrServer: "Server error (HTTP 500): the provider hit an internal fault. Retried with backoff; if it keeps failing, try again later.", |
| 472 | ProviderErrServerBusy: "Server busy (HTTP 503): the provider is overloaded. Retried with backoff; please try again shortly.", |
| 473 | |
| 474 | SelectOneHint: "(↑/↓ · Enter · q to cancel; / to search)", |
| 475 | SelectManyHint: "(↑/↓ · Space · Enter · q; / to search)", |
| 476 | |
| 477 | SelectMoreAboveFmt: " ↑ %d more above", |
| 478 | SelectMoreBelowFmt: " ↓ %d more below", |
| 479 | SelectSearchHint: "/ to search · type to filter · Esc cancel search", |
| 480 | |
| 481 | CmdProvider: "switch provider", |
| 482 | ProviderListHeader: "providers (/provider <name> to switch)", |
| 483 | ProviderAlreadyOnFmt: "already using provider %s", |
| 484 | ProviderUnknownFmt: "unknown provider %q", |
| 485 | ProviderPickLabel: "Select a model from %s", |
| 486 | ProviderNoModelsFmt: "provider %s has no configured models", |
| 487 | |
| 488 | // self-update |
| 489 | UpgradeChecking: "Checking for updates…", |
| 490 | UpgradeChannelDeprecated: "Release channels are retired; using the official release.", |
| 491 | UpgradeDevBuild: "dev builds cannot self-update", |
| 492 | UpgradeFetchFailed: "failed to check for updates: %v", |
| 493 | UpgradeInvalidVersion: "remote version is not valid semver", |
| 494 | UpgradeAlreadyLatest: "Already on the latest version.", |
| 495 | UpgradeForcing: "Reinstalling the same version…", |
| 496 | UpgradeAvailableFmt: "Current: %s → Latest: %s", |
| 497 | UpgradeNoAssetFmt: "no binary found for %s", |
| 498 | UpgradeDownloadingFmt: "Downloading %s (%s)…", |
| 499 | UpgradeDownloadFailed: "download failed: %v", |
| 500 | UpgradeVerifying: "Verifying checksum…", |
| 501 | UpgradeChecksumFailed: "could not fetch checksum file: %v", |
| 502 | UpgradeChecksumMismatchFmt: "SHA256 mismatch: got %s, want %s", |
| 503 | UpgradeChecksumNotFoundFmt: "%s not found in SHA256SUMS", |
| 504 | UpgradeExtractFailed: "failed to extract binary: %v", |
| 505 | UpgradeApplying: "Replacing binary…", |
| 506 | UpgradeApplyFailed: "failed to apply update: %v", |
| 507 | UpgradeSuccessFmt: "Updated %s → %s", |
| 508 | |
| 509 | ReportNoPending: "No pending CLI crash reports.", |
| 510 | ReportHeaderFmt: "CLI crash report %s", |
| 511 | ReportCapturedFmt: "Captured: %s", |
| 512 | ReportPreviewOnlyFmt: "Preview only. Run `reasonix report send %s` to send this report.", |
| 513 | ReportSendPrompt: "Send this sanitized report to crash.reasonix.io?", |
| 514 | ReportKept: "Report kept locally.", |
| 515 | ReportDeletedFmt: "Deleted CLI crash report %s.", |
| 516 | ReportSentFmt: "Sent CLI crash report %s.", |
| 517 | ReportConfigFailedFmt: "cannot load network configuration: %v", |
| 518 | ReportUploadFailedFmt: "report upload failed; the local report was kept: %v", |
| 519 | ReportSentDeleteFailedFmt: "report was sent but the local copy could not be deleted: %v", |
| 520 | ReportUsageBody: `Usage: |
| 521 | reasonix report preview the newest local report and confirm sending |
| 522 | reasonix report list list local CLI crash reports |
| 523 | reasonix report show [ID] preview a report (newest when ID is omitted) |
| 524 | reasonix report send [ID] send a reviewed report and delete it after success |
| 525 | reasonix report delete [ID] delete a local report without sending`, |
| 526 | |
| 527 | CLITelemetryConsentNotice: "Reasonix can send anonymous, content-free CLI usage statistics to crash.reasonix.io: a random install ID, version, OS, and fixed quality buckets. It never sends prompts, answers, code, paths, model or tool content, or environment variables. You can disable this later with `reasonix config telemetry off`.", |
| 528 | CLITelemetryConsentPrompt: "Allow anonymous CLI usage statistics?", |
| 529 | CLITelemetryConsentInvalid: "Please answer y or n.", |
| 530 | CLITelemetryConsentSaveFailedFmt: "CLI telemetry remains disabled because the preference could not be saved: %v", |
| 531 | CLITelemetryConsentCleanupFailedFmt: "CLI telemetry is disabled, but pending statistics could not be deleted: %v", |
| 532 | |
| 533 | UsageBody: `reasonix — a config- and plugin-driven coding agent (multi-model) |
| 534 | |
| 535 | Usage: |
| 536 | reasonix [--model NAME] [-c|--continue] [-r|--resume [QUERY]] [--permission-mode MODE] [--effort LEVEL] [--add-dir PATH] interactive session |
| 537 | reasonix -p|--print [--model NAME] [--output-format text|json|stream-json] [--allowed-tools RULES] [--add-dir PATH] <task> |
| 538 | reasonix run [--model NAME] [--max-steps N] [-c|--continue] [--resume PATH] [--copy] [--output-format FORMAT] <task> |
| 539 | reasonix run --events-jsonl [--model NAME] <task> emit redacted structured events as JSONL |
| 540 | reasonix review [--base BRANCH] [--commit SHA] [--model NAME] AI-powered code review on local diffs |
| 541 | reasonix serve [--model NAME] [--addr HOST:PORT] [--auth none|token|password] [--token STR] [--password STR] [--hash-password] serve over HTTP+SSE (with optional auth) |
| 542 | reasonix acp [--model NAME] serve Agent Client Protocol over stdio (also: reasonix --acp) |
| 543 | reasonix setup [path] interactive config wizard; writes reasonix.toml (+ .env) |
| 544 | reasonix config reasoning-language [auto|zh|en] configure visible reasoning language |
| 545 | reasonix config compact-ratio [--local] [65..85] configure automatic compaction threshold |
| 546 | reasonix config telemetry [auto|on|off] configure content-free CLI usage metrics |
| 547 | reasonix report [list|show|send|delete] [ID] review and explicitly send local CLI crash reports |
| 548 | reasonix mcp <add|remove|list|import> manage MCP servers in reasonix.toml |
| 549 | reasonix subagent <list|create|edit|delete|try|run> manage and run isolated subagent profiles |
| 550 | reasonix init show how to generate project memory (AGENTS.md) |
| 551 | reasonix doctor [--json] print redacted local diagnostics |
| 552 | reasonix doctor session <branch-id> [--zip] [--out PATH] export a session conflict diagnostic zip |
| 553 | reasonix session list --json [--dir PATH] list redacted sessions for machine clients |
| 554 | reasonix session show|status <machine-session-id> --json [--dir PATH] query one redacted session |
| 555 | reasonix session recovery [<machine-session-id>] --json [--dir PATH] query redacted recovery state |
| 556 | reasonix hook list|status --json [--dir PATH] inspect redacted hook state |
| 557 | reasonix task list|show|status|events|stop|cancel|monitor|tmux --json [--dir PATH] |
| 558 | inspect or control redacted tasks |
| 559 | reasonix bot start|doctor|weixin-login multi-channel IM bot gateway |
| 560 | reasonix upgrade [--check] [--force] update to the latest official release (also: reasonix update) |
| 561 | reasonix completion bash|zsh|fish print a shell completion script to stdout |
| 562 | reasonix version [--verbose|--json] print version (single line) or build metadata |
| 563 | reasonix --version | -v single-line version (script-safe) |
| 564 | reasonix help |
| 565 | |
| 566 | Examples: |
| 567 | reasonix |
| 568 | reasonix --continue |
| 569 | reasonix --resume provider-config |
| 570 | reasonix run "implement the TODOs in main.go" |
| 571 | reasonix run --model mimo-pro "add unit tests for this function" |
| 572 | reasonix -p "summarize this repository" --output-format json |
| 573 | reasonix subagent run review "review the current changes" |
| 574 | echo "explain this code" | reasonix run |
| 575 | |
| 576 | Configuration: |
| 577 | Resolution: flag > ./reasonix.toml > <Reasonix home>/config.toml > built-in defaults |
| 578 | Secrets come from the environment via api_key_env (e.g. DEEPSEEK_API_KEY). |
| 579 | Run 'reasonix setup' to scaffold a config; see docs/SPEC.md. |
| 580 | `, |
| 581 | } |
| 582 |