@x-otto/tui 0.0.1-alpha.4 → 0.0.1-alpha.6-debug

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/compat.js CHANGED
@@ -1,3 +1,3 @@
1
- import{n as e}from"./i18n-Dju4J1Q-.js";var t=class{commands=new Map;register(e){if(this.commands.has(e.name))throw Error(`Command "/${e.name}" is already registered`);this.commands.set(e.name,e)}get(e){return this.commands.get(e)}find(e){let t=this.commands.get(e);if(t)return t;for(let t of this.commands.values())if(t.aliases?.includes(e))return t}list(){return[...this.commands.values()]}names(){return[...this.commands.keys()]}has(e){return this.commands.has(e)}unregister(e){return this.commands.delete(e)}};function n(){let n=new t;return n.register({name:`help`,description:e.t(`cmdDesc.help`),aliases:[`h`,`?`],type:`action`,source:`builtin`,execute:()=>({kind:`help`})}),n.register({name:`exit`,description:e.t(`cmdDesc.exit`),aliases:[`quit`,`q`],type:`action`,source:`builtin`,execute:e=>{let t=e?.trim()??``;return t===`--restart`||t===`-r`?{kind:`exit`,restart:!0}:{kind:`exit`}}}),n.register({name:`clear`,description:e.t(`cmdDesc.clear`),type:`action`,source:`builtin`,execute:()=>({kind:`clear`})}),n.register({name:`abort`,description:e.t(`cmdDesc.abort`),type:`action`,source:`builtin`,execute:()=>({kind:`abort`})}),n.register({name:`copy`,description:e.t(`cmdDesc.copy`),type:`action`,source:`builtin`,execute:()=>({kind:`copy`})}),n.register({name:`model`,description:e.t(`cmdDesc.model`),aliases:[`m`],type:`action`,source:`builtin`,execute:(t,n)=>{if(!n.models||n.models.length===0)return e.t(`model.noRegistry`);if(t&&n.onModelChange){let r=n.models.find(e=>e.id===t||e.name===t);return r?{kind:`model`,modelId:r.id}:e.t(`model.notFound`,{name:t})}let r=new Map;for(let e of n.models){let t=r.get(e.provider)??[];t.push(e),r.set(e.provider,t)}let i=[``];for(let[e,t]of r){i.push(` ${e}:`);for(let e of t){let t=e.id===n.currentModel?` *`:` `;i.push(` ${t} ${e.id} — ${e.name}`)}}return i.push(``,e.t(`model.listFooter`)),i.join(`
1
+ import{n as e}from"./i18n-BREWHEWk.js";var t=class{commands=new Map;register(e){if(this.commands.has(e.name))throw Error(`Command "/${e.name}" is already registered`);this.commands.set(e.name,e)}get(e){return this.commands.get(e)}find(e){let t=this.commands.get(e);if(t)return t;for(let t of this.commands.values())if(t.aliases?.includes(e))return t}list(){return[...this.commands.values()]}names(){return[...this.commands.keys()]}has(e){return this.commands.has(e)}unregister(e){return this.commands.delete(e)}};function n(){let n=new t;return n.register({name:`help`,description:e.t(`cmdDesc.help`),aliases:[`h`,`?`],type:`action`,source:`builtin`,execute:()=>({kind:`help`})}),n.register({name:`exit`,description:e.t(`cmdDesc.exit`),aliases:[`quit`,`q`],type:`action`,source:`builtin`,execute:e=>{let t=e?.trim()??``;return t===`--restart`||t===`-r`?{kind:`exit`,restart:!0}:{kind:`exit`}}}),n.register({name:`clear`,description:e.t(`cmdDesc.clear`),type:`action`,source:`builtin`,execute:()=>({kind:`clear`})}),n.register({name:`abort`,description:e.t(`cmdDesc.abort`),type:`action`,source:`builtin`,execute:()=>({kind:`abort`})}),n.register({name:`copy`,description:e.t(`cmdDesc.copy`),type:`action`,source:`builtin`,execute:()=>({kind:`copy`})}),n.register({name:`model`,description:e.t(`cmdDesc.model`),aliases:[`m`],type:`action`,source:`builtin`,execute:(t,n)=>{if(!n.models||n.models.length===0)return e.t(`model.noRegistry`);if(t&&n.onModelChange){let r=n.models.find(e=>e.id===t||e.name===t);return r?{kind:`model`,modelId:r.id}:e.t(`model.notFound`,{name:t})}let r=new Map;for(let e of n.models){let t=r.get(e.provider)??[];t.push(e),r.set(e.provider,t)}let i=[``];for(let[e,t]of r){i.push(` ${e}:`);for(let e of t){let t=e.id===n.currentModel?` *`:` `;i.push(` ${t} ${e.id} — ${e.name}`)}}return i.push(``,e.t(`model.listFooter`)),i.join(`
2
2
  `)}}),n.register({name:`status`,description:e.t(`cmdDesc.status`),type:`action`,source:`builtin`,execute:()=>({kind:`status`})}),n}function r(e,t,n){return Promise.resolve({command:`help`,args:``})}export{t as CommandRegistry,n as createBuiltinCommands,r as showCommandPalette};
3
3
  //# sourceMappingURL=compat.js.map
@@ -1,7 +1,7 @@
1
1
  import e from"i18next";import{initReactI18next as t}from"react-i18next";const n={en:{translation:{cmd:{titleInfo:`Info`,titleShell:`Shell`,titleOpen:`Open File`,openNotFound:`File not found: {{path}}`,openBinaryRejected:`Cannot preview binary file: {{path}}`,openBrowserSubtitleRoot:`workspace root`,openBrowserSubtitleDir:`{{relDir}}`,titleMemory:`Memory`,titleExit:`Exit`,titleUpdate:`Update`,titleAborted:`Aborted`,titleLanguage:`Language`,titlePermission:`Permission`,titlePaused:`Paused`,runAborted:`Run aborted`,runWillPauseAfterTurn:`Will pause after the current turn finishes`,noRunningTask:`No task is currently running`,noRunningTaskToPause:`Agent already finished this turn — nothing to pause`,notPaused:`No paused run to continue`,runResumedByCommand:`Resumed`,nothingToPause:`No running task to pause`,pauseCancelled:`Pause request cancelled`,titlePauseRequested:`Pause requested`,memoryDisabled:`Memory is not enabled (no storage)`,memorySaved:`✓ Remembered “{{name}}” → .otto/memory/ (in context from the next turn)`,dangerousBlocked:`Dangerous command blocked: {{reason}}`,dangerousBlockedDetail:`Blocked dangerous command ({{reason}}): {{cmd}}
2
2
  Use the bash tool via the agent for privileged operations.`,noModelConfigured:`No model configured yet — type /setup to see onboarding progress, or /model to pick one directly.`,todoGateContinuing:`Continuing {{round}}/{{cap}}… {{left}} remaining`,budgetExtended:`Tool budget extended (+{{maxTurns}} turns)`,budgetProgressDenied:`No progress in budget window (loop suspected) — asked model to wrap up`,budgetSteered:`Tool budget exhausted ({{maxTurns}}/window) — asked model to wrap up`,progressStallDetected:`Stall detected (same tool call repeated {{maxRepeat}}× without progress) — asked model to change approach`,toolCallMismatchRetry:`Response format issue: model claimed a tool call but sent none — auto-corrected and retrying ({{retryCount}})`,toolCallMismatchTerminated:`Response format issue persisted — stopped. Please resend, or try a different model.`,pressCtrlCAgain:`Press Ctrl+C again to exit`,updateToast:`otto v{{latest}} available — type /upgrade`,updateNotifAvailable:`otto v{{latest}} available (current v{{current}})`,updateNotifForced:`otto v{{latest}} forced upgrade (current v{{current}})`,updateForcedBanner:`otto v{{latest}} is a required update. Current: v{{current}}.
3
3
 
4
- Type /upgrade --force to install and restart now.`,titleMemoryPressure:`Memory pressure`,memoryPressureRestartNow:`Restart now`,memoryPressureRemindLater:`Remind me later`,titleAutoCompact:`Auto-compact`,autoCompactFailed:`Automatic context compaction failed: {{msg}}`,titleFleetBudget:`Process fleet`,fleetBudgetExceeded:"{{processCount}} otto processes using {{totalRssMb}}MB total - over budget. Run `otto ps` to inspect and sweep orphans.",restartChainDeep:`This session has been restarted {{generation}} times - each restart leaves a chaperone process in the chain. Exit fully and reopen the terminal to release them.`,memoryPressureSuppress:`Don't ask again this session`,memoryPressureResumeAbortedMessage:`Memory pressure is still high after restart — auto-resume was skipped. Your unfinished message is preserved in history; resend it manually when ready.`,memoryPressureResumeFailedMessage:`Auto-resume failed after restart. Please resend your message manually.`,titleStaleBuild:`New build detected`,staleBuildMessage:`You are running build {{current}}, but build {{latest}} is already available on disk. Consider /exit to restart and pick up the latest fixes.`,titleContextPressure:`Context usage`,contextPressureApproaching:`Context usage at {{pct}}%, approaching the auto-prune threshold`,contextPressureNearing:`Context usage at {{pct}}%, within the auto-prune range`,contextPressureCritical:`Context usage at {{pct}}%, auto-compaction imminent`,titleError:`Error`,resumeNotFound:`Session "{{id}}" not found — started a new session.`,modelsRefreshed:`Models refreshed: {{summary}} (/model to view, ✓ = available)`,modelsRefreshedEmpty:`Model refresh: no providers to pull from (using cache/built-in)`,titleSetupRequired:`Setup required`,titleSetupReady:`Ready`,setupReadyMessage:`Model ready — just type a message to start!`,modelNotSupported:`This model may not be supported by your account. Type /model to pick one marked ✓ (available), or /model refresh.`,rateLimitedRetriesExhausted:`The current model hit a server-side rate limit (not an account quota exhaustion) and automatic retries were exhausted. Retry shortly, or type /model to switch to another available model.`,requestFailed:`Request failed: {{msg}}`,resumeContinueLabel:`Continue this session:`,titleEffort:`Effort`,selectEffortTitle:`Select reasoning effort`,selectLanguageTitle:`Language`,titlePreference:`Preferences`,preferenceUsage:`Usage: /preference [general|lang|theme]`,prefOptionLang:`Language`,prefOptionTheme:`Theme`,prefOptionGeneral:`General`,prefDescGeneral:`General behavior, notifications & personalization`,prefDescLang:`Interface display language`,prefDescTheme:`Color appearance (dark / light / system)`,selectGeneralTitle:`General`,genNickname:`Nickname`,genNicknameDesc:`Name shown in sessions & notifications`,genNicknameInputTitle:`Enter nickname`,genNicknamePlaceholder:`Your name…`,genCompletionNotice:`Completion notice`,genCompletionNoticeDesc:`Notify when a task completes`,genSound:`Sound`,genSoundDesc:`Play a sound with notifications`,genUpdateCheck:`Update check`,genUpdateCheckDesc:`Check for updates on startup (notify only)`,toggleOn:`On`,toggleOff:`Off`,genSaved:`Saved`,genSkillLoop:`Skill Loop`,genSkillLoopMissing:`Not installed`,genSkillLoopMissingHint:`Install plugin-skill-inductor to enable`,genSkillLoopEntryDesc:`Auto-extract reusable skills from conversations`,genSkillLoopOn:`On`,genSkillLoopOff:`Off`,genSkillLoopThresholdTitle:`Trigger Threshold`,genSkillLoopThresholdDesc:`Number of messages before skill extraction triggers`,genSkillLoopThreshold:`Threshold`,genSkillLoopThr4:`4 messages (aggressive)`,genSkillLoopThr4Desc:`Triggers after very few messages; for heavy use`,genSkillLoopThr6:`6 messages (default)`,genSkillLoopThr6Desc:`Balanced trigger frequency and quality`,genSkillLoopThr12:`12 messages (conservative)`,genSkillLoopThr12Desc:`Triggers after longer conversations; more stable`,genSkillLoopThr20:`20 messages (very conservative)`,genSkillLoopThr20Desc:`Triggers only in long conversations`,genSkillLoopCooldownTitle:`Cooldown`,genSkillLoopCooldownDesc:`Days before skill extraction can trigger again`,genSkillLoopCooldown:`Cooldown`,genSkillLoopCd3:`3 days`,genSkillLoopCd14:`14 days (default)`,genSkillLoopCd30:`30 days`,genSkillLoopCd365:`365 days`,genSkillLoopCdDays:`{{n}} days`,genSkillLoopStatus:`Skill Loop Status`,genSkillLoopStatusDesc:`View extraction history and skill candidates`,skillLoopOnOff:`On/Off`,skillLoopPanelTitle:`Skill Loop`,skillLoopStatusTitle:`Skill Loop Status`,skillLoopStatusNotInstalled:`Plugin not installed`,skillLoopStatusSuccess:`Successful extractions`,skillLoopStatusPending:`Pending`,skillLoopStatusCandidates:`Skill candidates`,skillLoopStatusCooling:`Cooling down`,skillLoopStatusCount:`count`,skillLoopStatusEpisodes:`episodes`,skillLoopStatusTimes:`times`,skillLoopStatusGroupRecent:`Recent`,skillLoopStatusGroupPending:`Pending`,compatTrusted:`Trusted`,langDescZh:`Simplified Chinese interface`,langDescEn:`English interface`,langDescAuto:`Follow system environment (LANG)`,themeDescDark:`Dark palette, best for low light`,themeDescLight:`Light palette, best for bright light`,themeDescSystem:`Follow terminal / system appearance`,themeUsage:`Unknown theme. Available: dark|light|system. Run /preference theme (no args) to also pick color presets.`,themeDarkPresetOption:`Dark preset`,themeDarkPresetDesc:`Color preset used for dark appearance`,themeLightPresetOption:`Light preset`,themeLightPresetDesc:`Color preset used for light appearance`,themePresetTitleDark:`Dark preset`,themePresetTitleLight:`Light preset`,themePresetBuiltin:`Built-in`,themePresetFromExtension:`From {{id}}`,themePresetReset:`Reset to default`,themePresetResetDesc:`Use the built-in preset for this appearance`,themePresetSaved:`Theme preset saved: {{label}}`,selectCancelled:`Cancelled`,titleCompat:`Trust`,titlePermissions:`Permissions`,titleUpgrade:`Upgrade`,titleCommands:`Commands`,effortUnknown:`Unknown: {{arg}}. Available: {{levels}}`,compatTrusting:`Trusted this project’s .claude executable config — hot-reloading…`,compatReloadFailed:`Reload failed: {{err}}`,compatUntrusted:`Trust revoked (.claude executable surfaces skipped from next startup)`,compatNone:`This project has no .claude executable config (.mcp.json / .claude/commands).`,compatTrustedLabel:`trusted`,compatUntrustedLabel:`untrusted — these surfaces are skipped; type /compat trust to enable`,compatConfigGated:`.otto/config.json high-risk keys ignored ({{keys}}) — type /compat trust to enable`,compatConfigActive:`.otto/config.json high-risk keys active ({{keys}}) — trusted`,listSep:`, `,permsCleared:`Cleared the always-allow list — future actions will prompt again`,upgradeChecking:`Checking for updates… (current v{{current}})`,upgradeNoNetwork:`Cannot reach the npm registry — check your network and retry.`,upgradeLatest:`Already on the latest version v{{current}}`,upgrading:`Upgrading…`,upgradeFailed:`Upgrade failed: {{err}}`,unknownError:`unknown error`,permsSessionLabel:`This session’s always-allow:`,permsProjectLabel:`Project-level always-allow:`,permsClearHint:`Clear this session: /permissions clear`,permsManageHint:`Manage project-level: /permissions add bash(git status) · /permissions remove <entry>`,permsInvalidEntry:`Invalid entry "{{entry}}" — use a tool name like "read" or "bash(git status)" (empty parens "bash()" not allowed)`,permsAdded:`Added to project always-allow: {{entry}}`,permsRemoved:`Removed from project always-allow: {{entry}}`,permsNotFound:`Not in the project always-allow list: {{entry}}`,permsEmpty:`(empty)`,helpGroupSession:`Session`,helpGroupModel:`Model & auth`,helpGroupAgent:`Agent management`,helpGroupDebug:`Debug & diagnostics`,helpGroupUi:`Interface`,helpGroupOther:`Other`,helpPrefixes:`Prefixes`,helpPrefixShell:`Run as shell command`,helpPrefixFile:`Read file into context`,titleJob:`Job`,titleReverted:`Reverted`,titleDelegated:`Delegated`,titlePlugin:`Plugin`,titleExtension:`Extension`,extCategoryLabel:`{{category}}`,extListTitle:`Extensions — {{enabled}}/{{total}} enabled`,extListEmptyTitle:`Extensions — none available`,extListEmptyOption:`No pluggable extensions (add MCP servers / skills / agents / plugins)`,extDiscoverHint:`More plugins available in registries`,extDiscoverButton:`Discover`,jobUsage:`Usage: /job <what to do> — delegate a background agent job (worktree-isolated, full tools). /delegates for progress, /job revert <id> to undo.`,jobReverted:`Job {{id}} reverted: {{msg}}`,jobRevertFailed:`✗ Revert of job {{id}} incomplete ({{status}}): {{msg}}{{conflicts}}`,jobConflictFiles:`
4
+ Type /upgrade --force to install and restart now.`,titleMemoryPressure:`Memory pressure`,memoryPressureRestartNow:`Restart now`,memoryPressureRemindLater:`Remind me later`,titleAutoCompact:`Auto-compact`,autoCompactFailed:`Automatic context compaction failed: {{msg}}`,titleFleetBudget:`Process fleet`,fleetBudgetExceeded:"{{processCount}} otto processes using {{totalRssMb}}MB total - over budget. Run `otto ps` to inspect and sweep orphans.",restartChainDeep:`This session has been restarted {{generation}} times - each restart leaves a chaperone process in the chain. Exit fully and reopen the terminal to release them.`,memoryPressureSuppress:`Don't ask again this session`,memoryPressureResumeAbortedMessage:`Memory pressure is still high after restart — auto-resume was skipped. Your unfinished message is preserved in history; resend it manually when ready.`,memoryPressureResumeFailedMessage:`Auto-resume failed after restart. Please resend your message manually.`,titleStaleBuild:`New build detected`,staleBuildMessage:`You are running build {{current}}, but build {{latest}} is already available on disk. Consider /exit to restart and pick up the latest fixes.`,titleContextPressure:`Context usage`,contextPressureApproaching:`Context usage at {{pct}}%, approaching the auto-prune threshold`,contextPressureNearing:`Context usage at {{pct}}%, within the auto-prune range`,contextPressureCritical:`Context usage at {{pct}}%, auto-compaction imminent`,titleError:`Error`,resumeNotFound:`Session "{{id}}" not found — started a new session.`,modelsRefreshed:`Models refreshed: {{summary}} (/model to view, ✓ = available)`,modelsRefreshedEmpty:`Model refresh: no providers to pull from (using cache/built-in)`,titleSetupRequired:`Setup required`,titleSetupReady:`Ready`,setupReadyMessage:`Model ready — just type a message to start!`,modelNotSupported:`This model may not be supported by your account. Type /model to pick one marked ✓ (available), or /model refresh.`,rateLimitedRetriesExhausted:`The current model hit a server-side rate limit (not an account quota exhaustion) and automatic retries were exhausted. Retry shortly, or type /model to switch to another available model.`,requestFailed:`Request failed: {{msg}}`,resumeContinueLabel:`Continue this session:`,titleEffort:`Effort`,selectEffortTitle:`Select reasoning effort`,selectLanguageTitle:`Language`,titlePreference:`Preferences`,preferenceUsage:`Usage: /preference [general|lang|theme]`,prefOptionLang:`Language`,prefOptionTheme:`Theme`,prefOptionGeneral:`General`,prefDescGeneral:`General behavior, notifications & personalization`,prefDescLang:`Interface display language`,prefDescTheme:`Color appearance (dark / light / system)`,selectGeneralTitle:`General`,genNickname:`Nickname`,genNicknameDesc:`Name shown in sessions & notifications`,genNicknameInputTitle:`Enter nickname`,genNicknamePlaceholder:`Your name…`,genCompletionNotice:`Completion notice`,genCompletionNoticeDesc:`Notify when a task completes`,genSound:`Sound`,genSoundDesc:`Play a sound with notifications`,genUpdateCheck:`Update check`,genUpdateCheckDesc:`Check for updates on startup (notify only)`,toggleOn:`On`,toggleOff:`Off`,genSaved:`Saved`,genSkillLoop:`Skill Loop`,genSkillLoopMissing:`Not installed`,genSkillLoopMissingHint:`Install plugin-skill-inductor to enable`,genSkillLoopEntryDesc:`Auto-extract reusable skills from conversations`,genSkillLoopOn:`On`,genSkillLoopOff:`Off`,genSkillLoopThresholdTitle:`Trigger Threshold`,genSkillLoopThresholdDesc:`Number of messages before skill extraction triggers`,genSkillLoopThreshold:`Threshold`,genSkillLoopThr4:`4 messages (aggressive)`,genSkillLoopThr4Desc:`Triggers after very few messages; for heavy use`,genSkillLoopThr6:`6 messages (default)`,genSkillLoopThr6Desc:`Balanced trigger frequency and quality`,genSkillLoopThr12:`12 messages (conservative)`,genSkillLoopThr12Desc:`Triggers after longer conversations; more stable`,genSkillLoopThr20:`20 messages (very conservative)`,genSkillLoopThr20Desc:`Triggers only in long conversations`,genSkillLoopCooldownTitle:`Cooldown`,genSkillLoopCooldownDesc:`Days before skill extraction can trigger again`,genSkillLoopCooldown:`Cooldown`,genSkillLoopCd3:`3 days`,genSkillLoopCd14:`14 days (default)`,genSkillLoopCd30:`30 days`,genSkillLoopCd365:`365 days`,genSkillLoopCdDays:`{{n}} days`,genSkillLoopStatus:`Skill Loop Status`,genSkillLoopStatusDesc:`View extraction history and skill candidates`,skillLoopOnOff:`On/Off`,skillLoopPanelTitle:`Skill Loop`,skillLoopStatusTitle:`Skill Loop Status`,skillLoopStatusNotInstalled:`Plugin not installed`,skillLoopStatusSuccess:`Successful extractions`,skillLoopStatusPending:`Pending`,skillLoopStatusCandidates:`Skill candidates`,skillLoopStatusCooling:`Cooling down`,skillLoopStatusCount:`count`,skillLoopStatusEpisodes:`episodes`,skillLoopStatusTimes:`times`,skillLoopStatusGroupRecent:`Recent`,skillLoopStatusGroupPending:`Pending`,compatTrusted:`Trusted`,langDescZh:`Simplified Chinese interface`,langDescEn:`English interface`,langDescAuto:`Follow system environment (LANG)`,themeDescDark:`Dark palette, best for low light`,themeDescLight:`Light palette, best for bright light`,themeDescSystem:`Follow terminal / system appearance`,themeUsage:`Unknown theme. Available: dark|light|system. Run /preference theme (no args) to also pick color presets.`,themeDarkPresetOption:`Dark preset`,themeDarkPresetDesc:`Color preset used for dark appearance`,themeLightPresetOption:`Light preset`,themeLightPresetDesc:`Color preset used for light appearance`,themePresetTitleDark:`Dark preset`,themePresetTitleLight:`Light preset`,themePresetBuiltin:`Built-in`,themePresetFromExtension:`From {{id}}`,themePresetReset:`Reset to default`,themePresetResetDesc:`Use the built-in preset for this appearance`,themePresetSaved:`Theme preset saved: {{label}}`,selectCancelled:`Cancelled`,titleCompat:`Trust`,titlePermissions:`Permissions`,titleUpgrade:`Upgrade`,titleCommands:`Commands`,effortUnknown:`Unknown: {{arg}}. Available: {{levels}}`,compatTrusting:`Trusted this project’s .claude executable config — hot-reloading…`,compatReloadFailed:`Reload failed: {{err}}`,compatUntrusted:`Trust revoked (.claude executable surfaces skipped from next startup)`,compatNone:`This project has no .claude executable config (.mcp.json / .claude/commands).`,compatTrustedLabel:`trusted`,compatUntrustedLabel:`untrusted — these surfaces are skipped; type /compat trust to enable`,compatConfigGated:`.otto/config.json high-risk keys ignored ({{keys}}) — type /compat trust to enable`,compatConfigActive:`.otto/config.json high-risk keys active ({{keys}}) — trusted`,listSep:`, `,permsCleared:`Cleared the always-allow list — future actions will prompt again`,upgradeChecking:`Checking for updates… (current v{{current}})`,upgradeNoNetwork:`Cannot reach the npm registry — check your network and retry.`,upgradeLatest:`Already on the latest version v{{current}}`,upgrading:`Upgrading…`,upgradeFailed:`Upgrade failed: {{err}}`,unknownError:`unknown error`,permsSessionLabel:`This session’s always-allow:`,permsProjectLabel:`Project-level always-allow:`,permsClearHint:`Clear this session: /permissions clear`,permsManageHint:`Manage project-level: /permissions add bash(git status) · /permissions remove <entry>`,permsInvalidEntry:`Invalid entry "{{entry}}" — use a tool name like "read" or "bash(git status)" (empty parens "bash()" not allowed)`,permsAdded:`Added to project always-allow: {{entry}}`,permsRemoved:`Removed from project always-allow: {{entry}}`,permsNotFound:`Not in the project always-allow list: {{entry}}`,permsEmpty:`(empty)`,helpGroupSession:`Session`,helpGroupModel:`Model & auth`,helpGroupAgent:`Agent management`,helpGroupDebug:`Debug & diagnostics`,helpGroupUi:`Interface`,helpGroupOther:`Other`,helpPrefixes:`Prefixes`,helpPrefixShell:`Run as shell command`,helpPrefixFile:`Read file into context`,titleJob:`Job`,titleReverted:`Reverted`,titleDelegated:`Delegated`,titlePlugin:`Plugin`,titleExtension:`Extension`,extCategoryLabel:`{{category}}`,extAppliesNextTurn:`applies next turn`,extListTitle:`Extensions — {{enabled}}/{{total}} enabled`,extListEmptyTitle:`Extensions — none available`,extListEmptyOption:`No pluggable extensions (add MCP servers / skills / agents / plugins)`,extDiscoverHint:`More plugins available in registries`,extDiscoverButton:`Discover`,jobUsage:`Usage: /job <what to do> — delegate a background agent job (worktree-isolated, full tools). /delegates for progress, /job revert <id> to undo.`,jobReverted:`Job {{id}} reverted: {{msg}}`,jobRevertFailed:`✗ Revert of job {{id}} incomplete ({{status}}): {{msg}}{{conflicts}}`,jobConflictFiles:`
5
5
  Conflicting files:
6
6
  {{joinedPaths}}`,delegated:`{{title}}
7
7
  See progress in the /delegates pane`,delegateFailed:`Delegation failed: {{err}}`,extEnableLabel:`Enable`,extDisableLabel:`Disable`,extReconnectLabel:`↻ Reconnect`,extReloadLabel:`Reload`,extMcpTitle:`{{name}} — status {{status}} · pick an action · Esc to close`,extItemTitle:`{{name}} — pick an action · Esc to close`,extPluginGroupTitle:`Plugin Info`,extPluginLabelDesc:`Description`,extPluginLabelScope:`Scope`,extPluginLabelTrust:`Trust`,extPluginLabelSurfaces:`Contributes`,extPluginLabelContributions:`Axes`,extPluginLabelStatus:`Status`,extSkillGroupOverview:`Overview`,extSkillLabelDesc:`Description`,extSkillLabelStatus:`Status`,extSkillLabelSource:`Source`,extSkillGroupTrigger:`Trigger`,extSkillLabelTriggerMode:`Mode`,extSkillLabelPriority:`Priority`,extSkillGroupDependencies:`Dependencies`,extSkillLabelDependencies:`Depends on`,extSkillGroupTags:`Tags`,extSkillLabelTags:`Tags`,extSkillGroupError:`Error`,extSkillNoDependencies:`No dependencies`,extSkillNoTags:`No tags`,extSkillTriggerAuto:`Auto (matched by description)`,extSkillTriggerManual:`Manual (explicit call only)`,extViewFullTextLabel:`View full text`,extSkillFullTextTitle:`{{name}} — SKILL.md body`,extSkillNoBody:`(no body content)`,extAgentGroupOverview:`Overview`,extAgentLabelDesc:`Description`,extAgentLabelStatus:`Status`,extAgentGroupCapabilities:`Task & Capabilities`,extAgentLabelTaskTypes:`Task types`,extAgentLabelCapabilities:`Capabilities`,extAgentGroupTools:`Tool permissions`,extAgentLabelDefaultTools:`Default tool allowlist`,extAgentLabelDisallowedTools:`Disallowed tool denylist`,extAgentGroupExecution:`Execution config`,extAgentLabelPromptMode:`Prompt injection mode`,extAgentLabelModelTier:`Preferred model tier`,extAgentLabelAllowSubagents:`Allow sub-agent delegation`,extAgentNoTaskTypes:`not declared`,extAgentNoCapabilities:`not declared`,extAgentAllTools:`inherits all (unrestricted)`,extAgentNoDisallowedTools:`none`,extAgentFullTextTitle:`{{name}} — system prompt template`,extPluginTrustLabel:`Trust executable surfaces`,extPluginUntrustLabel:`Revoke trust`,extPluginOpenPanelLabel:`{{title}}`,extPluginTrusted:`trusted`,extPluginUntrusted:`untrusted (project — executable surfaces gated)`,extPluginNoSurface:`no executable surface (always trusted)`,extPluginCapabilityPending:`trusted · high-risk capabilities pending ({{caps}})`,extToggleFailed:`Toggle failed: {{err}}`,extToggleReloadFailed:`{{verb}} {{name}}, but reloading capabilities failed: {{err}} (state saved, retry reload)`,extReconnectUnavailable:`Cannot reconnect {{id}} (not configured or MCP not ready)`,extReconnected:`Reconnected {{id}}`,extReconnectFailed:`Reconnect {{id}} failed: {{err}}`,extLogSectionTitle:`Recent logs`,extNoLogs:`No logs yet`,extRefreshHint:`r refresh`,errorRetryPluginSource:`From plugin: {{pluginId}}`,pluginNotFound:`Plugin "{{id}}" not found (under <.otto>/plugins/)`,pluginTrusting:`Trusted plugin {{id}}’s executable surfaces — hot-reloading…`,pluginUntrusted:`Revoked trust for {{id}} (its executable surfaces skipped from next discovery)`,pluginTrustConfirmTitle:`Trust plugin "{{id}}"?`,pluginTrustConfirmIntro:`Trusting enables its executable surface — this runs code:`,pluginSurfaceMcp:`.mcp.json — launches MCP server binaries`,pluginSurfaceCommands:`commands/ — !cmd expands to a shell command`,pluginSurfaceScripts:`postinstall/setup — runs shell on install/first load`,pluginSurfacePanels:`panels — runs in-process code in the TUI`,pluginSurfaceSkills:`skills/ — injects prompt content the model may follow`,pluginSurfaceAgents:`agents/ — injects an agent profile (inherits all tools by default)`,pluginCapabilityIntro:`This plugin requests the following high-risk capabilities:`,pluginCapabilityProvider:`provider — registers an LLM provider, handling your credentials and request traffic`,pluginCapabilityTools:`tools — registers tools callable by agents`,pluginCapabilityTuiRenderer:`tui.renderer — runs custom rendering code inside the TUI process`,pluginCapabilityNetwork:`network — makes arbitrary network requests`,pluginCapabilityWireProtocol:`wire-protocol — intercepts all provider requests/responses, including credentials`,pluginCapabilityA2uiComponent:`a2ui.component — runs custom rendering code inside the TUI process`,pluginCapabilityPanelBackend:`panel.backend — panel can drive backend actions with side effects`,pluginCapabilityInputResolver:`input.resolver — expands @ references at submit time, injecting content into the prompt`,pluginCapabilityA2uiRenderer:`a2ui.renderer — runs custom code to render messages across TUI and web-ui`,pluginTrustConfirmHint:`Only trust plugins whose source you have reviewed.`,pluginTrustConfirmAction:`Trust`,scopeGlobal:`global`,scopeProject:`project`,scopeRepository:`repository`,commonCancel:`Cancel`,commonClose:`Close`,unknownLabel:`(unknown)`,titleInstall:`Install`,titleDryRun:`Dry-run`,titleUninstall:`Uninstall`,installUsage:`Usage: /install [--global] [--here] [--force] [--dry-run] [--as plugin|skill|mcp] <source>
@@ -36,10 +36,10 @@ Is this a project you created or trust (your own code, a well-known
36
36
  open-source project, or work from your team)? Otto will read, edit, and
37
37
  run files here. If unsure, review the folder first or open it read-only.`,optTrust:`Trust — full access (read / edit / run + apply its config)`,optReadonly:`Read-only this session — safe look, no write / run / network`,optExit:`No, exit`},parent:{title:`Parent workspace detected`,body:`No workspace identity found in {{currentRoot}},
38
38
  but parent directory {{parentRoot}} already has one.`,optUseParent:`Use parent workspace — share sessions & memory`,optCreateNew:`Create new workspace here — independent identity`,optExit:`Exit`},notif:{title:`Notifications`,readDivider:`──── Read ────`},confirm:{reset:`Confirm Reset`,replace:`Confirm Replace`,abortConfirmTitle:`Abort agent?`,abortConfirmMessage:`The agent is currently working. If you abort, the current turn will be lost and any pending writes may be incomplete.`,exitConfirmTitle:`Abort and exit otto?`,exitConfirmMessage:`The agent is currently working. Exiting will abort the current turn, and any pending writes may be incomplete.`,exitRestartConfirmTitle:`Abort and restart otto?`},cache:{sessionLabel:`session`,lastTurnLabel:`last turn`},recovery:{titleProvider:`No AI provider yet`,hintProvider:`otto needs a provider to talk to a model.`,ctaProvider:`Run /setup to install one`,titleAuth:`Provider installed, not connected`,hintAuth:`Sign in or paste an API key to continue.`,ctaAuth:`Run /setup to connect`,titleModel:`No usable model yet`,hintModel:`Credentials may be missing or expired.`,ctaModel:`Run /setup to choose a model`},setup:{wizardApiKeyPlaceholder:`Type or paste your key, then press Enter to confirm`,title:`Setup Wizard`,welcomeTitle:`Welcome to otto, your AI coding companion`,welcomeGreeting:``,welcomeDescription:`This wizard will guide you through setting up otto in 4 quick steps: choose an AI provider, log in, pick a model, then start chatting.`,welcomeDontShowAgain:`Don't show this wizard again`,welcomeStart:`Start`,welcomeCancel:`Cancel`,step1Subtitle:`otto needs at least one AI provider to work. Pick one to install — you can add more later with /extension.`,step3Subtitle:`Choose how to authenticate with your provider.`,step4Subtitle:`Pick a model to start chatting.`,step5Done:`All set! Type a message to start.`,installing:`Installing…`,installed:`Installed!`,installFailed:`Installation failed: {{reason}}`,loginOAuth:`Sign in with OAuth (recommended)`,loginApiKey:`Paste an API key`,loggingIn:`Logging in…`,loginFailed:`Login failed: {{reason}}`,exitTitle:`Exit Wizard`,exitConfirm:`Exit the setup wizard? Progress will be saved — you can resume later with /setup.`,errorTitle:`Setup Error`,errorMessage:`Setup step {{step}} failed: {{msg}}
39
- A crash report has been recorded.`,stepNameProvider:`Provider`,stepNameLogin:`Login`,stepNameModel:`Model`,stepNameStart:`Start`,actionInstall:`install`,actionLogin:`log in`,installPendingCapabilities:`Installed, but some capabilities still need authorization — run /extension to grant them, or this provider will offer no models.`,modelRecommendedTag:`Recommended`,modelRecommendedHint:`Recommended first — you can switch anytime with /model.`,modelUnusableUnauthenticated:`needs sign-in`,modelUnusableOauthRisk:`subscription plan may be rate-limited`,authFailedNetwork:`Could not reach the sign-in service. Your network or proxy may be blocking it.`,authFailedRejected:`Authorization did not complete.`,actionOpenProxySettings:`Open proxy settings`,actionRetryAuth:`Try signing in again`,oauthWaiting:`Waiting for approval in your browser…`,actionOpenAgain:`Open the sign-in page again`,actionUseApiKeyInstead:`Use an API key instead`,apiKeyStorageNote:`Saved to your local credentials file — never written to this project or the chat history.`,installFailedRecovery:`Could not install {{provider}}. Pick what to do next:`,actionRetryInstall:`Retry install`,actionChooseAnotherProvider:`Choose another provider`,capabilityGranted:`Granted capabilities: {{caps}}`,capabilityRevokeHint:`You can revoke this anytime in /extension.`},install:{title:`Installing {{source}}`,phaseResolving:`Resolving source…`,phaseDetecting:`Detecting content…`,phaseInstalling:`Installing…`,phaseRefreshing:`Refreshing…`,reloadingDetail:`Reloading capabilities…`,done:`Installed`,summaryFailed:`Install failed`,summaryPartial:`Partially installed`,nextStepForce:`Tip: add --force to overwrite the existing item`,nextStepReload:`Tip: run /reload to refresh capabilities manually`,failureOverflow:` (full list in the message below)`,partialCounts:`{{ok}} installed, {{fail}} failed: `},proxy:{title:`Proxy`,groupConfig:`configuration`,groupAbout:`about`,fieldUrl:`Proxy address`,fieldEnabled:`Status`,dialogSetUrl:`Set proxy address`,dialogEditUrl:`Edit proxy address`,urlPlaceholder:`http://127.0.0.1:7890`,urlEmpty:`not set — e.g. http://127.0.0.1:7890`,stateEnabled:`Enabled`,stateDisabled:`Disabled`,actionClear:`Clear configuration`,clearTitle:`Clear proxy configuration`,clearMessage:`Clear the proxy configuration? ({{url}})`,clearConfirm:`Clear`,aboutScope:`Applies to all outbound HTTP: model APIs, sign-in, web fetch, updates.`,aboutLoopback:`Local addresses (localhost / 127.0.0.1) always connect directly.`,aboutStorage:`Stored in {{path}}`,aboutCommand:`Command line: /proxy [<url>|on|off|status|clear]`,actionTest:`Test connection`,actionAdoptEnv:`Use system proxy {{value}} (from {{source}})`,probeProbing:`Testing…`,probeOk:`Reachable via proxy — {{latency}}ms ({{target}})`,probeFailedProxy:`Proxy unreachable — {{reason}}`,probeFailedTarget:`Proxy works, but target unreachable — {{reason}}`,probeNoModel:`Configure a model first, then test the connection`,effectiveMismatch:`In effect: {{effective}} — restart the session to apply changes`,effectiveNotApplied:`Not in effect yet — restart the session to apply changes`,envDetectedToast:`Detected {{source}}={{value}} — open /proxy to use it`},crashGap:{toastTitle:`Some messages were lost in the previous crash`,toastBody:`About {{lostTurns}} turn(s) of messages could not be saved when the previous process terminated abnormally (e.g. out of memory or force-killed) and cannot be recovered. Earlier conversation history is intact.`},signalBar:{tabHint:`Tab to switch`,clipboard:`Clipboard`,clipboardFailed:`Copy blocked — hold {{modifier}} and drag for native copy`},clipboard:{paneTitle:`Clipboard`,viewerTitle:`Clipboard content`,charsLabel:`{{count}} chars`,empty:`Nothing copied yet`,openHint:`view`},mouse:{toggleTitle:`Mouse`,enabledBody:`On — drag selects and copies; hold {{modifier}} for terminal native selection; wheel scrolls`,disabledBody:`Off — terminal native selection restored, wheel disabled (use Alt+↑/↓)`}}},zh:{translation:{cmd:{titleInfo:`提示`,titleShell:`Shell`,titleOpen:`打开文件`,openNotFound:`文件不存在:{{path}}`,openBinaryRejected:`无法预览二进制文件:{{path}}`,openBrowserSubtitleRoot:`工作区根目录`,openBrowserSubtitleDir:`{{relDir}}`,titleMemory:`记忆`,titleExit:`退出`,titleUpdate:`更新`,titleAborted:`已中止`,titleLanguage:`语言`,titlePermission:`权限`,titlePaused:`已暂停`,runAborted:`运行已中止`,runWillPauseAfterTurn:`将在当前回合结束后暂停`,noRunningTask:`当前没有正在运行的任务`,noRunningTaskToPause:`Agent 已完成当前回合,无需暂停`,notPaused:`当前没有暂停的运行`,runResumedByCommand:`已继续`,nothingToPause:`当前没有运行的任务`,pauseCancelled:`暂停请求已取消`,titlePauseRequested:`已请求暂停`,memoryDisabled:`记忆未启用(无存储)`,memorySaved:`✓ 已记忆「{{name}}」→ .otto/memory/(下回合起进上下文)`,dangerousBlocked:`危险命令已拦截:{{reason}}`,dangerousBlockedDetail:`已拦截危险命令({{reason}}):{{cmd}}
39
+ A crash report has been recorded.`,stepNameProvider:`Provider`,stepNameLogin:`Login`,stepNameModel:`Model`,stepNameStart:`Start`,actionInstall:`install`,actionLogin:`log in`,installingProvider:`Installing {{provider}}…`,installedProvider:`Installed {{provider}}`,installPendingCapabilities:`Installed, but some capabilities still need authorization — run /extension to grant them, or this provider will offer no models.`,modelRecommendedTag:`Recommended`,modelRecommendedHint:`Recommended first — you can switch anytime with /model.`,modelUnusableUnauthenticated:`needs sign-in`,modelUnusableOauthRisk:`subscription plan may be rate-limited`,authFailedNetwork:`Could not reach the sign-in service. Your network or proxy may be blocking it.`,authFailedRejected:`Authorization did not complete.`,actionOpenProxySettings:`Open proxy settings`,actionRetryAuth:`Try signing in again`,oauthWaiting:`Waiting for approval in your browser…`,actionOpenAgain:`Open the sign-in page again`,actionUseApiKeyInstead:`Use an API key instead`,apiKeyStorageNote:`Saved to your local credentials file — never written to this project or the chat history.`,installFailedRecovery:`Could not install {{provider}}. Pick what to do next:`,actionRetryInstall:`Retry install`,actionChooseAnotherProvider:`Choose another provider`,capabilityGranted:`Granted capabilities: {{caps}}`,capabilityRevokeHint:`You can revoke this anytime in /extension.`},install:{title:`Installing {{source}}`,phaseResolving:`Resolving source…`,phaseDetecting:`Detecting content…`,phaseInstalling:`Installing…`,phaseRefreshing:`Refreshing…`,reloadingDetail:`Reloading capabilities…`,done:`Installed`,summaryFailed:`Install failed`,summaryPartial:`Partially installed`,nextStepForce:`Tip: add --force to overwrite the existing item`,nextStepReload:`Tip: run /reload to refresh capabilities manually`,failureOverflow:` (full list in the message below)`,partialCounts:`{{ok}} installed, {{fail}} failed: `},proxy:{title:`Proxy`,groupConfig:`configuration`,groupAbout:`about`,fieldUrl:`Proxy address`,fieldEnabled:`Status`,dialogSetUrl:`Set proxy address`,dialogEditUrl:`Edit proxy address`,urlPlaceholder:`http://127.0.0.1:7890`,urlEmpty:`not set — e.g. http://127.0.0.1:7890`,stateEnabled:`Enabled`,stateDisabled:`Disabled`,actionClear:`Clear configuration`,clearTitle:`Clear proxy configuration`,clearMessage:`Clear the proxy configuration? ({{url}})`,clearConfirm:`Clear`,aboutScope:`Applies to all outbound HTTP: model APIs, sign-in, web fetch, updates.`,aboutLoopback:`Local addresses (localhost / 127.0.0.1) always connect directly.`,aboutStorage:`Stored in {{path}}`,aboutCommand:`Command line: /proxy [<url>|on|off|status|clear]`,actionTest:`Test connection`,actionAdoptEnv:`Use system proxy {{value}} (from {{source}})`,probeProbing:`Testing…`,probeOk:`Reachable via proxy — {{latency}}ms ({{target}})`,probeFailedProxy:`Proxy unreachable — {{reason}}`,probeFailedTarget:`Proxy works, but target unreachable — {{reason}}`,probeNoModel:`Configure a model first, then test the connection`,effectiveMismatch:`In effect: {{effective}} — restart the session to apply changes`,effectiveNotApplied:`Not in effect yet — restart the session to apply changes`,envDetectedToast:`Detected {{source}}={{value}} — open /proxy to use it`},crashGap:{toastTitle:`Some messages were lost in the previous crash`,toastBody:`About {{lostTurns}} turn(s) of messages could not be saved when the previous process terminated abnormally (e.g. out of memory or force-killed) and cannot be recovered. Earlier conversation history is intact.`},signalBar:{tabHint:`Tab to switch`,clipboard:`Clipboard`,clipboardFailed:`Copy blocked — hold {{modifier}} and drag for native copy`},clipboard:{paneTitle:`Clipboard`,viewerTitle:`Clipboard content`,charsLabel:`{{count}} chars`,empty:`Nothing copied yet`,openHint:`view`},mouse:{toggleTitle:`Mouse`,enabledBody:`On — drag selects and copies; hold {{modifier}} for terminal native selection; wheel scrolls`,disabledBody:`Off — terminal native selection restored, wheel disabled (use Alt+↑/↓)`}}},zh:{translation:{cmd:{titleInfo:`提示`,titleShell:`Shell`,titleOpen:`打开文件`,openNotFound:`文件不存在:{{path}}`,openBinaryRejected:`无法预览二进制文件:{{path}}`,openBrowserSubtitleRoot:`工作区根目录`,openBrowserSubtitleDir:`{{relDir}}`,titleMemory:`记忆`,titleExit:`退出`,titleUpdate:`更新`,titleAborted:`已中止`,titleLanguage:`语言`,titlePermission:`权限`,titlePaused:`已暂停`,runAborted:`运行已中止`,runWillPauseAfterTurn:`将在当前回合结束后暂停`,noRunningTask:`当前没有正在运行的任务`,noRunningTaskToPause:`Agent 已完成当前回合,无需暂停`,notPaused:`当前没有暂停的运行`,runResumedByCommand:`已继续`,nothingToPause:`当前没有运行的任务`,pauseCancelled:`暂停请求已取消`,titlePauseRequested:`已请求暂停`,memoryDisabled:`记忆未启用(无存储)`,memorySaved:`✓ 已记忆「{{name}}」→ .otto/memory/(下回合起进上下文)`,dangerousBlocked:`危险命令已拦截:{{reason}}`,dangerousBlockedDetail:`已拦截危险命令({{reason}}):{{cmd}}
40
40
  如需特权操作,请经 agent 用 bash 工具。`,noModelConfigured:`尚未配置模型——输入 /setup 查看上手进度,或 /model 直接选择模型。`,todoGateContinuing:`续跑中 {{round}}/{{cap}}… {{left}} 项未完成`,budgetExtended:`工具预算已扩展(+{{maxTurns}} 轮)`,budgetProgressDenied:`预算窗口无进展(疑似循环)——已请求模型收尾`,budgetSteered:`工具预算耗尽(每窗口 {{maxTurns}} 轮)——已请求模型收尾`,progressStallDetected:`检测到停滞(同一工具调用反复 {{maxRepeat}} 次且无进展)——已请求模型更换策略`,toolCallMismatchRetry:`响应格式异常:模型声称要调用工具但未发出有效调用——已自动纠正并重试(第 {{retryCount}} 次)`,toolCallMismatchTerminated:`响应格式持续异常——已停止。请重新发送,或更换模型。`,pressCtrlCAgain:`再按一次 Ctrl+C 退出`,updateToast:`otto v{{latest}} 可用 — 输入 /upgrade 升级`,updateNotifAvailable:`otto v{{latest}} 可用(当前 v{{current}})`,updateNotifForced:`otto v{{latest}} 强制升级(当前 v{{current}})`,updateForcedBanner:`otto v{{latest}} 为必需更新。当前:v{{current}}。
41
41
 
42
- 输入 /upgrade --force 立即安装并重启。`,titleMemoryPressure:`内存压力`,memoryPressureRestartNow:`立即重启`,memoryPressureRemindLater:`稍后提醒`,titleAutoCompact:`自动压缩`,autoCompactFailed:`自动上下文压缩失败:{{msg}}`,titleFleetBudget:`进程群`,fleetBudgetExceeded:"本机 {{processCount}} 个 otto 进程合计占用 {{totalRssMb}}MB,已超预算。运行 `otto ps` 查看并清扫孤儿进程。",restartChainDeep:`本会话已重启 {{generation}} 次——每次重启会在进程链上留下一个陪跑进程。建议完整退出并重开终端,一次性释放整条链。`,memoryPressureSuppress:`本次会话不再提醒`,memoryPressureResumeAbortedMessage:`重启后内存压力依然过高——已跳过自动续跑。未完成的消息仍保留在历史记录中,可稍后手动重发。`,memoryPressureResumeFailedMessage:`重启后自动续跑失败,请手动重新发送消息。`,titleStaleBuild:`检测到新构建`,staleBuildMessage:`当前运行 build {{current}},磁盘已有更新的 build {{latest}},建议 /exit 重启以获取最新修复`,titleContextPressure:`上下文占用`,contextPressureApproaching:`上下文占用已达 {{pct}}%,接近自动裁剪线`,contextPressureNearing:`上下文占用 {{pct}}%,已进入自动裁剪区间`,contextPressureCritical:`上下文占用 {{pct}}%,即将触发自动压缩`,titleError:`错误`,resumeNotFound:`未找到会话 "{{id}}",已新建会话。`,modelsRefreshed:`已刷新模型:{{summary}}(/model 查看,✓ = 账号可用)`,modelsRefreshedEmpty:`模型刷新:暂无可拉取的 provider(仍用缓存/内置)`,titleSetupRequired:`需要配置`,titleSetupReady:`就绪`,setupReadyMessage:`模型已就绪 — 直接输入消息开始对话!`,modelNotSupported:`该模型可能不被当前账号支持。输入 /model 选一个带 ✓(账号可用)的模型,或 /model refresh 刷新列表。`,rateLimitedRetriesExhausted:`当前模型触发了服务端流量限制(并非账号配额耗尽),自动重试已达上限。可稍后重试,或输入 /model 切换到其他可用模型。`,requestFailed:`请求失败:{{msg}}`,resumeContinueLabel:`续上本会话:`,titleEffort:`投入`,selectEffortTitle:`选择推理投入级别`,selectLanguageTitle:`语言`,titlePreference:`偏好设置`,preferenceUsage:`用法:/preference [general|lang|theme]`,prefOptionLang:`语言`,prefOptionTheme:`主题`,prefOptionGeneral:`常规`,prefDescGeneral:`通用行为、通知与个性化设置`,prefDescLang:`界面显示语言`,prefDescTheme:`配色外观(深色 / 浅色 / 跟随系统)`,selectGeneralTitle:`常规`,genNickname:`昵称`,genNicknameDesc:`会话与通知中个性化显示的称呼`,genNicknameInputTitle:`输入昵称`,genNicknamePlaceholder:`你的称呼…`,genCompletionNotice:`完成通知`,genCompletionNoticeDesc:`任务完成时推送系统通知`,genSound:`提示音`,genSoundDesc:`通知伴随提示音`,genUpdateCheck:`启动检查更新`,genUpdateCheckDesc:`启动时后台检查新版本(仅提示不自动安装)`,toggleOn:`开启`,toggleOff:`关闭`,genSaved:`已保存`,genSkillLoop:`技能回路`,genSkillLoopMissing:`未安装`,genSkillLoopMissingHint:`安装 plugin-skill-inductor 后可用`,genSkillLoopEntryDesc:`自动从对话中归纳可复用技能`,genSkillLoopOn:`开启`,genSkillLoopOff:`关闭`,genSkillLoopThresholdTitle:`触发阈值`,genSkillLoopThresholdDesc:`对话消息数达到此值时触发归纳`,genSkillLoopThreshold:`阈值`,genSkillLoopThr4:`4 条(激进)`,genSkillLoopThr4Desc:`极少对话即触发,适合频繁使用`,genSkillLoopThr6:`6 条(默认)`,genSkillLoopThr6Desc:`平衡触发频率与归纳质量`,genSkillLoopThr12:`12 条(保守)`,genSkillLoopThr12Desc:`较长对话才触发,归纳更稳定`,genSkillLoopThr20:`20 条(极保守)`,genSkillLoopThr20Desc:`仅长对话触发`,genSkillLoopCooldownTitle:`静默期`,genSkillLoopCooldownDesc:`归纳后多少天内不再重复触发`,genSkillLoopCooldown:`静默`,genSkillLoopCd3:`3 天`,genSkillLoopCd14:`14 天(默认)`,genSkillLoopCd30:`30 天`,genSkillLoopCd365:`365 天`,genSkillLoopCdDays:`{{n}} 天`,genSkillLoopStatus:`技能回路状态`,genSkillLoopStatusDesc:`查看归纳历史与候选技能`,skillLoopOnOff:`开/关`,skillLoopPanelTitle:`技能回路`,skillLoopStatusTitle:`技能回路状态`,skillLoopStatusNotInstalled:`插件未安装`,skillLoopStatusSuccess:`成功归纳`,skillLoopStatusPending:`待处理`,skillLoopStatusCandidates:`候选技能`,skillLoopStatusCooling:`静默中`,skillLoopStatusCount:`次数`,skillLoopStatusEpisodes:`回合`,skillLoopStatusTimes:`次`,skillLoopStatusGroupRecent:`最近`,skillLoopStatusGroupPending:`待处理`,compatTrusted:`已信任`,langDescZh:`使用简体中文界面`,langDescEn:`使用英文界面`,langDescAuto:`跟随系统环境(LANG)自动选择`,themeDescDark:`深色配色,适合暗光环境`,themeDescLight:`浅色配色,适合明亮环境`,themeDescSystem:`跟随终端 / 系统外观自动切换`,themeUsage:`未知主题。可用:dark|light|system。运行 /preference theme(不带参数)可选择配色方案。`,themeDarkPresetOption:`深色配色方案`,themeDarkPresetDesc:`深色外观使用的配色方案`,themeLightPresetOption:`浅色配色方案`,themeLightPresetDesc:`浅色外观使用的配色方案`,themePresetTitleDark:`深色配色方案`,themePresetTitleLight:`浅色配色方案`,themePresetBuiltin:`内置`,themePresetFromExtension:`来自 {{id}}`,themePresetReset:`恢复默认`,themePresetResetDesc:`使用该外观的内置配色方案`,themePresetSaved:`主题配色方案已保存:{{label}}`,selectCancelled:`已取消`,titleCompat:`信任`,titlePermissions:`权限`,titleUpgrade:`升级`,titleCommands:`命令`,effortUnknown:`未知: {{arg}}。可用: {{levels}}`,compatTrusting:`已信任本项目的 .claude 可执行配置,热重载中…`,compatReloadFailed:`重载失败:{{err}}`,compatUntrusted:`已撤销信任(下次启动起跳过 .claude 可执行面)`,compatNone:`本项目无 .claude 可执行配置(.mcp.json / .claude/commands)。`,compatTrustedLabel:`已信任`,compatUntrustedLabel:`未信任 — 这些面当前被跳过;输入 /compat trust 启用`,compatConfigGated:`.otto/config.json 高危键已忽略({{keys}})— 输入 /compat trust 启用`,compatConfigActive:`.otto/config.json 高危键已生效({{keys}})— 已信任`,listSep:`、`,permsCleared:`已清空「始终允许」——后续操作将重新弹窗确认`,upgradeChecking:`检查新版本中… (当前 v{{current}})`,upgradeNoNetwork:`无法连接 npm registry,请检查网络后重试。`,upgradeLatest:`已是最新版本 v{{current}}`,upgrading:`升级中…`,upgradeFailed:`升级失败: {{err}}`,unknownError:`未知错误`,permsSessionLabel:`本会话「始终允许」:`,permsProjectLabel:`项目级「始终允许」:`,permsClearHint:`清除本会话:/permissions clear`,permsManageHint:`管理项目级:/permissions add bash(git status) · /permissions remove <条目>`,permsInvalidEntry:`条目「{{entry}}」格式非法——用工具名如「read」或「bash(git status)」(空括号「bash()」不允许)`,permsAdded:`已加入项目级「始终允许」:{{entry}}`,permsRemoved:`已从项目级「始终允许」移除:{{entry}}`,permsNotFound:`不在项目级「始终允许」列表中:{{entry}}`,permsEmpty:`(空)`,helpGroupSession:`会话`,helpGroupModel:`模型与认证`,helpGroupAgent:`代理管理`,helpGroupDebug:`调试与诊断`,helpGroupUi:`界面`,helpGroupOther:`其它`,helpPrefixes:`前缀`,helpPrefixShell:`作为 shell 命令执行`,helpPrefixFile:`读取文件到上下文`,titleJob:`作业`,titleReverted:`已撤销`,titleDelegated:`已委派`,titlePlugin:`插件`,titleExtension:`扩展`,extCategoryLabel:`{{category}}`,extListTitle:`扩展 — 共 {{total}} 个,已启用 {{enabled}} 个`,extListEmptyTitle:`扩展 — 暂无可用`,extDiscoverHint:`可从 registry 搜索安装更多插件`,extDiscoverButton:`去发现`,extListEmptyOption:`暂无可插拔扩展(添加 MCP 服务器 / skills / agents / plugins)`,jobUsage:`用法:/job <要做的事> — 委派后台 agent 作业(worktree 隔离 + 全套工具)。/delegates 看进度,/job revert <id> 撤销。`,jobReverted:`作业 {{id}} 已撤销:{{msg}}`,jobRevertFailed:`✗ 撤销作业 {{id}} 未完成({{status}}):{{msg}}{{conflicts}}`,jobConflictFiles:`
42
+ 输入 /upgrade --force 立即安装并重启。`,titleMemoryPressure:`内存压力`,memoryPressureRestartNow:`立即重启`,memoryPressureRemindLater:`稍后提醒`,titleAutoCompact:`自动压缩`,autoCompactFailed:`自动上下文压缩失败:{{msg}}`,titleFleetBudget:`进程群`,fleetBudgetExceeded:"本机 {{processCount}} 个 otto 进程合计占用 {{totalRssMb}}MB,已超预算。运行 `otto ps` 查看并清扫孤儿进程。",restartChainDeep:`本会话已重启 {{generation}} 次——每次重启会在进程链上留下一个陪跑进程。建议完整退出并重开终端,一次性释放整条链。`,memoryPressureSuppress:`本次会话不再提醒`,memoryPressureResumeAbortedMessage:`重启后内存压力依然过高——已跳过自动续跑。未完成的消息仍保留在历史记录中,可稍后手动重发。`,memoryPressureResumeFailedMessage:`重启后自动续跑失败,请手动重新发送消息。`,titleStaleBuild:`检测到新构建`,staleBuildMessage:`当前运行 build {{current}},磁盘已有更新的 build {{latest}},建议 /exit 重启以获取最新修复`,titleContextPressure:`上下文占用`,contextPressureApproaching:`上下文占用已达 {{pct}}%,接近自动裁剪线`,contextPressureNearing:`上下文占用 {{pct}}%,已进入自动裁剪区间`,contextPressureCritical:`上下文占用 {{pct}}%,即将触发自动压缩`,titleError:`错误`,resumeNotFound:`未找到会话 "{{id}}",已新建会话。`,modelsRefreshed:`已刷新模型:{{summary}}(/model 查看,✓ = 账号可用)`,modelsRefreshedEmpty:`模型刷新:暂无可拉取的 provider(仍用缓存/内置)`,titleSetupRequired:`需要配置`,titleSetupReady:`就绪`,setupReadyMessage:`模型已就绪 — 直接输入消息开始对话!`,modelNotSupported:`该模型可能不被当前账号支持。输入 /model 选一个带 ✓(账号可用)的模型,或 /model refresh 刷新列表。`,rateLimitedRetriesExhausted:`当前模型触发了服务端流量限制(并非账号配额耗尽),自动重试已达上限。可稍后重试,或输入 /model 切换到其他可用模型。`,requestFailed:`请求失败:{{msg}}`,resumeContinueLabel:`续上本会话:`,titleEffort:`投入`,selectEffortTitle:`选择推理投入级别`,selectLanguageTitle:`语言`,titlePreference:`偏好设置`,preferenceUsage:`用法:/preference [general|lang|theme]`,prefOptionLang:`语言`,prefOptionTheme:`主题`,prefOptionGeneral:`常规`,prefDescGeneral:`通用行为、通知与个性化设置`,prefDescLang:`界面显示语言`,prefDescTheme:`配色外观(深色 / 浅色 / 跟随系统)`,selectGeneralTitle:`常规`,genNickname:`昵称`,genNicknameDesc:`会话与通知中个性化显示的称呼`,genNicknameInputTitle:`输入昵称`,genNicknamePlaceholder:`你的称呼…`,genCompletionNotice:`完成通知`,genCompletionNoticeDesc:`任务完成时推送系统通知`,genSound:`提示音`,genSoundDesc:`通知伴随提示音`,genUpdateCheck:`启动检查更新`,genUpdateCheckDesc:`启动时后台检查新版本(仅提示不自动安装)`,toggleOn:`开启`,toggleOff:`关闭`,genSaved:`已保存`,genSkillLoop:`技能回路`,genSkillLoopMissing:`未安装`,genSkillLoopMissingHint:`安装 plugin-skill-inductor 后可用`,genSkillLoopEntryDesc:`自动从对话中归纳可复用技能`,genSkillLoopOn:`开启`,genSkillLoopOff:`关闭`,genSkillLoopThresholdTitle:`触发阈值`,genSkillLoopThresholdDesc:`对话消息数达到此值时触发归纳`,genSkillLoopThreshold:`阈值`,genSkillLoopThr4:`4 条(激进)`,genSkillLoopThr4Desc:`极少对话即触发,适合频繁使用`,genSkillLoopThr6:`6 条(默认)`,genSkillLoopThr6Desc:`平衡触发频率与归纳质量`,genSkillLoopThr12:`12 条(保守)`,genSkillLoopThr12Desc:`较长对话才触发,归纳更稳定`,genSkillLoopThr20:`20 条(极保守)`,genSkillLoopThr20Desc:`仅长对话触发`,genSkillLoopCooldownTitle:`静默期`,genSkillLoopCooldownDesc:`归纳后多少天内不再重复触发`,genSkillLoopCooldown:`静默`,genSkillLoopCd3:`3 天`,genSkillLoopCd14:`14 天(默认)`,genSkillLoopCd30:`30 天`,genSkillLoopCd365:`365 天`,genSkillLoopCdDays:`{{n}} 天`,genSkillLoopStatus:`技能回路状态`,genSkillLoopStatusDesc:`查看归纳历史与候选技能`,skillLoopOnOff:`开/关`,skillLoopPanelTitle:`技能回路`,skillLoopStatusTitle:`技能回路状态`,skillLoopStatusNotInstalled:`插件未安装`,skillLoopStatusSuccess:`成功归纳`,skillLoopStatusPending:`待处理`,skillLoopStatusCandidates:`候选技能`,skillLoopStatusCooling:`静默中`,skillLoopStatusCount:`次数`,skillLoopStatusEpisodes:`回合`,skillLoopStatusTimes:`次`,skillLoopStatusGroupRecent:`最近`,skillLoopStatusGroupPending:`待处理`,compatTrusted:`已信任`,langDescZh:`使用简体中文界面`,langDescEn:`使用英文界面`,langDescAuto:`跟随系统环境(LANG)自动选择`,themeDescDark:`深色配色,适合暗光环境`,themeDescLight:`浅色配色,适合明亮环境`,themeDescSystem:`跟随终端 / 系统外观自动切换`,themeUsage:`未知主题。可用:dark|light|system。运行 /preference theme(不带参数)可选择配色方案。`,themeDarkPresetOption:`深色配色方案`,themeDarkPresetDesc:`深色外观使用的配色方案`,themeLightPresetOption:`浅色配色方案`,themeLightPresetDesc:`浅色外观使用的配色方案`,themePresetTitleDark:`深色配色方案`,themePresetTitleLight:`浅色配色方案`,themePresetBuiltin:`内置`,themePresetFromExtension:`来自 {{id}}`,themePresetReset:`恢复默认`,themePresetResetDesc:`使用该外观的内置配色方案`,themePresetSaved:`主题配色方案已保存:{{label}}`,selectCancelled:`已取消`,titleCompat:`信任`,titlePermissions:`权限`,titleUpgrade:`升级`,titleCommands:`命令`,effortUnknown:`未知: {{arg}}。可用: {{levels}}`,compatTrusting:`已信任本项目的 .claude 可执行配置,热重载中…`,compatReloadFailed:`重载失败:{{err}}`,compatUntrusted:`已撤销信任(下次启动起跳过 .claude 可执行面)`,compatNone:`本项目无 .claude 可执行配置(.mcp.json / .claude/commands)。`,compatTrustedLabel:`已信任`,compatUntrustedLabel:`未信任 — 这些面当前被跳过;输入 /compat trust 启用`,compatConfigGated:`.otto/config.json 高危键已忽略({{keys}})— 输入 /compat trust 启用`,compatConfigActive:`.otto/config.json 高危键已生效({{keys}})— 已信任`,listSep:`、`,permsCleared:`已清空「始终允许」——后续操作将重新弹窗确认`,upgradeChecking:`检查新版本中… (当前 v{{current}})`,upgradeNoNetwork:`无法连接 npm registry,请检查网络后重试。`,upgradeLatest:`已是最新版本 v{{current}}`,upgrading:`升级中…`,upgradeFailed:`升级失败: {{err}}`,unknownError:`未知错误`,permsSessionLabel:`本会话「始终允许」:`,permsProjectLabel:`项目级「始终允许」:`,permsClearHint:`清除本会话:/permissions clear`,permsManageHint:`管理项目级:/permissions add bash(git status) · /permissions remove <条目>`,permsInvalidEntry:`条目「{{entry}}」格式非法——用工具名如「read」或「bash(git status)」(空括号「bash()」不允许)`,permsAdded:`已加入项目级「始终允许」:{{entry}}`,permsRemoved:`已从项目级「始终允许」移除:{{entry}}`,permsNotFound:`不在项目级「始终允许」列表中:{{entry}}`,permsEmpty:`(空)`,helpGroupSession:`会话`,helpGroupModel:`模型与认证`,helpGroupAgent:`代理管理`,helpGroupDebug:`调试与诊断`,helpGroupUi:`界面`,helpGroupOther:`其它`,helpPrefixes:`前缀`,helpPrefixShell:`作为 shell 命令执行`,helpPrefixFile:`读取文件到上下文`,titleJob:`作业`,titleReverted:`已撤销`,titleDelegated:`已委派`,titlePlugin:`插件`,titleExtension:`扩展`,extCategoryLabel:`{{category}}`,extAppliesNextTurn:`下一轮生效`,extListTitle:`扩展 — 共 {{total}} 个,已启用 {{enabled}} 个`,extListEmptyTitle:`扩展 — 暂无可用`,extDiscoverHint:`可从 registry 搜索安装更多插件`,extDiscoverButton:`去发现`,extListEmptyOption:`暂无可插拔扩展(添加 MCP 服务器 / skills / agents / plugins)`,jobUsage:`用法:/job <要做的事> — 委派后台 agent 作业(worktree 隔离 + 全套工具)。/delegates 看进度,/job revert <id> 撤销。`,jobReverted:`作业 {{id}} 已撤销:{{msg}}`,jobRevertFailed:`✗ 撤销作业 {{id}} 未完成({{status}}):{{msg}}{{conflicts}}`,jobConflictFiles:`
43
43
  冲突文件:
44
44
  {{joinedPaths}}`,delegated:`{{title}}
45
45
  /delegates 面板查看进度`,delegateFailed:`委派失败:{{err}}`,extEnableLabel:`启用`,extDisableLabel:`禁用`,extReconnectLabel:`↻ 重新连接`,extReloadLabel:`重载`,extMcpTitle:`{{name}} — 状态 {{status}} · 选操作 · Esc 关`,extItemTitle:`{{name}} — 选操作 · Esc 关`,extPluginGroupTitle:`插件信息`,extPluginLabelDesc:`描述`,extPluginLabelScope:`作用域`,extPluginLabelTrust:`信任`,extPluginLabelSurfaces:`贡献面`,extPluginLabelContributions:`贡献轴`,extPluginLabelStatus:`状态`,extSkillGroupOverview:`概述`,extSkillLabelDesc:`描述`,extSkillLabelStatus:`状态`,extSkillLabelSource:`来源`,extSkillGroupTrigger:`触发方式`,extSkillLabelTriggerMode:`模式`,extSkillLabelPriority:`优先级`,extSkillGroupDependencies:`依赖`,extSkillLabelDependencies:`依赖 skill`,extSkillGroupTags:`标签`,extSkillLabelTags:`标签`,extSkillGroupError:`错误`,extSkillNoDependencies:`无依赖`,extSkillNoTags:`无标签`,extSkillTriggerAuto:`自动(按描述匹配)`,extSkillTriggerManual:`手动(显式调用)`,extViewFullTextLabel:`查看正文`,extSkillFullTextTitle:`{{name}} — SKILL.md 正文`,extSkillNoBody:`(无正文内容)`,extAgentGroupOverview:`概述`,extAgentLabelDesc:`描述`,extAgentLabelStatus:`状态`,extAgentGroupCapabilities:`任务与能力`,extAgentLabelTaskTypes:`任务类型`,extAgentLabelCapabilities:`能力标签`,extAgentGroupTools:`工具权限`,extAgentLabelDefaultTools:`默认工具白名单`,extAgentLabelDisallowedTools:`禁用工具黑名单`,extAgentGroupExecution:`执行配置`,extAgentLabelPromptMode:`提示词注入模式`,extAgentLabelModelTier:`偏好模型层级`,extAgentLabelAllowSubagents:`允许子代理委托`,extAgentNoTaskTypes:`未声明`,extAgentNoCapabilities:`未声明`,extAgentAllTools:`继承全部(未限制)`,extAgentNoDisallowedTools:`无`,extAgentFullTextTitle:`{{name}} — 系统提示词模板`,extPluginTrustLabel:`信任可执行面`,extPluginUntrustLabel:`撤销信任`,extPluginOpenPanelLabel:`{{title}}`,extPluginTrusted:`已信任`,extPluginUntrusted:`未信任(项目级——可执行面被门控)`,extPluginNoSurface:`无可执行面(永远受信任)`,extPluginCapabilityPending:`已信任 · 高危能力待授权({{caps}})`,extToggleFailed:`切换失败:{{err}}`,extToggleReloadFailed:`已{{verb}} {{name}},但刷新能力失败:{{err}}(状态已保存,可重试刷新)`,extReconnectUnavailable:`无法重连 {{id}}(未配置或 MCP 未就绪)`,extReconnected:`已重连 {{id}}`,extReconnectFailed:`重连 {{id}} 失败:{{err}}`,extLogSectionTitle:`最近日志`,extNoLogs:`暂无日志`,extRefreshHint:`r 刷新`,errorRetryPluginSource:`来自插件: {{pluginId}}`,pluginNotFound:`未找到插件 "{{id}}"(在 <.otto>/plugins/ 下)`,pluginTrusting:`已信任插件 {{id}} 的可执行面,热重载中…`,pluginUntrusted:`已撤销对 {{id}} 的信任(下次发现起跳过其可执行面)`,pluginTrustConfirmTitle:`信任插件 "{{id}}"?`,pluginTrustConfirmIntro:`信任将放行其可执行面——这会运行代码:`,pluginSurfaceMcp:`.mcp.json —— 启动 MCP server 二进制`,pluginSurfaceCommands:`commands/ —— !cmd 展开为 shell 命令`,pluginSurfaceScripts:`postinstall/setup —— 安装/首次加载时执行 shell`,pluginSurfacePanels:`panels —— 在 TUI 进程内运行代码`,pluginSurfaceSkills:`skills/ —— 注入模型可能照做的 prompt 内容`,pluginSurfaceAgents:`agents/ —— 注入 agent profile(默认继承全部工具)`,pluginCapabilityIntro:`该插件申请以下高危能力:`,pluginCapabilityProvider:`provider —— 注册 LLM provider,将处理你的凭据与请求流量`,pluginCapabilityTools:`tools —— 注册可被 agent 调用的工具`,pluginCapabilityTuiRenderer:`tui.renderer —— 在 TUI 进程内运行自定义渲染代码`,pluginCapabilityNetwork:`network —— 发起任意网络请求`,pluginCapabilityWireProtocol:`wire-protocol —— 截获全部 provider 请求/响应流量(含凭据)`,pluginCapabilityA2uiComponent:`a2ui.component —— 在 TUI 进程内运行自定义渲染组件代码`,pluginCapabilityPanelBackend:`panel.backend —— 面板可驱动有副作用的后端业务操作`,pluginCapabilityInputResolver:`input.resolver —— 在提交时展开 @ 引用,把内容注入 prompt`,pluginCapabilityA2uiRenderer:`a2ui.renderer —— 运行自定义代码,跨 TUI 与 web-ui 渲染消息`,pluginTrustConfirmHint:`仅信任你已审阅过源码的插件。`,pluginTrustConfirmAction:`信任`,scopeGlobal:`全局`,scopeProject:`项目`,scopeRepository:`仓库`,commonCancel:`取消`,commonClose:`关闭`,unknownLabel:`(未知)`,titleInstall:`安装`,titleDryRun:`预演`,titleUninstall:`卸载`,installUsage:`用法:/install [--global] [--here] [--force] [--dry-run] [--as plugin|skill|mcp] <source>
@@ -72,5 +72,5 @@ A crash report has been recorded.`,stepNameProvider:`Provider`,stepNameLogin:`Lo
72
72
  这是你创建或信任的项目吗(你自己的代码、知名开源项目、或团队的工作)?
73
73
  otto 将在此读取、编辑、执行文件。不确定就先查看此目录,或以只读方式打开。`,optTrust:`信任 — 完整访问(读 / 改 / 执行 + 应用其配置)`,optReadonly:`只读这一会话 — 安全查看,禁写 / 执行 / 联网`,optExit:`否,退出`},parent:{title:`检测到父级 workspace`,body:`当前目录 {{currentRoot}} 没有 workspace 身份,
74
74
  但上级目录 {{parentRoot}} 已有 workspace。`,optUseParent:`使用上级 workspace — 共享会话与记忆`,optCreateNew:`在当前目录创建新 workspace — 独立身份`,optExit:`退出`},notif:{title:`通知`,readDivider:`──── 已读 ────`},confirm:{reset:`确认重置`,replace:`确认替换`,abortConfirmTitle:`中止 Agent?`,abortConfirmMessage:`Agent 正在运行中。中止后当前回合将丢失,未完成的写入操作可能不完整。`,exitConfirmTitle:`终止并退出 otto?`,exitConfirmMessage:`Agent 正在运行中。退出将中止当前回合,未完成的写入操作可能不完整。`,exitRestartConfirmTitle:`终止并重启 otto?`},cache:{sessionLabel:`会话`,lastTurnLabel:`最近一轮`},recovery:{titleProvider:`尚未安装 AI provider`,hintProvider:`otto 需要一个 provider 才能连接模型。`,ctaProvider:`运行 /setup 安装`,titleAuth:`已安装 provider,尚未连接`,hintAuth:`登录或粘贴 API key 即可继续。`,ctaAuth:`运行 /setup 连接`,titleModel:`尚无可用模型`,hintModel:`凭据可能缺失或已过期。`,ctaModel:`运行 /setup 选择模型`},setup:{wizardApiKeyPlaceholder:`输入或粘贴密钥,按 Enter 确认`,title:`设置向导`,welcomeTitle:`欢迎使用 otto,你的 AI 伙伴`,welcomeGreeting:``,welcomeDescription:`本向导将通过 4 个步骤帮你完成初始设置:选择 AI 服务商、登录、选择模型,然后开始对话。`,welcomeDontShowAgain:`不再显示此向导`,welcomeStart:`开始`,welcomeCancel:`取消`,step1Subtitle:`otto 需要至少一个 AI provider 才能工作。选择一个安装——稍后可以通过 /extension 添加更多。`,step3Subtitle:`选择 provider 的认证方式。`,step4Subtitle:`选择一个模型开始对话。`,step5Done:`一切就绪!输入消息即可开始。`,installing:`安装中…`,installed:`已安装!`,installFailed:`安装失败:{{reason}}`,loginOAuth:`通过 OAuth 登录(推荐)`,loginApiKey:`粘贴 API key`,loggingIn:`登录中…`,loginFailed:`登录失败:{{reason}}`,exitTitle:`退出向导`,exitConfirm:`退出设置向导?进度将被保存 — 稍后可用 /setup 继续。`,errorTitle:`设置出错`,errorMessage:`设置步骤 {{step}} 失败:{{msg}}
75
- 已记录崩溃报告。`,stepNameProvider:`LLM 服务商`,stepNameLogin:`登录`,stepNameModel:`模型`,stepNameStart:`开始`,actionInstall:`安装`,actionLogin:`登录`,installPendingCapabilities:`已安装,但部分能力尚未授权——请运行 /extension 授予,否则该 provider 不会提供任何模型。`,modelRecommendedTag:`推荐`,modelRecommendedHint:`已把推荐项排在最前——随时可用 /model 更换。`,modelUnusableUnauthenticated:`需要先登录`,modelUnusableOauthRisk:`订阅方案可能被限流`,authFailedNetwork:`无法连接授权服务,可能是网络或代理问题。`,authFailedRejected:`授权未完成。`,actionOpenProxySettings:`打开代理设置`,actionRetryAuth:`重新登录`,oauthWaiting:`等待浏览器中完成授权…`,actionOpenAgain:`重新打开授权页`,actionUseApiKeyInstead:`改用 API key`,apiKeyStorageNote:`保存在本机凭据文件中——不会写入当前项目,也不会进入聊天记录。`,installFailedRecovery:`{{provider}} 安装失败。选择下一步:`,actionRetryInstall:`重试安装`,actionChooseAnotherProvider:`换一个 provider`,capabilityGranted:`已授予能力:{{caps}}`,capabilityRevokeHint:`可随时在 /extension 中撤销。`},install:{title:`正在安装 {{source}}`,phaseResolving:`解析来源…`,phaseDetecting:`检测内容…`,phaseInstalling:`安装中…`,phaseRefreshing:`刷新能力…`,reloadingDetail:`正在刷新能力…`,done:`已安装`,summaryFailed:`安装失败`,summaryPartial:`部分安装成功`,nextStepForce:`提示:加 --force 可覆盖已存在的内容`,nextStepReload:`提示:执行 /reload 手动刷新能力`,failureOverflow:`(完整列表见下方消息)`,partialCounts:`{{ok}} 个成功,{{fail}} 个失败:`},proxy:{title:`Proxy`,groupConfig:`配置`,groupAbout:`说明`,fieldUrl:`代理地址`,fieldEnabled:`启用状态`,dialogSetUrl:`设置代理地址`,dialogEditUrl:`编辑代理地址`,urlPlaceholder:`http://127.0.0.1:7890`,urlEmpty:`尚未设置 — 例如 http://127.0.0.1:7890`,stateEnabled:`已启用`,stateDisabled:`已停用`,actionClear:`清除配置`,clearTitle:`清除代理配置`,clearMessage:`确认清除代理配置?({{url}})`,clearConfirm:`清除`,aboutScope:`作用于所有出站 HTTP:模型 API、登录、网页抓取、版本检查。`,aboutLoopback:`本机地址(localhost / 127.0.0.1)始终直连。`,aboutStorage:`配置存储在 {{path}}`,aboutCommand:`命令行等效:/proxy [<url>|on|off|status|clear]`,actionTest:`测试连接`,actionAdoptEnv:`采用系统代理 {{value}}(来自 {{source}})`,probeProbing:`测试中…`,probeOk:`代理可达 — {{latency}}ms({{target}})`,probeFailedProxy:`代理不可达 — {{reason}}`,probeFailedTarget:`代理正常,但目标不可达 — {{reason}}`,probeNoModel:`请先配置模型,再测试连接`,effectiveMismatch:`当前生效:{{effective}} — 需重启会话使变更生效`,effectiveNotApplied:`尚未生效 — 需重启会话使变更生效`,envDetectedToast:`检测到 {{source}}={{value}} — 运行 /proxy 可一键采用`},crashGap:{toastTitle:`检测到上次异常退出丢失了部分对话`,toastBody:`上次进程异常终止(如内存耗尽或被强制结束)时,约 {{lostTurns}} 个回合的消息未能保存,已无法恢复。较早的对话已完整保留。`},signalBar:{tabHint:`Tab 切换`,clipboard:`剪贴板`,clipboardFailed:`复制受限 — 按住 {{modifier}} 拖拽用终端原生复制`},clipboard:{paneTitle:`剪贴板`,viewerTitle:`剪贴板内容`,charsLabel:`{{count}} 个字符`,empty:`暂无复制内容`,openHint:`查看`},mouse:{toggleTitle:`鼠标`,enabledBody:`已开启 — 拖拽即选择并复制;按住 {{modifier}} 可用终端原生选择;滚轮可滚动`,disabledBody:`已关闭 — 恢复终端原生选择,滚轮失效(可用 Alt+↑/↓ 回看)`}}}};function r(r){return e.isInitialized?e.changeLanguage(r):e.use(t).init({lng:r,fallbackLng:`en`,resources:n,defaultNS:`translation`,interpolation:{escapeValue:!1},returnNull:!1,returnEmptyString:!1}),e}r(`en`);const i=e.t.bind(e);function a(){let e=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||``;return/zh/i.test(e)?`zh`:`en`}export{i,e as n,r,a as t};
76
- //# sourceMappingURL=i18n-Dju4J1Q-.js.map
75
+ 已记录崩溃报告。`,stepNameProvider:`LLM 服务商`,stepNameLogin:`登录`,stepNameModel:`模型`,stepNameStart:`开始`,actionInstall:`安装`,actionLogin:`登录`,installingProvider:`正在安装 {{provider}}…`,installedProvider:`已安装 {{provider}}`,installPendingCapabilities:`已安装,但部分能力尚未授权——请运行 /extension 授予,否则该 provider 不会提供任何模型。`,modelRecommendedTag:`推荐`,modelRecommendedHint:`已把推荐项排在最前——随时可用 /model 更换。`,modelUnusableUnauthenticated:`需要先登录`,modelUnusableOauthRisk:`订阅方案可能被限流`,authFailedNetwork:`无法连接授权服务,可能是网络或代理问题。`,authFailedRejected:`授权未完成。`,actionOpenProxySettings:`打开代理设置`,actionRetryAuth:`重新登录`,oauthWaiting:`等待浏览器中完成授权…`,actionOpenAgain:`重新打开授权页`,actionUseApiKeyInstead:`改用 API key`,apiKeyStorageNote:`保存在本机凭据文件中——不会写入当前项目,也不会进入聊天记录。`,installFailedRecovery:`{{provider}} 安装失败。选择下一步:`,actionRetryInstall:`重试安装`,actionChooseAnotherProvider:`换一个 provider`,capabilityGranted:`已授予能力:{{caps}}`,capabilityRevokeHint:`可随时在 /extension 中撤销。`},install:{title:`正在安装 {{source}}`,phaseResolving:`解析来源…`,phaseDetecting:`检测内容…`,phaseInstalling:`安装中…`,phaseRefreshing:`刷新能力…`,reloadingDetail:`正在刷新能力…`,done:`已安装`,summaryFailed:`安装失败`,summaryPartial:`部分安装成功`,nextStepForce:`提示:加 --force 可覆盖已存在的内容`,nextStepReload:`提示:执行 /reload 手动刷新能力`,failureOverflow:`(完整列表见下方消息)`,partialCounts:`{{ok}} 个成功,{{fail}} 个失败:`},proxy:{title:`Proxy`,groupConfig:`配置`,groupAbout:`说明`,fieldUrl:`代理地址`,fieldEnabled:`启用状态`,dialogSetUrl:`设置代理地址`,dialogEditUrl:`编辑代理地址`,urlPlaceholder:`http://127.0.0.1:7890`,urlEmpty:`尚未设置 — 例如 http://127.0.0.1:7890`,stateEnabled:`已启用`,stateDisabled:`已停用`,actionClear:`清除配置`,clearTitle:`清除代理配置`,clearMessage:`确认清除代理配置?({{url}})`,clearConfirm:`清除`,aboutScope:`作用于所有出站 HTTP:模型 API、登录、网页抓取、版本检查。`,aboutLoopback:`本机地址(localhost / 127.0.0.1)始终直连。`,aboutStorage:`配置存储在 {{path}}`,aboutCommand:`命令行等效:/proxy [<url>|on|off|status|clear]`,actionTest:`测试连接`,actionAdoptEnv:`采用系统代理 {{value}}(来自 {{source}})`,probeProbing:`测试中…`,probeOk:`代理可达 — {{latency}}ms({{target}})`,probeFailedProxy:`代理不可达 — {{reason}}`,probeFailedTarget:`代理正常,但目标不可达 — {{reason}}`,probeNoModel:`请先配置模型,再测试连接`,effectiveMismatch:`当前生效:{{effective}} — 需重启会话使变更生效`,effectiveNotApplied:`尚未生效 — 需重启会话使变更生效`,envDetectedToast:`检测到 {{source}}={{value}} — 运行 /proxy 可一键采用`},crashGap:{toastTitle:`检测到上次异常退出丢失了部分对话`,toastBody:`上次进程异常终止(如内存耗尽或被强制结束)时,约 {{lostTurns}} 个回合的消息未能保存,已无法恢复。较早的对话已完整保留。`},signalBar:{tabHint:`Tab 切换`,clipboard:`剪贴板`,clipboardFailed:`复制受限 — 按住 {{modifier}} 拖拽用终端原生复制`},clipboard:{paneTitle:`剪贴板`,viewerTitle:`剪贴板内容`,charsLabel:`{{count}} 个字符`,empty:`暂无复制内容`,openHint:`查看`},mouse:{toggleTitle:`鼠标`,enabledBody:`已开启 — 拖拽即选择并复制;按住 {{modifier}} 可用终端原生选择;滚轮可滚动`,disabledBody:`已关闭 — 恢复终端原生选择,滚轮失效(可用 Alt+↑/↓ 回看)`}}}};function r(r){return e.isInitialized?e.changeLanguage(r):e.use(t).init({lng:r,fallbackLng:`en`,resources:n,defaultNS:`translation`,interpolation:{escapeValue:!1},returnNull:!1,returnEmptyString:!1}),e}r(`en`);const i=e.t.bind(e);function a(){let e=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||``;return/zh/i.test(e)?`zh`:`en`}export{i,e as n,r,a as t};
76
+ //# sourceMappingURL=i18n-BREWHEWk.js.map