export const en = {
  common: {
    ok: 'OK',
    cancel: 'Cancel',
    close: 'Close',
    save: 'Save',
    saving: 'Saving...',
    enabled: 'ENABLED',
    disabled: 'DISABLED',
    add: 'Add',
    remove: 'Remove',
    on: 'ON',
    off: 'OFF',
    loading: 'Loading...',
    error: 'Error',
    retry: 'Retry',
    refresh: 'Refresh',
    go: 'Go',
    edit: 'Edit',
    copy: 'Copy',
    copied: 'Copied',
    unsaved: 'Unsaved',
  },
  app: {
    title: 'Suzent',
    initializing: 'INITIALIZING',
    connectingToCore: 'Connecting to Neural Core...',
    backendErrorTitle: 'CONNECTION FAILED',
    desktopRequiredTitle: 'Desktop required',
    desktopRequiredDesc: 'Suzent is a desktop-only application. Please run this application using the native desktop launcher.',
    logoAriaLabel: 'Suzent logo',
  },
  bootstrap: {
    title: 'Set up Suzent',
    windowTitle: 'Suzent Setup',
    start: 'Install',
    running: 'Installing...',
    changeDir: 'Change',
    chooseInstallDir: 'Choose Suzent install folder',
    installerMissing: 'Suzent is not installed yet. Download and run the Suzent Installer, then reopen the app.',
    stageFailed: '{stage} failed',
    state: {
      pending: 'Pending',
      running: 'Running',
      succeeded: 'Done',
      skipped: 'Skipped',
      failed: 'Failed',
    },
    stages: {
      git: 'Installing Git',
      uv: 'Installing uv',
      python: 'Verifying Python',
      repository: 'Cloning workspace',
      env: 'Writing environment',
      dependencies: 'Installing dependencies',
      ui: 'Downloading desktop app',
      playwright: 'Installing Chromium',
      shortcuts: 'Creating shortcuts',
      shim: 'Writing launcher',
    },
  },
  nav: {
    chat: 'Chat',
    memory: 'Memory',
    skills: 'Skills',
  },
  views: {
    memorySystem: 'MEMORY SYSTEM',
    skillsLibrary: 'SKILLS LIBRARY',
    robotGallery: 'ROBOT GALLERY',
  },
  sidebar: {
    open: 'Open Sidebar',
    close: 'Close Sidebar',
    tabs: {
      chats: 'Chats',
      config: 'Config',
      files: 'Files',
      browser: 'Web',
      canvas: 'Canvas',
      agents: 'Agents',
      plan: 'Goal',
      project: 'Board',
    },
    settings: 'Settings',
    settingsDesc: '',
  },
  subAgents: {
    model: 'Model',
  },
  titlebar: {
    minimize: 'Minimize',
    maximize: 'Maximize',
    restore: 'Restore',
    close: 'Close',
  },
  updates: {
    available: 'Update available',
    availableTitle: 'Update available: {version}',
    updateNow: 'Update',
    starting: 'Updating...',
    latestVersion: 'latest version',
    confirmRestart: 'Suzent will close, update to {version}, and restart automatically. Continue?',
    startFailed: 'Failed to start update: {error}',
  },
  config: {
    loading: 'Loading config...',
    agentLabel: 'Agent',
    agent: {
      code: '📝 Writes and executes Python code',
      toolcalling: '🔧 Direct tool calling without code',
    },
    toolsLabel: 'Tools',
    toolsEmpty: 'No tools available',
    memory: {
      label: 'Memory System',
      button: 'Memory Tools',
      enabledDesc: '✓ Agent can search and update memory',
      disabledDesc: 'Memory tools are disabled',
    },
    sandbox: {
      label: 'Sandbox System',
      button: 'Sandbox Execution',
      enabledDesc: '✓ Agent can run code in isolated sandbox',
      disabledDesc: 'Sandbox execution is disabled',
    },
    mcp: {
      label: 'MCP Servers',
      name: 'Name',
      url: 'URL',
      stdio: 'Stdio',
      enableServer: 'Enable server',
      noneConfigured: 'No MCP servers configured.',
      manageInSettings: 'Manage in Settings',
      noneConfiguredManageInSettings: 'No MCP servers configured. Add servers in Settings.',
      enabledUrls: 'ENABLED: {count} URL(S)',
      envPrefix: 'env:{json}',
      urlPlaceholder: 'https://host/path',
      commandPlaceholder: 'command',
      argsPlaceholder: 'args',
      envPlaceholder: 'env',
    },
  },
  settings: {
    title: 'Settings',
    language: 'Language',
    usingSuzent: 'Using Suzent',
    memoryConfig: {
      title: 'Memory Configuration',
      subtitle: 'Manage background consolidation and the notebook vault',
      systemConfigTitle: 'System Configuration',
      systemConfigDesc: 'Configure the notebook mount path for your workspace.',
      globalMemory: 'Global Memory',
      modelsLabel: 'Models',
      editInModelRoles: 'Model Roles',
      embeddingModelLabel: 'Embedding model',
      extractionModelLabel: 'Extraction model',
      modelNotConfigured: 'Not configured',
      dreamTitle: 'Dreaming agent',
      dreamDesc: 'Background memory consolidation that folds daily logs into the notebook vault.',
      consolidatedThrough: 'Consolidated through',
      pendingLogs: 'Pending logs',
      pendingFacts: 'Pending facts',
      backlogProgress: 'Backlog progress',
      progressCount: '{current}/{total} logs',
      complete: 'complete',
      lastRun: 'Last run',
      lastResult: 'Last result',
      nextBatch: 'Next batch',
      runNow: 'Run now',
      runIngest: 'Run ingest',
      runLint: 'Run lint',
      runningNow: 'Running...',
      never: 'Never',
      noRunsYet: 'No runs yet',
      lastResultSkipped: 'Skipped after repeated no-op attempts',
      lastResultAdvanced: 'Advanced through {watermark}',
      lastResultNotAdvanced: 'No durable page changes',
      lastResultRan: 'Run completed',
      ingestPhase: 'Ingest',
      lintPhase: 'Lint',
      lintTitle: 'Weekly lint',
      lintEvery: 'Cadence',
      lintLastRun: 'Last lint',
      lintDue: 'Due now',
      lintScheduled: 'Up to date',
      lintNever: 'Not yet run',
      lintEveryDays: 'every {days}d',
      statusBarIdle: 'Memory idle',
      statusBarNeedsReview: 'Memory needs review',
      statusBarPending: 'Memory {count} pending',
      statusBarWatermark: 'Consolidated through {watermark}',
      dreamStatus: {
        loading: 'Loading',
        error: 'Needs review',
        inactive: 'Inactive',
        disabled: 'Disabled',
        preparing: 'Preparing...',
        running: 'Dreaming...',
        finalizing: 'Finalizing...',
        pending: 'Pending',
        idle: 'Idle',
      },
    },
    providers: {
      title: 'Model Providers',
      subtitle: 'Connect provider API keys and manage available models',
      apiKeysTab: 'API keys',
      modelsTab: 'Models',
      addModelIdPlaceholder: 'Add model ID...',
      fetch: 'Fetch',
      fetching: 'Fetching...',
      noModelsFound: 'No models found',
      fetchModels: 'Fetch models',
      modelsAvailable: '{count} available',
      noCredentials: 'No credential fields — configure via environment variables.',
      changeKey: 'Change',
      showKey: 'Show',
      hideKey: 'Hide',
      addProvider: '+ Add Provider',
      deleteProvider: 'Remove provider',
      sync: 'Sync Capabilities',
      syncing: 'Syncing...',
      syncTooltip: 'Pull pricing, context windows, and capability flags from LiteLLM',
      syncDone: 'Synced {providers} providers, {models} models',
      syncFailed: 'Sync failed',
      chatgpt: {
        title: 'ChatGPT Subscription',
        subtitle: 'Sign in with your ChatGPT account',
        loadingStatus: 'Checking login status...',
        signIn: 'Sign In',
        disconnect: 'Disconnect',
        awaitingAuth: 'Visit the URL below and enter the code to sign in:',
        waiting: 'Waiting for authorization...',
        status: {
          connected: 'Connected',
          not_logged_in: 'Not Signed In',
          token_expired: 'Expired',
        },
      },
      addForm: {
        title: 'Add Custom Provider',
        id: 'Provider ID',
        label: 'Display Name',
        apiType: 'API Type',
        baseUrl: 'Base URL (optional)',
        apiKeySection: 'API Key Field (optional)',
        envVar: 'Env Variable',
        fieldLabel: 'Field Label',
        placeholder: 'Placeholder',
        requiredFields: 'Provider ID and Display Name are required.',
        save: 'Add Provider',
      },
    },
    mcp: {
      title: 'MCP Servers',
      subtitle: 'Connect external tools and resources via MCP',
      addNewServerTitle: 'Add new server',
      addNewServerDesc: 'Add a new MCP server to connect external tools and resources.',
      nameOptionalPlaceholder: 'Name (optional)',
      headersPlaceholder: 'Headers (Header-Name=value, X-Api-Key=abc123)',
      commandPlaceholder: 'Command (e.g., uv, npx, python)',
      argsPlaceholder: 'Arguments (comma-separated: run, mcp-server, --option)',
      envPlaceholder: 'Environment vars (KEY=value, KEY2=value2)',
      adding: 'Adding...',
      addServer: 'Add Server',
      configuredServersTitle: 'Configured Servers',
      configuredServersDesc: 'Manage your MCP servers. You can enable/disable servers for the current session.',
      noServersConfigured: 'No servers configured yet.',
      test: 'Test',
      testing: 'Testing...',
      reachable: 'Reachable',
      unreachable: 'Unreachable',
      editServerTitle: 'Edit Server',
      saveServer: 'Save Changes',
      saving: 'Saving...',
      transportLabel: 'Transport',
      toggle: 'Toggle',
      commandLabel: 'Command',
      stdinMode: 'stdin mode',
    },
    categories: {
      providers: 'Providers',
      roles: 'Model Roles',
      memory: 'Memory System',
      security: 'Security',
      social: 'Social Channels',
      mcp: 'MCP Servers',
      automation: 'Automation',
      data: 'Data',
      usage: 'Usage',
      appearance: 'Appearance',
    },
    security: {
      title: 'Security',
      subtitle: 'Sandbox and execution isolation settings',
    },
    data: {
      title: 'Data',
      subtitle: 'Sync portable config, skills, and memory across devices',
      githubTitle: 'GitHub Sync',
      githubDesc: 'Share portable config, skills, and markdown memory through a local Git repo with a GitHub remote. Chats, runtime data, indexes, and plaintext secrets stay local.',
      githubQuickStartTitle: 'Quick start',
      githubQuickStartDesc: 'Create a private GitHub repo (default suzent-brain) and connect. Sign in with GitHub once — no CLI or personal access token needed.',
      githubQuickStartDefaultPath: 'Default folder: {path}',
      githubQuickStartRepoPlaceholder: 'Optional: your-username/suzent-brain or GitHub clone URL',
      githubQuickStartButton: 'Quick start',
      githubQuickStartRunning: 'Setting up GitHub sync...',
      githubQuickStartDone: 'Connected to {repo}. {summary}',
      githubRepoNameLabel: 'GitHub repository name',
      githubRepoNameHint: 'Creates or links username/{name} on GitHub (private). You can rename it before starting.',
      githubSignInButton: 'Sign in with GitHub',
      githubSignInDesc: 'Authorize Suzent to access your GitHub repositories.',
      githubSignInCode: 'Open {url} and enter this code:',
      githubSignInWaiting: 'Waiting for authorization…',
      githubSignInExpired: 'Authorization code expired. Click Sign in to try again.',
      githubSignInDenied: 'Authorization was denied.',
      githubSignInDone: 'Signed in as {username}',
      githubSignOut: 'Sign out',
      githubAdvanced: 'Advanced options',
      githubConnected: 'Connected',
      githubSignedIn: 'GitHub signed in',
      githubRepoPlaceholder: 'Local Git repo folder (advanced)',
      githubBranch: 'Branch',
      githubRemote: 'Remote',
      githubAutoSync: 'Auto-sync',
      githubAutoResolve: 'Agent conflict resolve',
      githubInterval: 'Hours',
      githubSecretSync: 'Sync encrypted API keys',
      githubSecretWarning: 'Disabled by default. GitHub only receives ciphertext; recovery depends on trusted devices or local recovery material.',
      shibbolethTitle: 'Encrypt API keys',
      shibbolethDesc: 'Encrypt API keys before they reach GitHub. Use the same passphrase on every device that should decrypt them.',
      shibbolethLabel: 'Passphrase',
      shibbolethPlaceholder: 'At least 12 characters',
      shibbolethConfirm: 'Confirm passphrase',
      shibbolethHint: 'Optional. Only ciphertext is stored in GitHub — never plaintext keys.',
      shibbolethWarning: 'If you forget this passphrase, encrypted API keys cannot be recovered. Suzent never stores it on disk.',
      shibbolethSetup: 'Enable',
      shibbolethEnable: 'Enable',
      shibbolethDisable: 'Disable',
      shibbolethUnlockAction: 'Unlock',
      shibbolethLockAction: 'Lock',
      shibbolethOn: 'On',
      shibbolethOff: 'Off',
      shibbolethUnlockedBadge: 'Unlocked',
      shibbolethLockedBadge: 'Locked',
      shibbolethEnabled: 'Encrypted API key sync enabled. Unlock to push or pull API keys.',
      shibbolethDisabled: 'Encrypted API key sync disabled.',
      shibbolethUnlocked: 'Encryption unlocked for this session.',
      shibbolethLocked: 'Encryption locked.',
      shibbolethTooShort: 'Passphrase must be at least {min} characters.',
      shibbolethMismatch: 'Passphrases do not match.',
      shibbolethHasBundles: 'Encrypted API key bundles found in the sync repo. Unlock to import on pull.',
      shibbolethNoBundles: 'No encrypted bundles yet. Push after unlocking to publish ciphertext.',
      shibbolethRequiredForSync: 'Unlock encrypted API key sync before push or pull.',
      githubSave: 'Save profile',
      githubValidate: 'Validate',
      githubSaveAuto: 'Save auto',
      githubPush: 'Push',
      githubPull: 'Pull',
      githubSaved: 'GitHub sync settings saved.',
      githubValid: 'GitHub repository validated.',
      githubPushed: 'GitHub sync payload pushed.',
      githubPulled: 'GitHub sync payload pulled.',
      githubFailed: 'GitHub sync failed: {error}',
      githubPullConfirm: 'Pull from GitHub sync and replace local portable config, skills, and markdown memory?',
      githubLastRevision: 'Last revision',
      githubNone: 'none',
    },
    roles: {
      title: 'Model Roles',
      subtitle: 'Assign models to logical roles. Each role picks the first available model; list multiple for automatic fallback.',
      primary: 'Primary',
      primaryDesc: 'Main chat agent. Needs tool use and large context.',
      cheap: 'Cheap',
      cheapDesc: 'Auto-title, summaries, lightweight tasks.',
      vision: 'Vision',
      visionDesc: 'Image analysis. Must support multimodal input.',
      embedding: 'Embedding',
      embeddingDesc: 'Vector search and memory retrieval.',
      imageGeneration: 'Image Generation',
      imageGenerationDesc: 'Text-to-image generation.',
      tts: 'TTS',
      ttsDesc: 'Text-to-speech synthesis.',
      modelsPlaceholder: 'model/name (one per line)',
      notConfigured: 'Not configured',
      fallbackHint: 'Enter one model ID per line. First line is primary; rest are fallbacks.',
      addFromAvailable: 'Add model...',
      customPlaceholder: 'provider/model-name',
      searchPlaceholder: 'Search or type provider/model-name...',
      noModelsFound: 'No models found',
      addCustom: 'Add "{id}"',
      moveUp: 'Move up (higher priority)',
    },
    sandbox: {
      title: 'Notebook',
      subtitle: 'Pick one folder to use as /mnt/notebook for all chats.',
      mountTarget: 'Container Path',
      hostFolder: 'Host Folder',
      notConfigured: 'Not configured',
      chooseFolder: 'Choose Folder',
      saveHint: 'Changes are applied automatically.',
    },
    appearance: {
      title: 'Appearance',
      subtitle: 'Choose an accent color theme',
      colorScheme: 'Color Scheme',
      schemes: { warm: 'Warm', cold: 'Cold', green: 'Green' },
    },
    usage: {
      title: 'Usage',
      subtitle: 'Track your LLM API spending and token usage',
      totalSpend: 'Total Spend',
      avgDaily: 'Avg. Daily',
      totalCalls: 'API Calls',
      totalTokens: 'Tokens',
      lastNDays: 'Last {count} days',
      perDay: 'per day',
      apiCalls: 'API calls',
      days: '{count}d',
      dailySpend: 'Daily Spend',
      today: 'Today',
      tooltipCalls: '{count} calls',
      tokenBreakdown: 'Token Breakdown',
      inputTokens: 'Input Tokens',
      outputTokens: 'Output Tokens',
      noUsageYet: 'No usage data yet. Start chatting to see your spending here.',
    },
    switchToLight: 'Switch to light mode',
    switchToDark: 'Switch to dark mode',
    saveChanges: 'Save Changes',
    saving: 'Saving...',
    verifyFailed: 'Verification failed or no models found.',
    social: {
      title: 'Social Channels',
      subtitle: 'Configure social platform agents and access control',
      generalSettingsTitle: 'General Settings',
      generalSettingsDesc: 'Configure global settings for social interactions.',
      socialModel: 'Social Model',
      useDefaultModel: 'Use Default System Model',
      selectModelPlaceholder: 'SELECT MODEL...',
      globalAllowedUsers: 'Global Allowed Users (comma separated IDs)',
      allowedUsersPlaceholder: 'user123, 987654...',
      agentCapabilitiesTitle: 'Agent Capabilities',
      agentCapabilitiesDesc: 'Configure which tools the social agent can use.',
      enableMemoryTools: 'Enable Memory Tools',
      tools: 'Tools',
      allTools: 'All Tools',
      custom: 'Custom',
      noToolsAvailable: 'No tools available',
      mcpServers: 'MCP Servers',
      systemDefault: 'System Default',
      enable: 'Enable',
      allowedUsersSpecific: 'Allowed users (this platform)',
      allowedUsersSpecificPlaceholder: 'user_id_1, user_id_2...',
      pairingTitle: 'Pairing & Access Control',
      pairingDesc: 'Require strangers to verify before chatting',
      pairingDisabled: 'Pairing disabled — only users in the allowlist can chat.',
      noPendingRequests: 'No pending requests.',
      approve: 'Approve',
      deny: 'Deny',
    },
    automation: {
      title: 'Automation',
      subtitle: 'Schedule recurring agent jobs and manage the scheduler',
      failedToCreateJob: 'Failed to create job',
      failedToUpdateJob: 'Failed to update job',
      defaultModel: 'Default',
      schedulerStatusTitle: 'Scheduler Status',
      heartbeatToolsTitle: 'Heartbeat Tool Approvals',
      heartbeatToolsDesc: 'Tools that are automatically approved when heartbeat runs. Leave on All Tools to approve everything, or pick Custom to restrict.',
      noToolsSelected: 'No tools selected',
      running: 'Running',
      stopped: 'Stopped',
      activeOfTotal: '{active} active / {total} total jobs',
      heartbeatTitle: 'Heartbeat',
      heartbeatDesc: 'Periodic agent check-in using',
      heartbeatChecklist: 'checklist.',
      heartbeatRunning: 'Running every {minutes}m in a persistent session.',
      heartbeatDisabled: 'Disabled. Enable to start periodic check-ins.',
      heartbeatCreate: 'Create /shared/HEARTBEAT.md to enable.',
      disable: 'Disable',
      runNow: 'Run Now',
      collapse: 'collapse',
      heartbeatMdEdit: 'edit',
      heartbeatIntervalLabel: 'Interval',
      heartbeatMinutesUnit: 'min',
      lastRun: 'Last run:',
      result: 'Result:',
      resultOk: 'OK (nothing needed attention)',
      errorLabel: 'Error:',
      addNewJobTitle: 'Add New Job',
      addNewJobDesc: 'Schedule a prompt to run automatically on a repeating schedule.',
      jobNamePlaceholder: 'Job name',
      cronExprPlaceholder: 'Cron expr (e.g. */5 * * * *)',
      repeat: 'Repeat',
      freqMinutes: 'Every few minutes',
      freqHourly: 'Hourly',
      freqDaily: 'Daily',
      freqWeekly: 'Weekly',
      freqMonthly: 'Monthly',
      freqAdvanced: 'Advanced (cron)',
      intervalLabel: 'Minutes',
      atMinuteLabel: 'At minute',
      atTimeLabel: 'At time',
      onDaysLabel: 'On days',
      onDayOfMonthLabel: 'Day of month',
      weekdaysShort: 'Weekdays',
      everyDayShort: 'Every day',
      weekdays: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',
      advancedHint: 'Five fields: minute hour day-of-month month day-of-week. Leave a field as * for "any".',
      summaryMinutes: 'Runs every {n} minutes',
      summaryHourly: 'Runs hourly at :{m}',
      summaryDaily: 'Runs daily at {time}',
      summaryWeekly: 'Runs every {day} at {time}',
      summaryMonthly: 'Runs on day {day} of each month at {time}',
      promptPlaceholder: 'Prompt to execute on schedule...',
      announce: 'Announce',
      silent: 'Silent',
      delivery: 'Delivery',
      model: 'Model',
      active: 'Active',
      creating: 'Creating...',
      addJob: 'Add Job',
      scheduledJobsTitle: 'Scheduled Jobs',
      scheduledJobsDesc: 'Manage your automated tasks. Toggle, trigger, edit, or remove jobs.',
      noCronJobs: 'No cron jobs configured yet.',
      cronExpression: 'Cron expression',
      run: 'Run',
      nextRun: 'Next run:',
      hideHistory: 'Hide History',
      showHistory: 'Show History',
      noRunHistory: 'No run history yet.',
    },
  },
  memoryView: {
    initializing: 'Initializing memory system...',
    systemError: 'System error',
    retryConnection: 'Retry connection',
    coreMemoryTitle: 'Core memory files',
    coreMemoryDesc: 'Always-visible markdown files: persona.md, user.md, MEMORY.md',
    archivalTitle: 'Archival database',
    archivalDesc: 'Read-only search index',
    indexingArchives: 'Indexing archives',
    waiting: 'Waiting',
    tabs: {
      overview: 'Overview',
      dreaming: 'Dreaming',
      dailyLogs: 'Daily Logs',
      memoryFile: 'MEMORY.md',
      transcripts: 'Transcripts',
    },
  },
  browser: {
    title: 'Browser',
    navigate: 'Navigate',
    execute: 'Execute',
    executeHint: 'Execute a browser command to start...',
    streamAlt: 'Browser stream',
    status: {
      connected: 'connected',
      connecting: 'connecting',
      disconnected: 'disconnected',
    },
    takeControl: 'Take Control',
    liveControlActive: 'Live Control Active',
  },
  dailyLogs: {
    title: 'Daily logs',
    entries: '{count} entries',
    loading: 'Loading daily logs...',
    loadLogFailed: 'Failed to load log',
    loadDatesFailed: 'Failed to load daily logs',
    emptyTitle: 'No daily logs yet',
    emptyDesc: 'Daily memory logs will appear here as the agent extracts facts from conversations.',
    today: 'Today',
    yesterday: 'Yesterday',
    daysAgo: '{count} days ago',
  },
  memoryFile: {
    fileName: 'MEMORY.md',
    loadFailed: 'Failed to load MEMORY.md',
    loading: 'Loading MEMORY.md...',
    headerWithSize: '{size} • CURATED_LONG_TERM',
    notCreatedYet: 'NOT_CREATED_YET',
    reindex: 'Reindex',
    reindexing: 'Reindexing...',
    reindexSuccess: 'Reindex completed successfully',
    reindexFailed: 'Reindex failed',
    emptyTitle: 'No MEMORY.md yet',
    emptyDesc: 'The curated long-term memory file will be created automatically as the agent processes conversations and extracts key facts.',
  },
  transcripts: {
    title: 'Session transcripts',
    desc: 'JSONL conversation log',
    sessionLabel: 'Session',
    selectPlaceholder: 'Select a session...',
    lastNLabel: 'Last N entries',
    all: 'All',
    entriesCount: '{count} entries',
    lastN: 'last {n}',
    loading: 'Loading transcript...',
    loadFailed: 'Failed to load transcript',
    selectTitle: 'Select a session',
    selectDesc: 'Choose a session from the dropdown above to view its conversation transcript.',
    emptyTitle: 'No transcript data',
    emptyDesc: 'This session does not have a transcript yet. Transcripts are created when JSONL transcript logging is enabled.',
    actionsCount: '{count} actions',
  },
  chat: {
    newChat: 'New chat',
    send: 'Send',
    placeholder: 'Type a message...',
  },
  chatList: {
    searchChatsPlaceholder: 'Search chats...',
    clearSearch: 'Clear search',
    newChat: 'New chat',
    newProject: 'New project',
    newProjectPlaceholder: 'Project name...',
    moveToProject: 'Move to project',
    currentLabel: 'Current',
    filter: {
      in: 'In',
      all: 'All projects',
      recentAll: 'Recent across all projects',
      recentIn: 'Recent in {name}',
    },
    kind: {
      you: 'You',
      subagents: 'Subagents',
      scheduled: 'Scheduled',
      all: 'All',
    },
    labels: {
      heartbeat: 'Heartbeat',
      subagentOf: 'Under {name}',
      subagentsCount: '{count} subagents',
    },
    menu: {
      title: 'Actions',
      rename: 'Rename',
      moveToProject: 'Move to project',
      delete: 'Delete',
      deleteFailed: 'Could not delete project',
      deleteConfirmTitle: 'Delete {name}?',
      deleteConfirmEmpty: 'This project has no chats. This cannot be undone.',
      deleteConfirmWithChats: 'This project has {count} chat(s). They will be moved to {target}, then the project will be deleted.',
    },
    empty: {
      noResultsTitle: 'No results found',
      noResultsDesc: 'Try a different search term',
      noChatsTitle: 'No chats yet',
      noChatsDesc: 'Start a new conversation to get started',
    },
    delete: {
      confirmTitle: 'Delete this chat?',
      confirm: 'Delete',
      deleting: 'Deleting...',
      buttonTitle: 'Delete chat',
      confirmMessage: 'This will permanently delete the chat and its messages.',
      cascadeMessage: 'This chat has sub-agents. Do you want to delete them too?',
      cascadeYes: 'Delete with sub-agents',
      cascadeNo: 'Delete chat only',
    },
    rename: {
      buttonTitle: 'Rename chat',
      placeholder: 'Chat name...',
      confirm: 'OK',
      cancel: 'Cancel',
    },
    untitled: 'Untitled chat',
    messagesCount: '{count} MSG',
    loadMore: 'Load more ({count} remaining)',
    loadingMore: 'Loading...',
  },
  chatInput: {
    removeFile: 'Remove file',
    placeholderReady: 'How can I help you today?',
    placeholderLoading: 'System loading...',
    attachFiles: 'Attach files (images, PDFs, documents, etc.)',
    modelPlaceholder: 'Model',
    stopGenerating: 'Stop generating',
    sendMessage: 'Send message',
    redirectAgent: 'Redirect the agent',
    placeholderRedirect: 'Type to redirect the agent...',
    fileMentions: 'Files',
    fileMentionTypeToSearch: 'Type to search mounted files',
    fileMentionSearching: 'Searching files...',
    fileMentionNoResults: 'No matching files',
    stop: 'Stop',
    send: 'Send',
    redirect: 'Redirect',
  },
  chatWindow: {
    dragDropTitle: 'Drop files here',
    dragDropDesc: 'Images, PDFs, documents, etc.',
    scrollToBottom: 'Scroll to bottom',
    connecting: 'Connecting to Neural Core...',
    outputValidationRetryError: 'The model response format failed validation too many times. Please retry this message.',
    genericError: 'Something went wrong. Please try again.',
    heartbeatOff: 'Heartbeat off',
    permissionModeTitle: 'Tool permission mode',
    permissionModeLabel: 'Mode',
    autoModeConfirmation: 'Auto mode uses a security classifier to approve low-risk actions without asking. Hard denies still apply. Enable Auto mode?',
    autoModeDialogTitle: 'Enable Auto mode?',
    autoModeCancel: 'Cancel',
    autoModeEnable: 'Enable',
    permissionModes: {
      default: 'Ask',
      accept_edits: 'Edit',
      plan: 'Plan',
      auto: 'Auto',
      strict_readonly: 'Read only',
    },
    permissionModeInputLabels: {
      default: 'Ask permissions',
      accept_edits: 'Edit automatically',
      plan: 'Plan mode',
      auto: 'Auto mode',
      strict_readonly: 'Read only',
    },
    permissionModeDescriptions: {
      default: 'Ask before state-changing tool actions.',
      accept_edits: 'Allow verified workspace edits and ask for other risky actions.',
      plan: 'Read-only exploration, except for the project plan.md file.',
      auto: 'Classify unresolved actions automatically; hard safety rules still apply.',
      strict_readonly: 'Deny all non-read-only deferred actions.',
    },
    heartbeatRunning: 'Heartbeat running',
    heartbeatHealthy: 'Heartbeat healthy',
    heartbeatEnabled: 'Heartbeat enabled',
    heartbeatLastRun: 'Last heartbeat {time}',
    heartbeatLabel: 'Heartbeat',
    heartbeatConfigure: 'Configure heartbeat',
    heartbeatInterval: 'Run every',
    heartbeatMinutes: '{minutes}m',
    heartbeatHours: '{hours}h',
    heartbeatMinutesUnit: 'minutes',
    heartbeatInstructions: 'Instructions',
    heartbeatInstructionsPlaceholder: 'What should the agent do on each heartbeat?',
    hideToolCalls: 'Collapse Tools',
    showToolCalls: 'Expand Tools',
  },
  newChat: {
    creatingIn: 'Creating in',
    greetings: {
      nightOwl: 'Night owl?',
      goodMorning: 'Good morning.',
      keepBuilding: 'Keep building.',
      goodEvening: 'Good evening.',
      bedTime: 'Bed time? Or maybe late night coding?',
    },
  },
  chatMessage: {
    viewFile: 'View file (Shift+Click for full screen)',
    downloadFile: 'Download file',
    userLabel: 'User',
  },
  fileViewer: {
    title: 'File Preview',
    revealInExplorer: 'Reveal in Explorer',
    closeEsc: 'Close (Esc)',
    fetchFailed: 'Failed to fetch file content',
    errorPrefix: 'ERROR: ',
  },
  goal: {
    title: 'Active Goal',
    noGoal: 'No active goal.',
    turns: '{elapsed}/{max} turns',
    subgoals: 'Subgoals',
    pause: 'Pause',
    resume: 'Resume',
    clear: 'Clear',
    status: {
      active: 'ACTIVE',
      paused: 'PAUSED',
      completed: 'COMPLETED',
      cancelled: 'CANCELLED',
    },
  },
  task: {
    title: 'Tasks',
    noTasks: 'No tasks.',
    noTasksForChat: 'No tasks assigned to this chat.',
    assignee: '{name}',
    blocks: 'blocks {ids}',
    blockedBy: 'blocked by {ids}',
    status: {
      pending: 'TODO',
      inprogress: 'ACTIVE',
      completed: 'DONE',
      blocked: 'BLOCKED',
      cancelled: 'CANCELLED',
    },
  },
  projectBoard: {
    title: 'Project Board',
    noTasks: 'No tasks in this project.',
    noGoals: 'No active goals.',
    taskCount: 'tasks in project',
    open: 'Open Board',
  },
  archival: {
    title: 'Archival memory',
    filters: 'Filters',
    searchPlaceholder: 'Search memories... (try adding keywords)',
    searching: 'Searching...',
    sortBy: 'Sort by',
    sort: {
      newestFirst: 'Newest first',
      oldestFirst: 'Oldest first',
      highToLow: 'High → Low',
      lowToHigh: 'Low → High',
      mostAccessed: 'Most accessed',
      mostRelevant: 'Most relevant',
    },
    importanceLevel: 'Importance level',
    importance: {
      all: 'All',
      high: 'High',
      medium: 'Medium',
      low: 'Low',
      highRange: 'High (≥0.8)',
      mediumRange: 'Medium (0.5-0.8)',
      lowRange: 'Low (<0.5)',
    },
    clearFilters: 'Clear filters',
    clearAllFilters: 'Clear all filters',
    view: {
      list: 'List',
      cards: 'Cards',
      switchToCards: 'Switch to card view',
      switchToList: 'Switch to compact view',
    },
    showingCount: 'Showing {count} memories',
    filteredBy: 'filtered by {importance} importance',
    errorTitle: 'Error loading memories',
    empty: {
      noMatchesTitle: 'No matches found',
      noMatchesDesc: 'Try different search terms or adjust your filters',
      noMemoriesTitle: 'No memories yet',
      noMemoriesDesc: 'Memories will be saved here automatically as conversations happen',
      noImportanceDesc: 'No "{importance}" importance memories found. Try a different filter.',
    },
    loading: 'Loading memories...',
    loadMore: 'Load more',
  },
  memoryCard: {
    today: 'Today',
    yesterday: 'Yesterday',
    daysAgo: '{count} days ago',
    importance: {
      highShort: 'HIGH',
      medShort: 'MED',
      lowShort: 'LOW',
      tooltip: 'Importance: {value}',
    },
    delete: {
      confirmTitleCompact: 'Delete?',
      confirmYes: 'Yes',
      confirmTitle: 'Delete this memory?',
      confirmDelete: 'Yes, delete it',
      cancel: 'Cancel',
      button: 'Delete',
      buttonTitle: 'Delete memory',
    },
    badges: {
      new: 'NEW',
      hot: 'HOT',
    },
    showMore: 'Show more',
    showLess: 'Show less',
    meta: {
      created: 'CREATED:',
      views: 'VIEWS:',
      match: 'MATCH:',
    },
  },
  status: {
    copiedToClipboard: 'Copied to clipboard',
    codeCopiedToClipboard: 'Code copied to clipboard',
    logCopiedToClipboard: 'Log copied to clipboard',
    copyToClipboard: 'Copy to clipboard',
  },
  codeBlock: {
    copyText: 'Copy text',
    copyCode: 'Copy code',
    collapse: 'Collapse',
    expand: 'Expand',
    code: 'Code',
    lines: '{count} lines',
  },
  logBlock: {
    systemLog: 'System log',
    collapse: 'Collapse',
    expand: 'Expand',
    lines: '{count} lines',
    chars: '{count} chars',
  },
  toolCallBlock: {
    permissionRejectPlaceholder: 'Optional reason or safer direction',
    permissionContractUnavailable: 'This approval is missing its server permission contract. Retry the request.',
    ruleScopeSession: 'this chat',
    ruleScopeGlobal: 'all chats',
    ruleExplanationCommand: '{action} creates a rule for {scope}: `{command}`',
    ruleExplanationTool: '{action} creates a rule for {scope} covering the {tool} tool.',
    ruleExplanationGeneric: '{action} creates a scoped rule for {scope}.',
    permissionActions: {
      allowOnce: 'Allow',
      allowSession: 'Always allow for session',
      allowGlobal: 'Always allow globally',
      allowCommandSession: 'Allow this command for session',
      allowCommandGlobal: 'Always allow this command',
      reject: 'Reject',
    },
    done: 'Done',
    arguments: 'Arguments',
    output: 'Output',
  },
  permissionDock: {
    title: 'May I {action}?',
    useTool: 'use {tool}',
    localProject: 'Project (local)',
    deny: 'Deny',
    allowOnce: 'Allow once',
    allowSession: 'Allow for session',
    allowGlobal: 'Always allow',
    ctrlEnter: 'Ctrl+Enter',
    yes: 'Yes',
    yesAnd: 'Yes, and {action}',
    yesAllowCommandSession: 'Yes, allow {command} for this session',
    yesAllowCommandGlobal: 'Yes, always allow {command}',
    no: 'No',
    feedbackPlaceholder: 'No, and tell Suzent what to do differently',
    submit: 'Submit',
  },
  codeStepBlock: {
    thought: 'Thought',
    code: 'Code',
    executionLogs: 'Execution Logs',
    result: 'Result',
  },
  sandbox: {
    selectChat: 'Select a chat',
    back: 'Back',
    maximize: 'Maximize (full screen)',
    refresh: 'Refresh',
    openInExplorer: 'Open in Explorer',
    uploadFile: 'Upload file',
    workspace: 'Workspace',
    shared: 'Shared',
    mounts: 'Mounts',
    scanning: 'Scanning...',
    up: '.. / Up',
    emptyDirectory: 'Empty directory',
    itemsCount: '{count} items',
    errorPrefix: 'ERROR: ',
    status: {
      syncing: 'SYNCING',
      ready: 'READY',
    },
  },
  deleteOverlay: {
    title: 'Delete?',
    confirm: 'Yes',
    cancel: 'No',
    buttonTitle: 'Delete',
  },
  select: {
    placeholder: 'Select...',
  },
  multiSelect: {
    placeholder: 'Select tools...',
    emptyMessage: 'No options',
  },
  skills: {
    loading: 'Loading skills...',
    errorTitle: 'Error',
    retry: 'Retry',
    title: 'Skills library',
    subtitle: 'Available capabilities index',
    reload: 'Reload from disk',
    enableSkill: 'Enable skill',
    disableSkill: 'Disable skill',
    openSkill: 'Open skill',
    closeSkill: 'Close skill',
    description: 'Description',
    mainBody: 'Main body',
    emptyTitle: 'No skills found',
    emptyDesc: "Add user skills to '~/.suzent/skills' to see them here.",
  },
  memoryStats: {
    totalMemories: 'Total memories',
    memoryUtilization: 'Memory utilization',
    utilizedCount: '{active}/{total} memories used',
    activity7d: '7d activity',
    recentCount: '{recent}/{total} accessed recently',
    coldMemoryRatio: 'Unaccessed ratio',
    coldCount: '{cold}/{total} still unaccessed',
    accessDistribution: 'Access distribution',
    distributionTooltipUnaccessed: 'Unaccessed: {count}',
    distributionTooltipLight: 'Light (1-2): {count}',
    distributionTooltipEngaged: 'Engaged (3+): {count}',
    unaccessedCount: 'Unaccessed: {count}',
    lightCount: 'Light (1-2): {count}',
    engagedCount: 'Engaged (3+): {count}',
  },
  coreMemory: {
    saveFailed: 'Save failed',
    failedToSave: 'Failed to save',
    copiedText: '✓ Copied',
    placeholder: 'Enter {title}...',
    charactersOfMax: '{current} / {max} characters',
    overLimit: 'Over limit!',
    usedPercent: '{percent}% used',
    noContent: 'No content yet — click Edit to add',
    charactersCount: '{count} characters',
    wordsApprox: '{count} words (approx)',
    labels: {
      persona: { title: 'Persona', desc: 'Identity, role, and workflow principles — persona.md' },
      user: { title: 'User', desc: 'Preferences, tech stack, and communication habits — user.md' },
      facts: { title: 'Long-term Memory', desc: 'Condensed knowledge and key decisions — MEMORY.md' },
      context: { title: 'Session Context', desc: 'Current task state and scratchpad — sessions/{id}/context.md' },
    },
  },
  planProgress: {
    noActivePlan: 'No active plan.',
    progress: 'Progress',
    taskProgress: 'Task progress {completed}/{total}',
    current: 'Current: {title}',
    active: 'ACTIVE',
  },
  errorBoundary: {
    systemFailure: 'System Failure',
    unexpected: 'An unexpected error occurred',
    reboot: 'Reboot System',
    details: 'Error details',
  },
  folderContext: {
    activeContexts: 'Active contexts',
    noFoldersMounted: 'No folders mounted',
    remove: 'Remove',
    recentFolders: 'Recent folders',
    noRecentFolders: 'No recent folders',
    chooseDifferent: 'Choose a different folder...',
    context: 'Working Dir',
  },
  fileLink: {
    clickToView: 'Click to view {path} (Shift+Click for full screen)',
  },
  imageViewer: {
    fullScreenAlt: 'Full screen preview',
  },
} as const;
