import type { TranslationDictionary } from '@/types/i18n.types';

export const en: TranslationDictionary = {
  common: {
    save: 'Save',
    cancel: 'Cancel',
    delete: 'Delete',
    edit: 'Edit',
    create: 'Create',
    search: 'Search',
    filter: 'Filter',
    loading: 'Loading...',
    noResults: 'No results found',
    confirm: 'Confirm',
    back: 'Back',
    next: 'Next',
    previous: 'Previous',
    close: 'Close',
    retry: 'Retry',
    error: 'Error',
    success: 'Success',
    warning: 'Warning',
    info: 'Info',
    healthy: 'Healthy',
    degraded: 'Degraded',
    unhealthy: 'Unhealthy',
    up: 'Up',
    down: 'Down',
    responseTime: 'Response Time',
    unknown: 'Unknown',
    operational: 'Operational',
    notAvailable: 'N/A',
    yes: 'Yes',
    no: 'No',
    never: 'Never',
    accessDenied: 'You do not have permission to access this page.',
    brandName: 'Claw',
    brandVersion: 'Claw v{version}',
    select: 'Select',
    download: 'Download',
    noDataAvailable: 'No data available',
    showingPage: 'Showing page {page} of {total}',
  },
  auth: {
    login: 'Login',
    logout: 'Logout',
    email: 'Email',
    password: 'Password',
    loginTitle: 'Sign in to Claw',
    loginSubtitle: 'Enter your credentials to continue',
    loginButton: 'Sign In',
    logoutButton: 'Sign Out',
    sessionExpired: 'Your session has expired. Please login again.',
    invalidCredentials: 'Invalid email or password',
    welcomeTitle: 'Welcome to Claw',
    welcomeSubtitle: 'AI Orchestration Platform',
    passwordPlaceholder: 'Enter your password',
    signingIn: 'Signing in...',
    loginFailed: 'Login failed. Please try again.',
    tagline: 'Claw - Local-first AI Orchestration',
    authenticating: 'Authenticating...',
    emailPlaceholder: 'you@example.com',
  },
  nav: {
    dashboard: 'Dashboard',
    chat: 'Chat',
    compareModels: 'Compare Models',
    consensusMode: 'Consensus Mode',
    escalationChain: 'Escalation Chain',
    repairLab: 'Repair Lab',
    decomposeLab: 'Task Decomposer',
    bestOfNLab: 'Best-of-N Generation',
    verifierLab: 'Verifier',
    pipelineLab: 'Pipeline Lab',
    costEnsemble: 'Cost-Aware Ensemble',
    rolePackLab: 'Role Pack',
    connectors: 'Connectors',
    models: 'Models',
    modelCatalog: 'Model Catalog',
    modelLocalFrontier: 'Frontier Models',
    localModels: 'Local Models',
    routing: 'Routing',
    replayLab: 'Replay Lab',
    recoveryLab: 'Recovery Engine',
    adaptiveInsights: 'Adaptive Insights',
    memory: 'Memory',
    context: 'Context Packs',
    files: 'Files',
    observability: 'Observability',
    audits: 'Audit Logs',
    logs: 'Logs',
    admin: 'Admin',
    settings: 'Settings',
    workspace: 'Workspace',
    workspaceActions: 'Actions',
    workspaceApprovals: 'Approvals',
    workspaceSyncHealth: 'Sync Health',
    agent: 'Agent',
    agentTerminal: 'Terminal',
    agentRepos: 'Repositories',
    agentCapabilities: 'Capabilities',
    agentActivity: 'Activity',
    agentRecipes: 'Recipes',
    agentMarketplace: 'Marketplace',
    agentActivityMemory: 'Activity Memory',
    discovery: 'Model Discovery',
    workspaceProviders: 'Providers',
    workspaceAppConfigs: 'App Configurations',
    workspaceGmail: 'Gmail',
    workspaceJira: 'Jira',
    workspaceSourceControl: 'Source Control',
    workspaceSlack: 'Slack',
    workspaceDocs: 'Docs',
    workspaceConfluence: 'Confluence',
    workspaceFigma: 'Figma',
    workspaceWorkflows: 'Workflows',
    researchProviders: 'Research Providers',
    researchRuns: 'Research Runs',
    research: 'Research',
    workspaceInbox: 'Inbox',
    workspaceSemanticSearch: 'Semantic Search',
    workspaceDigest: 'Digest',
    workspaceAutomationPreferences: 'Automation Preferences',
    workspaceEmailSignatures: 'Email Signatures',
    workspaceEmailTemplates: 'Email Templates',
    workspaceImplHandoffs: 'Coding Handoffs',
    adminAiActionPolicies: 'AI Action Policies',
    adminSuggestionRules: 'Suggestion Rules',
    adminWebhookDeliveries: 'Webhook Deliveries',
  },
  chat: {
    newThread: 'New Chat',
    threads: 'Threads',
    searchThreads: 'Search threads...',
    noThreads: 'No threads yet',
    noThreadsDesc: 'Start a new conversation to get going',
    sendMessage: 'Send message',
    typeMessage: 'Type a message...',
    deleteThread: 'Delete Thread',
    deleteThreadConfirm: 'Are you sure you want to delete this thread?',
    threadCreated: 'Thread created',
    threadCreateFailed: 'Failed to create thread',
    threadDeleted: 'Thread deleted',
    threadDeleteFailed: 'Failed to delete thread',
    threadUpdateFailed: 'Failed to update thread',
    messageSendFailed: 'Failed to send message',
    feedbackFailed: 'Failed to save feedback',
    regenerateFailed: 'Failed to regenerate message',
    aiThinking: 'AI is thinking...',
    fallbackRetrying: 'Retrying with fallback...',
    providerFailed: 'failed',
    tryingProvider: 'trying',
    allProvidersFailed: 'All providers failed to generate a response',
    imageGeneration: 'Image Generation',
    generatedImage: 'Generated Image',
    downloadImage: 'Download Image',
    fileGeneration: 'File Generation',
    generatingFile: 'Generating file...',
    fileGenerationFailed: 'File generation failed',
    downloadFile: 'Download File',
    convertingFile: 'Converting file',
    providerModel: 'Provider / Model',
    pinThread: 'Pin thread',
    unpinThread: 'Unpin thread',
    archiveThread: 'Archive thread',
    unarchiveThread: 'Unarchive thread',
    threadPinned: 'Thread pinned',
    threadUnpinned: 'Thread unpinned',
    threadArchived: 'Thread archived',
    threadUnarchived: 'Thread unarchived',
    pinFailed: 'Failed to update pin status',
    archiveFailed: 'Failed to update archive status',
    showArchived: 'Show archived',
    hideArchived: 'Hide archived',
    provenance: 'Message provenance',
    provenanceProvider: 'Provider',
    provenanceModel: 'Model',
    provenanceLatency: 'Latency',
    provenanceInputTokens: 'Input tokens',
    provenanceOutputTokens: 'Output tokens',
    provenanceEstimatedCost: 'Estimated cost',
    provenanceRoutingMode: 'Routing mode',
    provenanceFallbackUsed: 'Fallback used',
    provenanceYes: 'Yes',
    provenanceNo: 'No',
    globalSearch: 'Search threads',
    globalSearchPlaceholder: 'Search all threads...',
    globalSearchNoResults: 'No threads found',
    systemPrompt: 'System Prompt',
    systemPromptPlaceholder: 'Instructions for the AI...',
    temperature: 'Temperature',
    temperatureDescription: 'Controls randomness. Lower = more focused, higher = more creative.',
    maxTokens: 'Max Tokens',
    maxTokensDescription: 'Maximum length of the AI response.',
    threadSettings: 'Thread Settings',
    preferredModel: 'Default AI Model',
    preferredModelDescription: 'Default model for this thread. Can be overridden per message.',
    settingsSaved: 'Thread settings saved',
    helpful: 'Helpful',
    notHelpful: 'Not helpful',
    feedbackSaved: 'Feedback saved',
    attachFiles: 'Attach Files',
    noFiles: 'No files uploaded yet',
    selectedFiles: '{count} file(s) attached',
    contextPacks: 'Context Packs',
    contextPacksDescription: 'Select context packs to include in this thread.',
    noContextPacks: 'No context packs created yet',
    reRouted: 'Re-routed',
    reRoutedFrom: 'Re-routed from {provider}/{model}',
    weakResponse: 'Weak response detected',
    qualityScore: 'Quality: {score}%',
    judgeReferee: 'Judge & Referee',
    judgeRefereeDescription:
      'Enable AI-powered critique and verification of responses for higher accuracy.',
    judgeVerified: 'Verified',
    judgeRevised: 'Revised',
    judgeEscalated: 'Escalated',
    judgeCriticFeedback: 'Critic Feedback',
    judgeReasoning: 'Judge Reasoning',
    judgeEvaluating: 'Verifying response...',
    judgeModelLabel: 'Judge Model',
    judgeModelAuto: 'Auto (qwen3:1.7b)',
    judgeModelDescription: 'Override the local model used for final verdict',
    judgeOpenReview: 'View Judge Response',
    judgeReviewTitle: 'Judge Review',
    judgeReviewDescription:
      'Inspect the original answer, the judge decision, and the judge-generated response.',
    judgeDecisionLabel: 'Decision',
    judgeConfidenceLabel: 'Confidence',
    judgeSummary: 'Judge Summary',
    judgeResponse: 'Judge Response',
    judgeOriginalAnswer: 'Original Answer',
    judgeRevisedAnswer: 'Revised Answer',
    judgeEscalatedAnswer: 'Escalated Answer',
    judgeExecutionModel: 'Execution Model',
    judgeJudgeModel: 'Judge Model',
    judgeCriticModel: 'Critic Model',
    judgeCriticScore: 'Critic Score',
    judgeJudgeLatency: 'Judge Latency',
    judgeTotalLatency: 'Total Review Latency',
    judgeRecommendedChanges: 'Recommended Changes',
    judgeNoCriticFeedback: 'No critic feedback was recorded for this review.',
    judgeResponseTypeSummary: 'Summary',
    judgeResponseTypeRevisedAnswer: 'Revised Answer',
    judgeResponseTypeEscalatedAnswer: 'Escalated Answer',
    judgeResponseTypeVerificationNote: 'Verification Note',
    qualityThreshold: 'Quality Threshold',
    qualityThresholdDescription:
      'Minimum quality score before re-routing (0 = accept all, 1 = very strict)',
    maxReRouteAttempts: 'Max Re-route Attempts',
    maxReRouteAttemptsDescription: 'Maximum number of re-routing attempts per message (0-5)',
    reRouteReasonShort: 'Too short',
    reRouteReasonRefusal: 'Refusal detected',
    reRouteReasonRepetition: 'Excessive repetition',
    reRouteReasonEcho: 'Echo of prompt',
    reRouteReasonLowWords: 'Too few words',
    backToThreads: 'Back to threads',
    loadingThread: 'Loading thread...',
    selectOrStartTitle: 'Select a thread or start a new chat',
    selectOrStartDesc:
      'Choose an existing conversation from the sidebar or create a new one to interact with your configured AI models.',
    untitled: 'Untitled',
    attachedFile: 'Attached file',
    beginningOfConversation: 'Beginning of conversation',
    composerPlaceholder: 'Type your message...',
    currentAiProgress: 'Current AI progress',
    fileGenerationCancelled: 'File generation cancelled',
    fileGenerationFailedRetry: 'File generation failed. Retry?',
    generationCancelled: 'Generation cancelled',
    imageGenerationFailedRetry: 'Image generation failed. Retry?',
    judge: 'Judge',
    live: 'Live',
    loadingImage: 'Loading image...',
    loadingMessages: 'Loading messages...',
    loadingMoreThreads: 'Loading more threads...',
    loadingOlderMessages: 'Loading older messages...',
    loadingThreads: 'Loading threads...',
    manyMemories: '{count} memories',
    modelThinking: 'Model is thinking...',
    noMatchingThreads: 'No matching threads',
    noMessagesYet: 'No messages yet',
    noVisibleAnswer: 'No visible answer',
    oneMemory: '1 memory',
    open: 'Open',
    preparingDownload: 'Preparing download...',
    regenerate: 'Regenerate',
    searching: 'Searching...',
    threadActions: 'Thread actions',
    toggleProvenance: 'Toggle provenance',
    tryAnotherModel: 'Try another model',
    tryingFallback: 'Trying fallback...',
    verifyingWith: 'Verifying with {model}',
    visibleAiProgress: 'Visible AI progress',
    useMemoryLabel: 'Use memory in this thread',
    useMemoryDescription: 'When off, no memories are injected into the prompt.',
    useContextLabel: 'Use context packs in this thread',
    useContextDescription: 'When off, attached packs are ignored.',
  },
  receipt: {
    openLabel: 'Show what the AI used',
    contextUsed: 'Context used',
    dialogTitle: 'Why this answer',
    dialogDescription: 'Memories and pack items that influenced this reply.',
    loading: 'Loading receipt...',
    notAvailable: 'No receipt is available for this message.',
    memoriesCount: '{value} memories',
    packItemsCount: '{value} pack items',
    tokenBudget: 'Tokens: {used} / {total}',
    memoriesHeading: 'Memories',
    packItemsHeading: 'Pack items',
    warningsHeading: 'Warnings',
    scoreLabel: 'score {value}',
    pinnedBadge: 'pinned',
    redactedPlaceholder: '(redacted — content hidden)',
  },
  preview: {
    openLabel: 'Preview context',
    dialogTitle: 'What the AI would see',
    dialogDescription: 'Dry-run of memory + context-pack retrieval for the current draft.',
    loading: 'Building preview...',
    failed: 'Preview failed; the next send will still work.',
    empty: 'No context would be injected for this draft.',
    memoryCount: '{value} memories',
    packCount: '{value} pack items',
    tokenBudget: 'Tokens: {used} / {total}',
    memoriesHeading: 'Memories',
    packItemsHeading: 'Pack items',
    redactedPlaceholder: '(redacted — content hidden)',
  },
  connectors: {
    title: 'Connectors',
    description: 'Manage your AI provider connections',
    createConnector: 'Create Connector',
    editConnector: 'Edit Connector',
    deleteConnector: 'Delete Connector',
    testConnection: 'Test Connection',
    testingConnection: 'Testing...',
    syncModels: 'Sync Models',
    name: 'Name',
    nameHelp: 'A friendly name to identify this connector in your dashboard.',
    provider: 'Provider',
    providerHelp: 'The AI provider this connector will communicate with.',
    authType: 'Auth Type',
    authTypeHelp: 'How to authenticate with the provider. Most providers use API Key.',
    apiKey: 'API Key',
    apiKeyHelp: 'Your secret API key from the provider. It will be encrypted at rest.',
    baseUrl: 'Base URL',
    baseUrlHelp: 'Override the default API endpoint. Leave blank to use the provider default.',
    region: 'Region',
    regionHelp: 'The AWS region where your Bedrock endpoint is deployed.',
    status: 'Status',
    healthy: 'Healthy',
    degraded: 'Degraded',
    error: 'Error',
    noConnectors: 'No connectors configured',
    noConnectorsDesc: 'Add a connector to start using AI providers',
    connectorCreated: 'Connector created',
    connectorCreateFailed: 'Failed to create connector',
    connectorUpdated: 'Connector updated',
    connectorUpdateFailed: 'Failed to update connector',
    connectorDeleted: 'Connector deleted',
    connectorDeleteFailed: 'Failed to delete connector',
    testSuccessful: 'Connection test successful',
    testFailed: 'Connection test failed',
    modelsSynced: 'Models synced successfully',
    syncFailed: 'Failed to sync models',
    testBeforeCreate: 'Save the connector first, then test from the connectors list.',
    loadingConnectors: 'Loading connectors...',
    loadingConnector: 'Loading connector...',
    addConnector: 'Add Connector',
    loadFailed: 'Failed to load connectors.',
    connectorDetail: 'Connector Detail',
    connectorNotFound: 'Connector not found',
    backToConnectors: 'Back to connectors',
    syncing: 'Syncing...',
    enabled: 'Enabled',
    disabled: 'Disabled',
    configuration: 'Configuration',
    healthHistory: 'Health History',
    healthHistoryDesc: 'Health history tracking will be available in a future update.',
    models: 'Models',
    oneModel: '{count} model',
    manyModels: '{count} models',
    updatedAt: 'Updated {date}',
    addConnectorDesc: 'Add a new AI provider connector',
    apiKeyPlaceholder: 'Enter API key',
    apiKeyPlaceholderEdit: 'Leave blank to keep existing',
    baseUrlOptional: 'Base URL (optional)',
    baseUrlPlaceholder: 'https://api.example.com',
    defaultLabel: 'Default',
    editConnectorDesc: 'Update connector configuration',
    namePlaceholder: 'e.g., OpenAI Production',
    regionPlaceholder: 'e.g., us-east-1',
    saveFirstThenTest: 'Save the connector first, then test',
    selectProvider: 'Select a provider',
  },
  memory: {
    title: 'Memory',
    description: 'Manage AI memory records',
    createMemory: 'Create Memory',
    editMemory: 'Edit Memory',
    deleteMemory: 'Delete Memory',
    type: 'Type',
    content: 'Content',
    enabled: 'Enabled',
    disabled: 'Disabled',
    noMemories: 'No memory records',
    noMemoriesDesc: 'Create memory records to give AI context',
    memoryCreated: 'Memory created',
    memoryCreateFailed: 'Failed to create memory',
    memoryUpdated: 'Memory updated',
    memoryUpdateFailed: 'Failed to update memory',
    memoryDeleted: 'Memory deleted',
    memoryDeleteFailed: 'Failed to delete memory',
    memoryToggled: 'Memory toggled',
    memoryToggleFailed: 'Failed to toggle memory',
    loadFailed: 'Failed to load memory records.',
    loadingMemories: 'Loading memory records...',
    addMemory: 'Add Memory',
    contentPlaceholder: 'Enter memory content...',
    createMemoryDesc: 'Create a new memory entry',
    editMemoryDesc: 'Update memory details',
    source: 'Source',
    typeSummary: 'Summary',
    typeFact: 'Fact',
    typePreference: 'Preference',
    typeInstruction: 'Instruction',
    filterAllTypes: 'All Types',
    tabSaved: 'Saved',
    tabSuggestions: 'Suggestions',
    tabAudit: 'Audit',
    searchPlaceholder: 'Search memories...',
    filterAllScopes: 'All scopes',
    filterAllSources: 'All sources',
    filterAllSensitivities: 'All sensitivities',
    scopeUser: 'Personal',
    scopeThread: 'This conversation',
    scopeWorkspace: 'Workspace',
    scopeProject: 'Project',
    sourceUserManual: 'Created manually',
    sourceAiExtracted: 'Extracted from chat',
    sourceAutomation: 'Learned by automation',
    sourceImported: 'Imported',
    sensitivityNormal: 'Normal',
    sensitivitySensitive: 'Sensitive',
    sensitivityRedacted: 'Redacted',
    loadingSuggestions: 'Loading suggestions...',
    loadingAudit: 'Loading audit...',
    noSuggestions: 'No suggestions right now',
    noAudit: 'No audit entries yet',
    auditNoMemoryId: '(memory deleted)',
    approveSuggestion: 'Approve',
    rejectSuggestion: 'Reject',
    rejectAndSuppress: 'Reject & suppress similar',
    suggestionConfidence: 'Confidence: {value}%',
    suggestionReason: 'Reason: {value}',
  },
  files: {
    title: 'Files',
    description: 'Upload and manage files for AI context',
    uploadFile: 'Upload File',
    deleteFile: 'Delete File',
    dragDrop: 'Drag and drop files here, or click to browse',
    maxSize: 'Maximum file size: 50MB',
    noFiles: 'No files uploaded',
    noFilesDesc: 'Upload files to use as AI context',
    fileUploaded: 'File uploaded',
    fileUploadFailed: 'Failed to upload file',
    fileDeleted: 'File deleted',
    fileDeleteFailed: 'Failed to delete file',
    uploadFailed: 'Failed to upload file',
    loadFailed: 'Failed to load files.',
    loadingFiles: 'Loading files...',
    allTypesAccepted: 'All file types accepted',
    chunkIndex: 'Chunk #{index}',
    chunksTitle: 'File chunks',
    dropFileHere: 'Drop file here',
    dropOrClick: 'Drop file here or click to browse',
    fileFallback: 'File',
    noChunks: 'No chunks available',
    uploading: 'Uploading...',
    uploadNewFile: 'Upload a new file',
    viewChunks: 'View chunks',
    statusPending: 'Pending',
    statusProcessing: 'Processing',
    statusCompleted: 'Completed',
    statusFailed: 'Failed',
  },
  context: {
    title: 'Context Packs',
    description: 'Organize context for AI conversations',
    createPack: 'Create Context Pack',
    addItem: 'Add Item',
    name: 'Name',
    scope: 'Scope',
    noContextPacks: 'No context packs',
    noContextPacksDesc: 'Create context packs to organize AI context',
    packCreated: 'Context pack created',
    packCreateFailed: 'Failed to create context pack',
    packUpdated: 'Context pack updated',
    packUpdateFailed: 'Failed to update context pack',
    packDeleted: 'Context pack deleted',
    packDeleteFailed: 'Failed to delete context pack',
    itemAdded: 'Item added to context pack',
    itemAddFailed: 'Failed to add item',
    itemUpdated: 'Context pack item updated',
    itemUpdateFailed: 'Failed to update item',
    itemRemoved: 'Item removed from context pack',
    itemRemoveFailed: 'Failed to remove item',
    loadFailed: 'Failed to load context packs.',
    contextPack: 'Context Pack',
    packDetailsDesc: 'Pack details and items',
    backToPacks: 'Back to Packs',
    deletePack: 'Delete Pack',
    deleting: 'Deleting...',
    loadingPackDetails: 'Loading pack details...',
    noItems: 'No items in this pack',
    noItemsDesc: 'Add text notes, instructions, or file references to this context pack.',
    loadingContextPacks: 'Loading context packs...',
    addItemDesc: 'Add a text note, instruction, or file reference to this context pack.',
    adding: 'Adding...',
    content: 'Content',
    contentPlaceholder: 'Enter the content...',
    fileId: 'File ID',
    fileIdPlaceholder: 'Enter file ID',
    itemType: 'Type',
    selectType: 'Select a type',
    createPackDesc: 'Create a new context pack',
    creating: 'Creating...',
    descriptionOptional: 'Description (optional)',
    descriptionPlaceholder: 'Describe what this pack is for',
    namePlaceholder: 'e.g., Project Alpha context',
    scopeOptional: 'Scope (optional)',
    scopePlaceholder: 'e.g., global, project, user',
    typeNote: 'Note',
    typeInstruction: 'Instruction',
    typeFileReference: 'File Reference',
  },
  routing: {
    title: 'Routing Policies',
    description: 'Configure AI model routing',
    createPolicy: 'Create Policy',
    editPolicy: 'Edit Policy',
    deletePolicy: 'Delete Policy',
    name: 'Name',
    mode: 'Routing Mode',
    priority: 'Priority',
    active: 'Active',
    noPolicies: 'No routing policies',
    noPoliciesDesc: 'Create routing policies to control model selection',
    policyCreated: 'Policy created',
    policyCreateFailed: 'Failed to create policy',
    policyUpdated: 'Policy updated',
    policyUpdateFailed: 'Failed to update policy',
    policyDeleted: 'Policy deleted',
    policyDeleteFailed: 'Failed to delete policy',
    status: 'Status',
    inactive: 'Inactive',
    activate: 'Activate',
    deactivate: 'Deactivate',
    loadFailed: 'Failed to load routing configuration.',
    defaultRoutingMode: 'Default Routing Mode',
    defaultRoutingModeDesc: 'Choose how the local router distributes requests across models',
    defaultMode: 'Default Mode',
    fallbackSettings: 'Fallback Settings',
    fallbackSettingsDesc: 'Configure retry and timeout behavior',
    maxRetries: 'Max Retries',
    timeoutMs: 'Timeout (ms)',
    loadingPolicies: 'Loading policies...',
    noPoliciesConfigured: 'No routing policies configured.',
    complexityLabel: 'Complexity',
    complexitySimple: 'Simple',
    complexityMedium: 'Medium',
    complexityComplex: 'Complex',
    complexityExpert: 'Expert',
    routingExplanation: 'Routing Explanation',
    explanationSummary: 'Decision Summary',
    explanationFactors: 'Decision Factors',
    routingDurationMs: 'Routing Duration',
    modalityLabel: 'Detected Modality',
    modalityText: 'Text',
    modalityCode: 'Code',
    modalityImageInput: 'Image Understanding',
    modalityImageOutput: 'Image Generation',
    modalityAudioInput: 'Audio / Speech',
    modalityVideoInput: 'Video Analysis',
    modalityPdfInput: 'Document / PDF',
    modalityWebSearch: 'Web Search',
    modalityToolCalling: 'Tool Calling',
    modalityStructuredOutput: 'Structured Output',
    modalityOcr: 'OCR / Text Extraction',
    modalityReasoning: 'Deep Reasoning',
    namePlaceholder: 'My Routing Policy',
    selectModePlaceholder: 'Select routing mode',
    editPolicyDesc: 'Update the routing policy configuration.',
    createPolicyDesc: 'Create a new routing policy to control request distribution.',
    weightsJsonLabel: 'Score Weights (JSON, optional)',
    weightsJsonPlaceholder: '{"capability": 0.2, "domain": 0.1, ...}',
    weightsJsonHelp:
      'Optional. Override the per-mode default scoring weights. Must include all 14 dimensions and sum to 1.0.',
    weightsJsonError: {
      invalidJson: 'Weights JSON is not valid JSON.',
      notAnObject: 'Weights must be a JSON object.',
      missingDimension: 'Weights JSON must include every dimension as a number.',
      sumNotOne: 'Weights must sum to 1.0 (±0.001).',
    },
    models: {
      title: 'Model Registry',
      description:
        'Browse every model the router knows. Override cost, lifecycle, or routing flags.',
      updateSucceeded: 'Model updated.',
      updateFailed: 'Failed to update model.',
      overrideCleared: 'Override cleared.',
      overrideClearFailed: 'Failed to clear override.',
      softDeleteSucceeded: 'Model marked as removed.',
      softDeleteFailed: 'Failed to remove model.',
      columnProvider: 'Provider',
      columnModelKey: 'Model',
      columnLifecycle: 'Lifecycle',
      columnQuality: 'Quality',
      columnCost: 'Cost',
      columnLatency: 'Latency',
      filterByProvider: 'Filter by provider',
      filterByLifecycle: 'Filter by lifecycle',
    },
  },
  models: {
    title: 'Models',
    description: 'View all available AI models',
    localTitle: 'Local Models',
    localDescription: 'Manage locally installed AI models',
    pullModel: 'Pull Model',
    assignRole: 'Assign Role',
    noModels: 'No models available',
    noModelsDesc: 'Connect a provider or pull local models',
    modelPullStarted: 'Model pull started',
    modelPullFailed: 'Failed to pull model',
    roleAssigned: 'Role assigned',
    roleAssignFailed: 'Failed to assign role',
    loadFailed: 'Failed to load models.',
    loadingModels: 'Loading models...',
    allProviders: 'All providers',
    allLifecycle: 'All lifecycle',
    noModelsMatch: 'No models match the current filters.',
    localLoadFailed: 'Failed to load local models.',
    runtimeHealth: 'Runtime Health',
    runtimeHealthDesc: 'Current status of the local model runtime',
    pullModelDesc: 'Download a new model from the registry',
    modelName: 'Model Name',
    runtime: 'Runtime',
    pulling: 'Pulling...',
    pull: 'Pull',
    installedModels: 'Installed Models',
    loadingLocalModels: 'Loading local models...',
    noLocalModels: 'No local models installed',
    noLocalModelsDesc: 'Pull a model using the form above to get started with local inference.',
    colModel: 'Model',
    colRuntime: 'Runtime',
    colSize: 'Size',
    colFamily: 'Family',
    colParameters: 'Parameters',
    colRoles: 'Roles',
    noneRole: 'None',
    modelNamePlaceholder: 'llama3:8b',
    capabilities: 'Capabilities',
    context: 'Context',
    lifecycle: 'Lifecycle',
    noSyncedModels: 'No synced models',
    streaming: 'Streaming',
    tools: 'Tools',
    vision: 'Vision',
  },
  observability: {
    title: 'Observability',
    description: 'Monitor AI usage and performance',
    totalRequests: 'Total Requests',
    totalCost: 'Total Cost',
    avgLatency: 'Avg Latency',
    activeModels: 'Active Models',
    clientLogs: 'Client Logs',
    serverLogs: 'Server Logs',
    auditTrail: 'Audit Trail',
    loadingData: 'Loading observability data...',
    failedToLoad: 'Failed to load data',
    failedToLoadDesc: 'Could not fetch observability data. Please try again later.',
    noDataYet: 'No observability data yet',
    noDataDesc:
      'Metrics and performance data will populate here once requests begin flowing through the orchestration layer.',
    fullDescription: 'Monitor system health, request latencies, and model performance',
    totalRequestsLabel: 'Total Requests',
    acrossProviders: 'Across all providers',
    estimatedCost: 'Estimated Cost',
    estimatedCostLabel: 'Estimated Cost',
    recentFailures: 'Recent Failures',
    highCriticalSeverity: 'HIGH + CRITICAL severity events',
    providerUsage: 'Provider Usage',
    modelUsage: 'Model Usage',
    latencyBreakdown: 'Latency Breakdown',
    costSummary: 'Cost Summary',
    avg: 'Average',
    p50Median: 'P50 (Median)',
    p95: 'P95',
    totalTokens: 'Total Tokens',
    requests: 'requests',
    tokens: 'tokens',
    noData: 'No data',
  },
  audits: {
    title: 'Audit Logs',
    description: 'View system activity logs',
    action: 'Action',
    severity: 'Severity',
    entity: 'Entity',
    timestamp: 'Timestamp',
    noAudits: 'No audit logs',
    noAuditsDesc: 'Activity will appear here as you use the platform',
    actor: 'Actor',
    details: 'Details',
    loadingAudits: 'Loading audit logs...',
    loadFailed: 'Failed to load audits',
    loadFailedDesc: 'Could not fetch audit logs. Please try again later.',
    noMatchingAudits: 'No audit logs match your filters.',
    allActions: 'All Actions',
    allSeverities: 'All Severities',
    searchPlaceholder: 'Search...',
    ipAddress: 'IP Address',
  },
  admin: {
    title: 'Admin',
    description: 'Manage users and system settings',
    users: 'Users',
    createUser: 'Create User',
    changeRole: 'Change Role',
    deactivate: 'Deactivate',
    reactivate: 'Reactivate',
    noUsers: 'No users found',
    checkingServices: 'Checking services...',
    healthUnreachable: 'Unable to reach the health service.',
    loadingUsers: 'Loading users...',
    loadUsersFailed: 'Failed to load users',
    loadUsersFailedDesc: 'Could not fetch user list. Please try again later.',
    userRoleUpdated: 'User role updated',
    userRoleUpdateFailed: 'Failed to update user role',
    userDeactivated: 'User deactivated',
    userDeactivateFailed: 'Failed to deactivate user',
    userStats: 'User Stats',
    userStatsDesc: 'Overview of platform users',
    totalUsers: 'Total Users',
    activeUsers: 'Active Users',
    platformHealth: 'Platform Health',
    systemStatusOverview: 'System status overview',
    userManagement: 'User Management',
    colUsername: 'Username',
    colEmail: 'Email',
    colRole: 'Role',
    colStatus: 'Status',
    colJoined: 'Joined',
    colActions: 'Actions',
    roleAdmin: 'Admin',
    roleOperator: 'Operator',
    roleViewer: 'Viewer',
  },
  settings: {
    title: 'Settings',
    description: 'Manage your account settings',
    profile: 'Profile',
    profileDescription: 'Your personal information. These fields are read-only.',
    username: 'Username',
    email: 'Email',
    emailReadOnly: 'Contact an administrator to change your email.',
    role: 'Role',
    selectLanguage: 'Select language',
    preferences: 'Preferences',
    language: 'Language',
    languageDescription: 'Select your preferred display language',
    appearance: 'Appearance',
    appearanceDescription: 'Choose how the application looks',
    system: 'System',
    light: 'Light',
    dark: 'Dark',
    theme: 'Theme',
    changePassword: 'Change Password',
    currentPassword: 'Current Password',
    newPassword: 'New Password',
    confirmPassword: 'Confirm Password',
    passwordChanged: 'Password changed successfully',
    passwordChangeFailed: 'Failed to change password',
    passwordRequirements:
      'Password must be at least 8 characters with uppercase, lowercase, and a number',
    preferencesUpdated: 'Preferences updated successfully',
    preferencesUpdateFailed: 'Failed to update preferences',
    devices: {
      title: 'Devices',
      description: 'Manage desktop agents paired with your account.',
      emptyTitle: 'No devices paired',
      emptyBody: 'Run `claw-agent login` on your machine to pair a device.',
      revoke: 'Revoke',
      rename: 'Rename',
      scopesHeading: 'Scopes',
      revokedBanner: 'This device has been revoked',
    },
    langEnglish: 'English',
    langArabic: 'Arabic',
    langFrench: 'French',
    langItalian: 'Italian',
    langGerman: 'German',
    langSpanish: 'Spanish',
    langRussian: 'Russian',
    langPortuguese: 'Portuguese',
    langHindi: 'Hindi',
    appearanceSystem: 'System',
    appearanceLight: 'Light',
    appearanceDark: 'Dark',
  },
  dashboard: {
    title: 'Dashboard',
    description: 'Overview of your AI platform',
    quickActions: 'Quick Actions',
    recentActivity: 'Recent Activity',
    totalThreads: 'Total Threads',
    activeConnectors: 'Active Connectors',
    localModels: 'Local Models',
    systemHealth: 'System Health',
    startNewChat: 'Start a New Chat',
    addConnector: 'Add Connector',
    configureRouting: 'Configure Routing',
    serviceStatus: 'Service Status',
    checkingHealth: 'Checking service health...',
    healthUnreachable:
      'Could not reach the health aggregator. Please verify the health service is running.',
    servicesOperational: '{up} of {total} services operational',
    responseTimeMs: '{ms}ms',
    unreachable: 'unreachable',
    newChatLabel: 'New Chat',
    newChatDesc: 'Start a new conversation',
    manageConnectorsLabel: 'Manage Connectors',
    manageConnectorsDesc: 'Configure your AI provider connectors',
    routingSettingsLabel: 'Routing Settings',
    routingSettingsDesc: 'Configure how requests are routed',
  },
  catalog: {
    title: 'Model Catalog',
    description: 'Browse and download AI models',
    searchPlaceholder: 'Search models...',
    allCategories: 'All',
    coding: 'Coding',
    fileGeneration: 'File Generation',
    imageGeneration: 'Image Generation',
    routing: 'Routing',
    reasoning: 'Reasoning',
    thinking: 'Thinking & Search',
    download: 'Download',
    downloading: 'Downloading...',
    installed: 'Installed',
    failed: 'Failed',
    unavailable: 'Unavailable',
    cloudOnly: 'Cloud only',
    cancel: 'Cancel',
    recommended: 'Recommended',
    noModels: 'No models found',
    activeDownloads: 'Active Downloads',
    parameterCount: 'Parameters',
    modelSize: 'Size',
    capabilities: 'Capabilities',
    models: 'models',
    scrollForMore: 'Scroll for more',
    allLoaded: 'All models loaded',
    searchBrowserHelpers: 'Search/Browser helpers',
    searchBrowserScoreLabel: 'Helper',
    searchBrowserScoreTooltip:
      'Suitability for search & browser helper workflows (metadata-driven score, 0.00–1.00)',
    cancelDownloadFailed: 'Failed to cancel download',
    downloadCancelled: 'Download cancelled',
    downloadStarted: 'Download started',
    downloadStartFailed: 'Failed to start download',
    modelRemoved: 'Model removed',
    modelRemoveFailed: 'Failed to remove model',
  },
  replay: {
    title: 'Routing Replay Lab',
    description:
      'Re-run historical routing decisions against the current router and compare results',
    runReplay: 'Run Replay',
    running: 'Running replay...',
    totalReplayed: 'Total Replayed',
    changed: 'Changed',
    unchanged: 'Unchanged',
    oldRoute: 'Original Route',
    newRoute: 'New Route',
    improvement: 'Improvement',
    noResults: 'No replay results yet',
    confidenceOld: 'Avg Confidence (Old)',
    confidenceNew: 'Avg Confidence (New)',
    replayComplete: 'Routing replay completed',
    replayFailed: 'Failed to run routing replay',
    saveRun: 'Save run',
    runName: 'Run name',
    runNamePlaceholder: 'e.g. baseline-2026-04',
    threadIdFilter: 'Thread ID',
    threadIdPlaceholder: 'Filter by thread...',
    startDate: 'Start date',
    endDate: 'End date',
    suspicious: 'Suspicious',
    avgImprovement: 'Avg Improvement',
    needsReview: 'Needs Review',
    noSuspiciousCases: 'No suspicious cases detected',
    noSuspiciousCasesDesc: 'All replay results look clean',
    confirmedRegression: 'Confirmed Regression',
    markConfirmedRegression: 'Mark as Regression',
    caseReviewed: 'Case reviewed successfully',
    caseReviewFailed: 'Failed to review case',
    copyBundle: 'Copy Export Bundle',
    bundleCopied: 'Export bundle copied to clipboard',
    exportFailed: 'Failed to export bundle',
    runsHistory: 'Run History',
    noRunsHistory: 'No saved runs yet',
    noRunsHistoryDesc: 'Enable "Save run" when running a replay to track history',
    runResults: 'Results',
    correct_improvement: 'Improvement',
    bad_regression: 'Regression',
    cost_win: 'Cost Win',
    quality_win: 'Quality Win',
    uncertain: 'Uncertain',
    badRegression: 'Regressions',
    noOriginalContent: 'No original prompt stored',
    promoteCase: 'Promote to Test',
    promoted: 'Case promoted to test fixture',
    promoteFailed: 'Failed to promote case',
    compareRuns: 'Compare Runs',
    compareRunsTitle: 'Run Comparison',
    compareRunsDesc: 'Select two runs to compare routing decisions',
    selectRunToCompare: 'Select a run to compare',
    runA: 'Run A',
    runB: 'Run B',
    improved: 'Improved',
    regressed: 'Regressed',
    suspiciousReasons: {
      empty_message_content: 'Missing original prompt',
      large_confidence_drop: 'Large confidence drop',
      large_cost_increase: 'Large cost increase',
      route_changed_with_negative_improvement: 'Route changed with negative impact',
    },
  },
  compare: {
    title: 'Compare Models',
    description: 'Select 2-5 models and enter a prompt to compare responses side by side',
    selectModels: 'Select Models',
    minModels: 'Select at least {min} models',
    maxModels: 'Maximum {max} models allowed',
    sendPrompt: 'Compare Models',
    comparing: 'Comparing...',
    compareFailed: 'Failed to compare models',
    results: 'Results',
    fastest: 'Fastest',
    completed: 'Completed',
    failed: 'Failed',
    latency: 'Latency',
    tokens: 'Tokens',
    noResults: 'No comparison results yet',
    modelCount: '{count} models',
    expand: 'Expand',
    bestResponse: 'Best response',
    viewInThread: 'View in thread',
    totalTokens: 'Total Tokens',
    avgLatencyLabel: 'Avg Latency',
    completedCount: '{count} completed',
    failedCount: '{count} failed',
    timeoutCount: '{count} timed out',
    modelsCompared: 'Models Compared',
    summaryTitle: 'Comparison Summary',
    showMore: 'Show more',
    showLess: 'Show less',
    timeout: 'Timed out',
    noContent: 'No content available',
    noJudge: 'No judge',
    judgeAwaiting: 'Awaiting judge',
    judgeSkipped: 'Judge skipped',
    judgeFailed: 'Judge failed',
    judgeUnavailable: 'Judge unavailable',
    judgeVerified: 'Verified',
    judgeRevised: 'Revised',
    judgeEscalated: 'Escalated',
    modelsProcessing: 'Models processing...',
    processingMessage: 'Processing your message...',
  },
  consensus: {
    title: 'Consensus Mode',
    description: 'Select 2-5 models and let AI synthesize a consensus answer',
    selectModels: 'Select Models',
    minModels: 'Select at least {min} models',
    maxModels: 'Maximum {max} models allowed',
    sendPrompt: 'Run Consensus',
    running: 'Running consensus...',
    sendFailed: 'Failed to start consensus',
    synthesizing: 'Synthesizing responses...',
    synthesisReady: 'Synthesis ready',
    synthesisTitle: 'Consensus Synthesis',
    agreementScore: 'Agreement Score',
    confidenceLevel: 'Confidence',
    agreements: 'Agreements',
    disagreements: 'Disagreements',
    contradictions: 'Contradictions',
    synthesisRationale: 'Rationale',
    modelBreakdown: 'Model Breakdown',
    completed: 'Completed',
    failed: 'Failed',
    timeout: 'Timed out',
    contentLength: 'Content length',
    noResults: 'No consensus results yet',
    viewInThread: 'View in thread',
    high: 'High',
    medium: 'Medium',
    low: 'Low',
    modelsSelected: '{count} models selected',
    synthesisRationaleLabel: 'Synthesis rationale',
  },
  escalation: {
    title: 'Escalation Chain',
    description:
      'Define a model chain — cheapest first, most powerful last. AI escalates automatically when quality is low',
    chainBuilder: 'Build Your Chain',
    addModel: 'Add Model',
    removeModel: 'Remove',
    moveUp: 'Move up',
    moveDown: 'Move down',
    minSteps: 'Add at least {min} models',
    maxSteps: 'Maximum {max} models in chain',
    sendPrompt: 'Run Chain',
    running: 'Running chain...',
    sendFailed: 'Failed to start escalation chain',
    synthesizing: 'Running escalation...',
    synthesisReady: 'Result ready',
    resultTitle: 'Escalation Result',
    stepUsed: 'Step Used',
    totalSteps: 'Total Steps',
    escalated: 'Escalated',
    notEscalated: 'No Escalation Needed',
    status: 'Status',
    statusSingleStep: 'Resolved at first step',
    statusResolved: 'Resolved after escalation',
    statusExhausted: 'All steps exhausted',
    qualityScore: 'Quality Score',
    latency: 'Latency',
    step: 'Step',
    passed: 'Passed',
    failed: 'Failed',
    finalModel: 'Final Model',
    noResults: 'No escalation results yet',
    viewInThread: 'View in thread',
    stepsTimeline: 'Steps Timeline',
    finalAnswer: 'Final Answer',
  },
  repair: {
    title: 'Answer Repair Lab',
    description:
      'Repair malformed, shallow, incomplete, or hallucinated answers without restarting.',
    contentLabel: 'Answer to repair',
    contentPlaceholder: 'Paste the answer you want to repair...',
    repairTypes: 'Repair types',
    schemaLabel: 'Schema',
    schemaDesc: 'Fix malformed JSON, incorrect structure, or data format issues.',
    formatLabel: 'Format',
    formatDesc: 'Fix markdown formatting, headers, lists, code blocks, and overall structure.',
    completenessLabel: 'Completeness',
    completenessDesc: 'Expand shallow or incomplete sections, add missing key points.',
    factualityLabel: 'Factuality',
    factualityDesc: 'Identify and correct factual errors, hallucinations, or incorrect claims.',
    sendPrompt: 'Repair Answer',
    running: 'Repairing...',
    sendFailed: 'Failed to start repair. Please try again.',
    synthesizing: 'Repair in progress...',
    resultTitle: 'Repaired Answer',
    noResults: 'No repair results yet',
    viewInThread: 'View in thread',
    finalAnswer: 'Final Answer',
    provider: 'Provider',
    model: 'Model',
  },
  decompose: {
    title: 'Task Decomposition Router',
    description:
      'Break complex tasks into sub-tasks, execute each with the best model, then synthesize the results.',
    contentLabel: 'Complex Task',
    contentPlaceholder:
      'Describe a complex task to decompose, e.g. "Research AI trends in 2025, create a 3-point action plan, and write an executive summary."',
    maxSubTasks: 'Max Sub-Tasks',
    sendPrompt: 'Decompose & Execute',
    running: 'Decomposing…',
    synthesizing: 'Executing sub-tasks and synthesizing results…',
    resultTitle: 'Synthesized Result',
    viewInThread: 'View in Thread',
    subTasksHeader: 'Sub-Task Results',
    subTaskResult: 'Result',
    category: 'Category',
    model: 'Model',
    latencyMs: 'Latency',
    noResults: 'No Decomposition Results',
    sendFailed: 'Task decomposition failed. Please try again.',
  },
  bestOfN: {
    title: 'Best-of-N Candidate Generation',
    description:
      'Generate multiple candidate answers and automatically select the highest quality response.',
    contentLabel: 'Prompt',
    contentPlaceholder: 'Enter your prompt to generate multiple candidates from\u2026',
    nCandidates: 'Candidates (N)',
    sendPrompt: 'Generate Best-of-N',
    running: 'Generating candidates\u2026',
    synthesizing: 'Scoring and selecting the best candidate\u2026',
    resultTitle: 'Best Candidate Result',
    viewInThread: 'View in Thread',
    candidatesHeader: 'All Candidates',
    rank: 'Rank',
    score: 'Score',
    model: 'Model',
    latency: 'Latency',
    noResults: 'No Candidates Generated',
    sendFailed: 'Candidate generation failed. Please try again.',
  },
  recovery: {
    title: 'Route Failure Recovery',
    description: 'Monitor provider failures and automatic fallback recovery events.',
    totalDecisions: 'Total Decisions',
    totalFallbacks: 'Fallback Events',
    fallbackRate: 'Fallback Rate',
    providerTable: 'Provider Failure Breakdown',
    provider: 'Provider',
    fallbackCount: 'Fallbacks',
    rate: 'Rate',
    recentFallbacks: 'Recent Fallback Events',
    originalProvider: 'Original',
    originalModel: 'Model',
    fallbackProvider: 'Fallback',
    fallbackModel: 'Fallback Model',
    mode: 'Mode',
    time: 'Time',
    noFallbacks: 'No Fallback Events',
    noData: 'No routing decisions recorded yet.',
    loading: 'Loading recovery data\u2026',
    error: 'Failed to load recovery stats.',
  },
  verify: {
    title: 'Verifier',
    description: 'Generate and verify a response before sending',
    contentLabel: 'Your prompt',
    contentPlaceholder: 'Enter your question or task...',
    maxRevisionsLabel: 'Max revisions',
    sendPrompt: 'Verify & Send',
    running: 'Verifying...',
    synthesizing: 'Generating and verifying response...',
    noResults: 'No verified response yet',
    sendFailed: 'Verification failed. Please try again.',
    verified: 'Verified',
    verifierScore: 'Quality Score',
    revisions: 'Revisions',
    issues: 'Issues',
    viewInThread: 'View in Thread',
  },
  adaptiveLearning: {
    title: 'Adaptive Route Learning',
    description: 'Insights derived from routing history to improve future decisions',
    loading: 'Loading insights...',
    error: 'Failed to load insights',
    windowDays: 'Window',
    days: 'days',
    totalDecisions: 'Total Decisions',
    avgConfidence: 'Avg Confidence',
    topReasonTags: 'Top Reason Tags',
    providerTable: 'Provider Performance',
    modeBreakdown: 'Mode Breakdown',
    noData: 'No routing decisions in this window',
    provider: 'Provider',
    fallbackRate: 'Fallback Rate',
    totalCalls: 'Total Calls',
    topModes: 'Top Modes',
    mode: 'Mode',
    count: 'Count',
    percentage: 'Percentage',
  },
  pipeline: {
    title: 'Multi-Stage Pipeline',
    description: 'Route your request through a chain of specialist stages',
    contentLabel: 'Your request',
    contentPlaceholder: 'Describe what you need...',
    templateLabel: 'Pipeline template',
    templateAnalyze: 'Analyze → Reason → Format',
    templateCode: 'Code → Debug → Review',
    templateDraft: 'Draft → Critique → Revise',
    sendPrompt: 'Run Pipeline',
    running: 'Running pipeline...',
    synthesizing: 'Processing stages...',
    noResults: 'No pipeline results yet',
    sendFailed: 'Pipeline failed. Please try again.',
    stageBreakdown: 'Stage Breakdown',
    stage: 'Stage',
    model: 'Model',
    latency: 'Latency',
    viewInThread: 'View in Thread',
  },
  costEnsemble: {
    title: 'Cost-Aware Ensemble',
    description: 'Smart execution: use one, two, or three models based on task complexity',
    contentLabel: 'Your prompt',
    contentPlaceholder: 'Enter your question or task...',
    sendPrompt: 'Analyze & Send',
    running: 'Analyzing cost...',
    synthesizing: 'Selecting optimal ensemble...',
    noResults: 'No results yet',
    sendFailed: 'Cost ensemble failed. Please try again.',
    tier: 'Tier',
    tierSingle: 'Single',
    tierDuo: 'Duo',
    tierTrio: 'Trio',
    complexity: 'Complexity',
    risk: 'Risk',
    ambiguity: 'Ambiguity',
    reasoning: 'Reasoning',
    candidates: 'Candidates',
    viewInThread: 'View in Thread',
  },
  rolePack: {
    title: 'Role-Based Ensemble',
    description: 'Submit your request to a team of specialized AI roles',
    contentLabel: 'Your request',
    contentPlaceholder: 'Describe what you need...',
    packLabel: 'Select team',
    packCoding: 'Coding Team',
    packResearch: 'Research Team',
    packMarketing: 'Marketing Team',
    packLegal: 'Legal Team',
    sendPrompt: 'Run Team',
    running: 'Team processing...',
    synthesizing: 'Running all roles in parallel...',
    noResults: 'No team results yet',
    sendFailed: 'Team run failed. Please try again.',
    teamBreakdown: 'Team Results',
    role: 'Role',
    model: 'Model',
    latency: 'Latency',
    viewInThread: 'View in Thread',
  },
  advancedModelSelector: {
    label: 'Execution model',
    auto: 'Auto (choose best local model)',
    loading: 'Loading models...',
    description: 'Choose Auto or a specific locally installed Ollama model for this lab.',
    empty: 'No local text models are available for this lab yet.',
  },
  workspaceConnectors: {
    title: 'Workspace Connectors',
    description: 'Connect your workspace tools — GitHub, Slack, Jira, Google Drive, and more.',
    createConnector: 'Create Connector',
    editConnector: 'Edit Connector',
    deleteConnector: 'Delete Connector',
    testHealth: 'Test Health',
    triggerSync: 'Sync Now',
    name: 'Name',
    nameHelp: 'A display name for this connector',
    provider: 'Provider',
    providerHelp: 'The workspace tool to connect',
    permissionLevel: 'Permission Level',
    permissionLevelHelp: 'The access level granted to this connector',
    status: 'Status',
    connected: 'Connected',
    degraded: 'Degraded',
    disconnected: 'Disconnected',
    pendingAuth: 'Pending Auth',
    unknown: 'Unknown',
    noConnectors: 'No workspace connectors',
    noConnectorsDesc: 'Connect your first workspace tool to get started.',
    noConnectorsGuidance:
      'Connections start from App Configurations. Register your OAuth app there, then click Connect to link it here.',
    overviewDescription: 'Your connected workspace tools. Add new ones from App Configurations.',
    manageAppConfigs: 'Manage App Configurations',
    goToAppConfigs: 'Go to App Configurations',
    connectorCreated: 'Connector created successfully.',
    connectorCreateFailed: 'Failed to create connector.',
    connectorDeleted: 'Connector deleted successfully.',
    connectorDeleteFailed: 'Failed to delete connector.',
    healthCheckStarted: 'Health check started.',
    healthCheckFailed: 'Health check failed.',
    syncStarted: 'Sync started.',
    syncFailed: 'Failed to start sync.',
    loadFailed: 'Failed to load connectors.',
    loadingConnectors: 'Loading connectors...',
    addConnector: 'Add Connector',
    connectViaOAuth: 'Connect via OAuth',
    lastSync: 'Last Sync',
    never: 'Never',
    syncRuns: 'Sync Runs',
    healthEvents: 'Health Events',
    enabled: 'Enabled',
    disabled: 'Disabled',
    deleteConfirm: 'Are you sure you want to delete this connector? This action cannot be undone.',
    namePlaceholder: 'e.g., GitHub Workspace',
    paused: 'Paused',
  },
  workspaceObjects: {
    title: 'Synced Objects',
    description: 'Objects synced from your connected workspace tools.',
    loading: 'Loading objects...',
    loadFailed: 'Failed to load workspace objects.',
    noObjects: 'No objects synced yet.',
    noObjectsDesc: 'Trigger a sync on a connector to import workspace objects.',
    selectConnector: 'Select a connector to view its synced objects.',
    source: 'Source',
    viewObject: 'View Object',
  },
  workspaceSearch: {
    title: 'Workspace Search',
    description: 'Search across all synced workspace objects.',
    placeholder: 'Search documents, issues, messages...',
    searching: 'Searching...',
    noResults: 'No results found.',
    noResultsDesc: 'Try a different search term or sync more connectors.',
    searchFailed: 'Search failed. Please try again.',
    resultCount: '{count} result(s)',
    viewSource: 'View Source',
    score: 'Relevance',
  },
  workspaceObjectDetail: {
    title: 'Object Detail',
    description: 'Inspect a synced workspace object and refresh from its provider.',
    loadFailed: 'Failed to load object.',
    refresh: 'Refresh from provider',
    refreshing: 'Refreshing...',
    refreshFailed: 'Refresh failed.',
    content: 'Content',
    metadata: 'Metadata',
    externalCreated: 'Created upstream',
    externalUpdated: 'Updated upstream',
    openInProvider: 'Open in provider',
    author: 'Author: {author}',
  },
  connectorDetail: {
    title: 'Connector Detail',
    description: 'Sync history, health events, and recently synced objects for this connector.',
    loadFailed: 'Failed to load connector.',
    never: 'never',
    lastSync: 'Last sync: {value}',
    syncRunsCount: '{count} sync runs',
    objectsCount: '{count} objects',
    recentObjects: 'Recent objects',
    noObjects: 'No synced objects yet. Trigger a sync to pull objects from the provider.',
    syncHistory: 'Sync history',
    noSyncRuns: 'No sync runs yet.',
    syncRunLine: '{synced} synced · {failed} failed',
    healthHistory: 'Health history',
    noHealthEvents: 'No health checks recorded yet.',
    healthOk: 'OK',
    activating:
      'Activating this connector — importing your first set of objects from the provider. You can keep using Claw while this runs.',
    askAi: 'Ask AI about this',
    askAiTitle: 'About {name}',
    reconnect: 'Reconnect',
    reconnectTitle: 'This connector is disconnected',
    reconnectDescription:
      'The stored credentials are no longer valid. Re-authorize from App Configurations to restore access.',
  },
  workspaceSyncRuns: {
    title: 'Sync runs',
    description: 'Recent sync history for this connector.',
    loading: 'Loading sync runs...',
    loadFailed: 'Failed to load sync runs.',
    empty: 'No sync runs yet.',
    started: 'Started',
    status: 'Status',
    type: 'Type',
    delta: 'Delta',
    found: 'Found',
    synced: 'Synced',
    failed: 'Failed',
    duration: 'Duration',
  },
  workspaceSync: {
    dashboard: {
      title: 'Workspace Sync Health',
      description: 'Live view of scheduled sync jobs across every workspace connector.',
      error_title: 'Unable to load sync dashboard',
      empty_title: 'No connectors yet',
      empty_description: 'Once you connect a workspace tool, its sync health will appear here.',
      scheduler_title: 'Scheduler',
      scheduler_enabled: 'Scheduler enabled',
      last_tick: 'Last tick',
      active_runs: 'Active runs',
      dlq_backlog: 'DLQ backlog',
      connectors_title: 'Connectors',
      col: {
        connector: 'Connector',
        freshness: 'Freshness',
        last_sync: 'Last sync',
        cadence: 'Cadence',
        success_rate: 'Success rate 24h',
        avg_duration: 'Avg duration',
        status: 'Status',
      },
    },
    band: { fresh: 'Fresh', slow: 'Slow', stale: 'Stale' },
    cadence: {
      label: 'Sync every',
      '1m': '1 minute',
      '5m': '5 minutes',
      '10m': '10 minutes',
      '30m': '30 minutes',
      '1h': '1 hour',
      save: 'Save cadence',
      saving: 'Saving...',
      saved: 'Cadence updated',
    },
    pause: {
      pause: 'Pause sync',
      resume: 'Resume sync',
      paused_label: 'Sync paused',
      reason_placeholder: 'Reason (optional)',
    },
    chip: {
      synced_ago: 'Synced {ago} ago',
      stale: 'Stale',
      paused: 'Paused',
    },
  },
  aiActions: {
    dialog: {
      title: 'Run AI Action · {action}',
      description:
        'Choose a model and generate. AUTO lets the router pick based on action kind and privacy class.',
      model_label: 'Model',
      generate: 'Generate',
      regenerate: 'Regenerate',
      resolving: 'Generating…',
      cancel: 'Cancel',
      close: 'Close',
      copy: 'Copy',
      copied: 'Copied',
      generated_by: 'Generated by {model}',
      resolution_mode: 'Mode: {mode}',
      resolution_primary: 'Primary: {model}',
      resolution_fallback: 'Fallback models queued: {count}',
    },
  },
  approvals: {
    page: {
      title: 'Approval Center',
      description:
        'Review and approve pending AI-drafted actions across your workspace connectors.',
      empty_title: 'No pending approvals',
      empty_description: 'When AI drafts an action on your behalf, it will appear here for review.',
      error_title: 'Unable to load approvals',
      error_description: 'Something went wrong loading the approvals list. Try again.',
    },
    card: {
      approve: 'Approve',
      reject: 'Reject',
      edit: 'Edit',
      edited: 'Edited · v{version}',
      source_stale: 'Source stale',
      attribution_auto: 'AUTO · {model}',
      attribution_manual: 'Manual · {model}',
    },
    bulk: {
      selected: '{count} selected',
      approve_all: 'Approve all selected',
      clear: 'Clear selection',
    },
    edit: {
      title: 'Edit draft',
      description: 'Edit the action payload. The original draft is preserved in history.',
      payload_label: 'Payload (JSON)',
      reason_placeholder: 'Reason for edit (optional)',
      save: 'Save & re-approve later',
      cancel: 'Cancel',
      invalid_json: 'Payload must be valid JSON',
    },
    reject: {
      title: 'Reject action',
      description: 'Optionally describe why you are rejecting this action.',
      reason_placeholder: 'Reason (optional)',
      confirm: 'Reject',
      cancel: 'Cancel',
    },
  },
  automationPreferences: {
    page: {
      title: 'Automation Preferences',
      description:
        'Per-action-kind controls. Most-restrictive-wins: admin policy is the floor, your preferences can only tighten it.',
      loading: 'Loading preferences…',
      error: 'Could not load preferences. Try refreshing.',
      empty: 'No action kinds available yet.',
    },
    row: {
      enabled: 'Enabled',
      disabled: 'Disabled',
      toggleAria: 'Toggle automation for {kind}',
      autoApproveBelowRisk: 'Auto-approve when risk score is at or below',
      autoApproveDisabled: 'Auto-approve disabled (always queue for review)',
      autoApproveAt: 'Auto-approve at risk ≤ {score}',
      perDayBudget: 'Per-day cap',
      perDayBudgetPlaceholder: 'unlimited',
      clear: 'Clear',
    },
  },
  connectorGrants: {
    title: 'Sharing',
    description:
      'Share this connector with other users. Owner always has full access; grantees see the access level you pick.',
    loading: 'Loading grants…',
    error: 'Could not load grants.',
    empty: 'No grants yet. This connector is only accessible to you.',
    granteeUserIdLabel: 'Grantee user ID',
    granteeUserIdPlaceholder: 'cmnkgdc2c00009w92riuztmmd',
    accessLevelLabel: 'Access level',
    grant: 'Grant access',
    granting: 'Granting…',
    revoke: 'Revoke',
    revoking: 'Revoking…',
    grantedBy: 'granted by',
    levelReadOnly: 'Read only',
    levelAiActions: 'AI actions',
    levelFull: 'Full',
  },
  emailSignatures: {
    page: {
      title: 'Email Signatures',
      description:
        'Manage signatures appended to AI-drafted emails. Mark one as default so it is used automatically.',
      loading: 'Loading signatures…',
      error: 'Could not load signatures. Try refreshing.',
      empty: 'No signatures yet. Create one to get started.',
      create: 'New signature',
      edit: 'Edit',
      delete: 'Delete',
      deleting: 'Deleting…',
      defaultBadge: 'Default',
    },
    dialog: {
      createTitle: 'Create signature',
      editTitle: 'Edit signature',
      nameLabel: 'Name',
      namePlaceholder: 'Work signature',
      bodyLabel: 'Body',
      bodyPlaceholder: 'Best,\nAlice\nVP Engineering · Example Inc.',
      defaultLabel: 'Use as default',
      save: 'Save',
      saving: 'Saving…',
      cancel: 'Cancel',
    },
  },
  research: {
    toggle: {
      placeholder: 'Research',
      autoProvider: 'Auto Provider',
      noProviders: 'No providers configured',
    },
    modes: {
      off: 'No research',
      searchOnly: 'Web search',
      searchThenFetch: 'Search + fetch',
      searchFetchExtract: 'Search + extract',
    },
    providers: {
      title: 'Research Providers',
      description: 'Dynamic search, fetch, and evidence providers.',
      createButton: 'New Provider',
      createTitle: 'Add Research Provider',
      createDescription: 'Register a Tavily / SearXNG / Ollama Web provider.',
      create: 'Create',
      creating: 'Creating...',
      kind: 'Kind',
      name: 'Name',
      baseUrl: 'Base URL',
      apiKey: 'API key (stored encrypted)',
      test: 'Test',
      secretStored: 'Secret stored',
      healthy: 'Healthy',
      unhealthy: 'Unhealthy',
      loadFailed: 'Failed to load providers.',
      emptyTitle: 'No research providers',
      emptyDescription: 'Add a provider to start grounding chat with live evidence.',
      col: {
        name: 'Name',
        kind: 'Kind',
        baseUrl: 'Base URL',
        status: 'Status',
        secret: 'Secret',
        actions: 'Actions',
      },
      namePlaceholder: 'e.g., Tavily Production',
    },
    runs: {
      title: 'Research Runs',
      description: 'History of research runs triggered from chat.',
      loadFailed: 'Failed to load runs.',
      emptyTitle: 'No research runs yet',
      emptyDescription: 'Toggle research on in chat to produce evidence.',
    },
    evidence: {
      title: 'Live research evidence',
      empty: 'No evidence items returned.',
      noTitle: '(no title)',
      confidence: 'Confidence',
      warnings: 'Warnings',
      requestedModel: 'Requested model',
      toolsUsed: 'Tools',
    },
    results: {
      open: 'Search Results',
      title: 'Research Results',
      description:
        'Inspect the provider choice, fallback chain, evidence bundle, and research trace.',
      provider: 'Provider',
      selectionMode: 'Selection',
      selectionAuto: 'Auto',
      selectionExplicit: 'Explicit',
      fallbackUsed: 'Fallback used',
      query: 'Research query',
      evidenceCount: 'Evidence items',
      attempts: 'Provider attempts',
      trace: 'Research trace',
    },
  },
  workspaceActions: {
    title: 'Workspace Actions',
    description: 'Review and approve automated write actions before they execute.',
    approve: 'Approve',
    reject: 'Reject',
    cancel: 'Cancel',
    rejectTitle: 'Reject Action',
    rejectDesc: 'Provide an optional reason for rejecting this action.',
    rejectReasonPlaceholder: 'Reason (optional)',
    confirmReject: 'Confirm Reject',
    connector: 'Connector',
    rejectionReason: 'Rejection reason',
    pendingApproval: 'Pending Approval',
    executing: 'Executing',
    executed: 'Executed',
    failed: 'Failed',
    rejected: 'Rejected',
    noActions: 'No actions found',
    noActionsDesc: 'Automated write actions created by AI will appear here for your review.',
    loadFailed: 'Failed to load actions.',
    viewPayload: 'View payload',
    requestedAt: 'requested {value}',
    reviewedAt: 'reviewed {value}',
    executedAt: 'executed {value}',
    approved: 'Approved',
    expired: 'Expired',
    edited: 'Edited',
  },
  workspaceProviders: {
    catalog: {
      title: 'Workspace Provider Catalog',
      description: 'Browse supported workspace integrations.',
      loadFailed: 'Failed to load the provider catalog.',
      emptyTitle: 'No providers available',
      emptyDescription: 'No workspace providers are registered yet.',
      available: 'Available',
      comingSoon: 'Coming soon',
      objectTypes: 'object types',
      docs: 'Docs',
    },
    appConfigs: {
      title: 'Provider App Configurations',
      description: 'Register OAuth apps and credentials for workspace providers.',
      createButton: 'New Configuration',
      createTitle: 'Create provider app configuration',
      createDescription: 'Register OAuth credentials or a personal access token.',
      create: 'Create',
      creating: 'Creating...',
      editTitle: 'Edit provider app configuration',
      editDescription:
        'Update the configuration values and metadata for this provider. Leave secret fields blank to keep them unchanged.',
      editSecretHint:
        'Secret fields left empty will keep the previously stored value. Fill them only to rotate credentials.',
      save: 'Save',
      saving: 'Saving…',
      provider: 'Provider',
      providerPlaceholder: 'Select a provider...',
      name: 'Name',
      namePlaceholder: 'e.g. GitHub production app',
      authMode: 'Authentication mode',
      descriptionLabel: 'Description',
      descriptionPlaceholder: 'Optional notes about this configuration',
      test: 'Test',
      connect: 'Connect',
      testResult: 'Test result: {status} ({latency}ms)',
      secretStored: 'Secret stored',
      emptyTitle: 'No provider configurations yet',
      emptyDescription: 'Add your first provider credentials to enable workspace connectors.',
      loadFailed: 'Failed to load app configurations.',
      fields: {
        secret: '(secret)',
      },
      columns: {
        name: 'Name',
        provider: 'Provider',
        authMode: 'Auth',
        status: 'Status',
        secret: 'Secret',
        lastValidated: 'Last validated',
        actions: 'Actions',
      },
      errors: {
        nameRequired: 'A name is required.',
      },
    },
    oauthCallback: {
      exchangingTitle: 'Completing connection...',
      exchangingDescription: 'Exchanging the authorization code with the provider.',
      successTitle: 'Connected!',
      successDescription: 'Redirecting you back to the workspace...',
      successDescriptionNamed: '{name} connected. Redirecting you back...',
      errorTitle: 'Connection failed',
      errorUnknown: 'An unknown error occurred.',
    },
  },
  agent: {
    title: 'Desktop Agent',
    description: 'Manage connected desktop agents and terminal commands.',
    loading: 'Loading agent sessions...',
    loadFailed: 'Failed to load agent data.',
    noSessions: 'No active sessions',
    noSessionsDesc: 'Start the Claw desktop agent on your machine to connect.',
    noCommands: 'No commands',
    noCommandsDesc: 'Pending terminal commands will appear here.',
    noRepos: 'No repositories',
    noReposDesc: 'Repositories detected by the agent will appear here.',
    terminal: 'Terminal Commands',
    terminalDesc: 'Approve or reject terminal commands requested by the agent.',
    capabilities: 'Capability Queue',
    capabilitiesDesc:
      'Approve or reject capability invocations across filesystem, process, browser, and other classes.',
    capabilityClass: 'Class',
    capabilityOperation: 'Operation',
    blastRadius: 'Blast Radius',
    reversibility: 'Reversibility',
    riskScore: 'Risk Score',
    matchedPolicy: 'Matched Policy',
    activity: 'Agent Activity',
    activityDesc: 'Recent capability and recipe-run activity across all your devices.',
    autoApproved: 'Auto-approved',
    denied: 'Denied',
    rolledBack: 'Rolled Back',
    recipes: 'Recipes',
    recipesDesc: 'Multi-step automations that chain capability invocations together.',
    noRecipes: 'No recipes yet',
    noRecipesDesc: 'Create a recipe to automate multi-step workflows.',
    recipeRunDetail: 'Run Detail',
    recipeRunDetailDesc: 'Live progress of a recipe run.',
    runStatus: 'Run Status',
    cancelRun: 'Cancel Run',
    steps: 'Steps',
    marketplace: 'Recipe Marketplace',
    marketplaceDesc: 'Browse and install signed recipes published by the community.',
    noListings: 'No listings yet',
    noListingsDesc: 'When publishers ship signed recipes they appear here.',
    install: 'Install',
    activityMemory: 'Activity Memory',
    activityMemoryDesc: 'Cloud-synced activity entries opted in from your devices.',
    noActivity: 'No activity entries yet',
    noActivityDesc:
      'Activity logged on your devices appears here only after you opt-in to cloud sync.',
    repos: 'Repositories',
    reposDesc: 'repositories detected',
    pendingCommands: 'Pending Commands',
    pendingApproval: 'Pending Approval',
    recentCommands: 'Recent Commands',
    approve: 'Approve',
    reject: 'Reject',
    version: 'Version',
    commands: 'commands',
    files: 'files',
    dirty: 'Modified',
    connect: {
      title: 'Connect a device',
      approveDescription: 'Review the device details and scopes before approving.',
      scopesLabel: 'Permissions (scopes)',
      approveButton: 'Approve',
      denyButton: 'Cancel',
      successTitle: 'Device paired',
      successBody: 'You can close this tab and return to your terminal.',
      expiredTitle: 'Pairing link invalid or expired',
      expiredBody: 'Re-run `claw-agent login` to start a new pairing.',
      deniedTitle: 'Approval cancelled',
      deniedBody: 'No credentials were issued. You can close this tab.',
      accountMismatchTitle: 'Wrong account',
      accountMismatchBody: 'Sign in with the account you want to pair this device to.',
      deviceNamePlaceholder: 'e.g., My MacBook Pro',
    },
    rejectedByUser: 'Rejected by user',
  },
  discovery: {
    title: 'Model Discovery',
    description: 'Discover, classify, and approve new Ollama models dynamically.',
    searchPlaceholder: 'Search candidates...',
    filter: {
      status: 'Status',
      all: 'All',
      pending: 'Pending',
      approved: 'Approved',
      rejected: 'Rejected',
      imported: 'Imported',
      duplicate: 'Duplicate',
    },
    actions: {
      refresh: 'Run Discovery',
      dryRun: 'Dry Run',
      approve: 'Approve',
      reject: 'Reject',
    },
    runs: {
      title: 'Recent Discovery Runs',
      empty: 'No discovery runs yet. Click "Run Discovery" to begin.',
      discovered: 'discovered',
      imported: 'imported',
      skipped: 'skipped',
    },
    candidates: {
      title: 'Candidates',
      empty: {
        title: 'No candidates',
        description: 'Trigger a discovery run to find new models.',
      },
    },
    candidate: {
      size: 'Size',
      confidence: 'Confidence',
    },
    packs: {
      title: 'Hardware Packs',
      empty: 'No hardware packs configured.',
      install: 'Install Pack',
      noModelsYet: 'No models match this profile yet.',
    },
  },
  validation: {
    required: 'This field is required',
    invalidEmail: 'Please enter a valid email address',
    tooShort: 'Must be at least {min} characters',
    tooLong: 'Must be at most {max} characters',
    invalidUrl: 'Please enter a valid URL',
    fileTooLarge: 'File size exceeds the maximum allowed',
    invalidFileType: 'This file type is not supported',
  },
  toast: {
    loginSuccess: 'Login successful',
    loginFailed: 'Failed to login',
    logoutFailed: 'Failed to logout',
    sessionExpired: 'Session expired, please login again',
  },
  accessibility: {
    closeSidebar: 'Close sidebar',
    openSidebar: 'Open sidebar',
    toggleSidebar: 'Toggle sidebar',
    userMenu: 'User menu',
    closeDialog: 'Close dialog',
    openMenu: 'Open menu',
    search: 'Search',
    openSearch: 'Open search',
    closeSearch: 'Close search',
    navigation: 'Main navigation',
    notifications: 'Notifications',
    languageSelector: 'Select language',
    themeToggle: 'Toggle theme',
    resizeInput: 'Resize message input',
  },
  actions: {
    test: 'Test',
    testing: 'Testing...',
    sync: 'Sync',
    syncing: 'Syncing...',
    archive: 'Archive',
    unarchive: 'Unarchive',
    pin: 'Pin',
    unpin: 'Unpin',
    duplicate: 'Duplicate',
    copy: 'Copy',
    copied: 'Copied',
    copyToClipboard: 'Copy to clipboard',
    view: 'View',
    viewAll: 'View all',
    viewDetails: 'View details',
    download: 'Download',
    upload: 'Upload',
    refresh: 'Refresh',
    reset: 'Reset',
    apply: 'Apply',
    approve: 'Approve',
    approving: 'Approving...',
    reject: 'Reject',
    rejecting: 'Rejecting...',
    reload: 'Reload',
    reconnect: 'Reconnect',
    expand: 'Expand',
    collapse: 'Collapse',
    enable: 'Enable',
    disable: 'Disable',
    remove: 'Remove',
    add: 'Add',
    select: 'Select',
    selectAll: 'Select all',
    deselectAll: 'Deselect all',
    clear: 'Clear',
    submit: 'Submit',
    more: 'More',
    less: 'Less',
    showMore: 'Show more',
    showLess: 'Show less',
  },
  logs: {
    allLevels: 'All Levels',
    allActions: 'All Actions',
    allSeverities: 'All Severities',
    allMethods: 'All Methods',
    methodPlaceholder: 'Method',
    componentPlaceholder: 'Component...',
    actionPlaceholder: 'Action...',
    routePlaceholder: 'Route...',
    routeRegexPlaceholder: 'Route (regex)...',
    userIdPlaceholder: 'User ID...',
    messageContainsPlaceholder: 'Message contains...',
    servicePlaceholder: 'Service...',
    controllerPlaceholder: 'Controller...',
    entityTypePlaceholder: 'Entity type...',
    startDate: 'Start date',
    endDate: 'End date',
    fullTextSearch: 'Full-text search...',
    searchAllFields: 'Search across all fields...',
    avgLatency: 'Avg latency',
    errors: 'Errors',
    failedToLoadClient: 'Failed to load client logs',
    failedToLoadClientDesc: 'Unable to fetch client logs from the server',
    failedToLoadServer: 'Failed to load server logs',
    failedToLoadServerDesc: 'Unable to fetch server logs from the server',
    levelDistribution: 'Level distribution',
    loadingClient: 'Loading client logs...',
    loadingServer: 'Loading server logs...',
    noActionData: 'No action data',
    noClientLogs: 'No client logs',
    noClientLogsActivityDesc: 'No client log activity has been recorded yet',
    noComponentData: 'No component data',
    noServerLogs: 'No server logs',
    noServerLogsActivityDesc: 'No server log activity has been recorded yet',
    noServiceData: 'No service data',
    percentOfTotal: '% of total',
    topActions: 'Top actions',
    topComponents: 'Top components',
    topServices: 'Top services',
    totalLogs: 'Total logs',
  },
  gmail: {
    page: {
      title: 'Gmail',
      description: 'Browse and manage synced Gmail messages.',
      empty_title: 'No emails synced',
      empty_description:
        'No emails have been synced yet. Trigger a sync on your Gmail connector to load messages.',
      error_title: 'Unable to load emails',
      no_connector_title: 'No Gmail connector found',
      no_connector_description:
        'Connect a Gmail account in Workspace Connectors to start browsing your inbox.',
    },
    message: {
      from: 'From',
      to: 'To',
      date: 'Date',
      subject: 'Subject',
      reply: 'Reply',
      open_in_gmail: 'Open in Gmail',
      unread: 'Unread',
      attachments: 'Attachments ({count})',
      download: 'Download {name}',
      htmlIframeTitle: 'Email body',
      toggleHtml: 'Toggle HTML',
      showHtml: 'Show HTML',
      toggleImages: 'Toggle images',
      loadImages: 'Load images',
      imagesBlocked: 'Images blocked',
    },
    actions: {
      summarize: 'Summarize',
      draft_reply: 'Draft Reply',
      extract_tasks: 'Extract Action Items',
      send_email: 'Send Email',
      draft_sent: 'Draft created — review in Approvals',
      draft_failed: 'Failed to create draft',
    },
  },
  jira: {
    page: {
      title: 'Jira',
      description: 'Browse and manage synced Jira tickets.',
      empty_title: 'No tickets synced',
      empty_description:
        'No Jira tickets have been synced yet. Trigger a sync on your Jira connector to load tickets.',
      error_title: 'Unable to load tickets',
      no_connector_title: 'No Jira connector found',
      no_connector_description:
        'Connect a Jira account in Workspace Connectors to start browsing your tickets.',
    },
    ticket: {
      status: 'Status',
      priority: 'Priority',
      assignee: 'Assignee',
      reporter: 'Reporter',
      project: 'Project',
      sprint: 'Sprint',
      story_points: 'Story Points',
      due_date: 'Due',
      labels: 'Labels',
      issue_type: 'Type',
      open_in_jira: 'Open in Jira',
      unassigned: 'Unassigned',
      no_sprint: 'No sprint',
    },
    actions: {
      summarize: 'Summarize',
      write_comment: 'Write Comment',
      extract_tasks: 'Extract Tasks',
    },
  },
  source_control: {
    page: {
      title: 'Source Control',
      description: 'Browse pull requests from GitHub, GitLab, and Bitbucket.',
      empty_title: 'No pull requests synced',
      empty_description:
        'No pull requests have been synced yet. Trigger a sync on your source control connector to load PRs.',
      error_title: 'Unable to load pull requests',
      no_connector_title: 'No source control connector found',
      no_connector_description:
        'Connect GitHub, GitLab, or Bitbucket in Workspace Connectors to start browsing pull requests.',
    },
    pr: {
      author: 'Author',
      source_branch: 'From',
      target_branch: 'Into',
      reviewers: 'Reviewers',
      additions: 'Additions',
      deletions: 'Deletions',
      labels: 'Labels',
      draft: 'Draft',
      open_pr: 'Open PR',
      state_open: 'Open',
      state_closed: 'Closed',
      state_merged: 'Merged',
      review_approved: 'Approved',
      review_changes: 'Changes Requested',
      review_pending: 'Review Pending',
    },
    actions: {
      review: 'Review PR',
      summarize: 'Summarize',
      extract_tasks: 'Extract Tasks',
    },
  },
  slack: {
    page: {
      title: 'Slack',
      description: 'Browse and manage synced Slack messages.',
      empty_title: 'No messages synced',
      empty_description:
        'No Slack messages have been synced yet. Trigger a sync on your Slack connector to load messages.',
      error_title: 'Unable to load messages',
      no_connector_title: 'No Slack connector found',
      no_connector_description:
        'Connect a Slack workspace in Workspace Connectors to start browsing messages.',
    },
    message: {
      channel: 'Channel',
      sender: 'From',
      date: 'Date',
      thread_reply: 'Thread reply',
      open_in_slack: 'Open in Slack',
      reactions: 'Reactions',
    },
    actions: {
      summarize: 'Summarize',
      reply: 'Draft Reply',
      extract_tasks: 'Extract Action Items',
    },
  },
  confluence: {
    page: {
      title: 'Confluence',
      description: 'Browse and manage synced Confluence pages.',
      empty_title: 'No pages synced',
      empty_description:
        'No Confluence pages have been synced yet. Trigger a sync on your Confluence connector.',
      error_title: 'Unable to load pages',
      no_connector_title: 'No Confluence connector found',
      no_connector_description:
        'Connect a Confluence workspace in Workspace Connectors to start browsing pages.',
    },
    article: {
      space: 'Space',
      author: 'Author',
      modified_by: 'Modified by',
      version: 'Version',
      labels: 'Labels',
      parent: 'Parent',
      open_page: 'Open in Confluence',
    },
    actions: {
      summarize: 'Summarize',
      extract_tasks: 'Extract Action Items',
      write_comment: 'Write Comment',
    },
  },
  docs: {
    page: {
      title: 'Documents',
      description:
        'Browse and manage synced documents from Google Drive, OneDrive, and SharePoint.',
      empty_title: 'No documents synced',
      empty_description:
        'No documents have been synced yet. Trigger a sync on your Drive or SharePoint connector.',
      error_title: 'Unable to load documents',
      no_connector_title: 'No document connector found',
      no_connector_description:
        'Connect Google Drive, OneDrive, or SharePoint in Workspace Connectors to start browsing documents.',
    },
    file: {
      owner: 'Owner',
      modified_by: 'Modified by',
      size: 'Size',
      type: 'Type',
      open_file: 'Open file',
      shared_with: 'Shared with',
      path: 'Path',
    },
    actions: {
      summarize: 'Summarize',
      extract_tasks: 'Extract Action Items',
      draft_email: 'Draft Email',
    },
  },
  figma: {
    page: {
      title: 'Figma',
      description: 'Browse and manage synced Figma design files.',
      empty_title: 'No designs found',
      empty_description: 'No Figma design files have been synced yet.',
      error_title: 'Failed to load designs',
      no_connector_title: 'Figma not connected',
      no_connector_description: 'Connect your Figma workspace to browse designs.',
    },
    design: {
      team: 'Team',
      project: 'Project',
      modified_by: 'Modified by',
      components: 'Components',
      open_in_figma: 'Open in Figma',
      last_updated: 'Last updated',
    },
    actions: {
      summarize: 'Summarize Design',
      extract_components: 'Extract Components',
      draft_spec: 'Draft Spec',
    },
  },
  workflow: {
    page: {
      title: 'Cross-Workspace Workflows',
      description:
        'Select objects from multiple workspace providers and run AI actions on combined context.',
      empty_title: 'No objects found',
      empty_description: 'No workspace objects have been synced yet.',
      error_title: 'Failed to load objects',
    },
    object: {
      add: 'Add',
      remove: 'Remove',
      selected_count: 'objects selected',
      clear_all: 'Clear all',
    },
    actions: {
      summarize_all: 'Summarize All',
      extract_requirements: 'Extract Requirements',
      draft_prd: 'Draft PRD',
    },
  },
  gpuBadge: {
    cpuOnly: 'CPU only',
    noGpu: 'No GPU detected — click to view local models',
    vendor: {
      nvidia: 'NVIDIA',
      amd: 'AMD ROCm',
      metal: 'Metal',
      intel: 'Intel/Vulkan',
      unknown: 'GPU',
      cpu: 'CPU',
    },
  },
  localFrontier: {
    title: 'Local Frontier Models',
    subtitle:
      'Run frontier open-weight LLMs (Kimi K2, GLM-5.1, DeepSeek V3.2/V4) entirely on this machine.',
    loading: 'Loading frontier catalog…',
    catalogEmpty: 'No frontier models match your filters.',
    catalogError: 'Failed to load frontier catalog. Check that claw-llamacpp-service is running.',
    contextLength: 'tokens context',
    requiresRamGb: 'GB RAM',
    sourceLink: 'HuggingFace',
    actions: {
      download: 'Download',
      load: 'Load',
      unload: 'Unload',
      deleteWeights: 'Delete weights',
      configure: 'Configure runtime',
    },
    download: {
      start: 'Download',
      cancel: 'Cancel',
      retry: 'Retry',
    },
    compat: {
      fits: 'Fits your hardware',
      warns: 'Tight on hardware',
      refuses: 'Insufficient hardware',
    },
    qualityTier: {
      survival: 'Survival',
      balanced: 'Balanced',
      best: 'Best',
    },
    preflight: {
      RAM_INSUFFICIENT: 'Not enough RAM for this model.',
      DISK_INSUFFICIENT: 'Not enough free disk space (cannot be overridden).',
      GPU_INSUFFICIENT: 'No compatible GPU detected.',
      BINARY_NOT_INSTALLED: 'llama-server binary is not yet installed.',
      RUNTIME_INCOMPATIBLE: 'Installed runtime cannot run this model.',
    },
    override: {
      warning: 'Your hardware is below requirements. Override only if you understand the risk.',
      confirmTypeSize: 'Type the model size in GB to confirm override:',
    },
    delete: {
      confirm: 'Delete weights?',
      confirmTypePrompt: 'Type the model name (e.g. glm-5.1:Q4_K_M) to confirm deletion.',
    },
    hardware: {
      title: 'Hardware & Runtime',
      subtitle: 'Live snapshot of this machine and llama.cpp binary.',
      refresh: 'Refresh',
      ram: 'RAM',
      disk: 'Disk',
      cpu: 'CPU',
      gpu: 'GPU',
      binary: 'Binary',
      cores: 'cores',
      noGpu: 'No GPU detected',
      notInstalled: 'Not installed',
      loadedModel: 'Loaded model',
      noLoadedModel: 'None loaded',
    },
    filters: {
      category: 'Category',
      qualityTier: 'Quality tier',
      compatibleOnly: 'Compatible only',
      refreshCatalog: 'Refresh catalog',
      refreshing: 'Refreshing…',
      allCategories: 'All categories',
      allTiers: 'All tiers',
      categoryCoding: 'Coding',
      categoryReasoning: 'Reasoning',
      categoryThinking: 'Thinking',
      categoryGeneral: 'General',
      categoryFileGen: 'File generation',
    },
    downloads: {
      title: 'Active downloads',
      empty: 'No active or recent downloads.',
      cancel: 'Cancel',
      retry: 'Retry',
      remove: 'Dismiss',
      status: 'Status',
      bytes: 'Bytes',
      files: 'Files',
      rate: 'Rate',
      eta: 'ETA',
      unknown: 'Preparing…',
    },
    deleteDialog: {
      title: 'Delete weights',
      description: 'This permanently removes the downloaded weights from disk.',
      promptLabel: 'Type to confirm',
      placeholder: 'model:tag',
      cancel: 'Cancel',
      confirm: 'Delete weights',
      warning: 'Cannot be undone. You will need to re-download to use this model again.',
    },
    overrideDialog: {
      title: 'Override hardware preflight?',
      description: 'Your machine does not meet the recommended specs for this model.',
      reasonsTitle: 'Reasons:',
      cancel: 'Cancel',
      proceed: 'Download anyway',
    },
    configDialog: {
      title: 'Runtime configuration',
      description: 'Tune llama.cpp runtime parameters for the loaded model.',
      ngpuLayers: 'GPU layers',
      ngpuLayersHint: 'Number of layers to offload to GPU. Leave empty for auto.',
      ctxSize: 'Context size',
      ctxSizeHint: 'Maximum context window in tokens.',
      threads: 'CPU threads',
      threadsHint: 'CPU thread count. Leave empty for auto.',
      cpuMoe: 'CPU MoE',
      cpuMoeHint: 'Run mixture-of-experts layers on CPU only.',
      customArgs: 'Custom args',
      customArgsHint: 'Extra llama-server flags (allowlist enforced).',
      cancel: 'Cancel',
      save: 'Save',
    },
  },

  emailTemplates: {
    page: {
      title: 'Email Templates',
      description:
        'Reusable subject + body starting points for AI-drafted emails. {{placeholders}} are filled in when the template is used.',
      loading: 'Loading templates…',
      error: 'Could not load templates. Try refreshing.',
      empty: 'No templates yet. Create one to get started.',
      create: 'New template',
      edit: 'Edit',
      delete: 'Delete',
      deleting: 'Deleting…',
      defaultBadge: 'Default',
      subjectLabel: 'Subject',
    },
    dialog: {
      createTitle: 'Create template',
      editTitle: 'Edit template',
      nameLabel: 'Name',
      namePlaceholder: 'Follow-up email',
      subjectLabel: 'Subject',
      subjectPlaceholder: 'Following up on {{topic}}',
      bodyLabel: 'Body',
      bodyPlaceholder: 'Hi {{name}},\n\nJust circling back on {{topic}}…',
      defaultLabel: 'Use as default',
      save: 'Save',
      saving: 'Saving…',
      cancel: 'Cancel',
    },
  },

  inbox: {
    page: {
      title: 'Workspace Inbox',
      description:
        'Cross-provider feed of every recent workspace object — filter by provider, type, attention.',
      loading: 'Loading inbox…',
      loadingMore: 'Loading more…',
      loadMore: 'Load more',
      empty: 'No items match your filters.',
      error: 'Could not load inbox. Try refreshing.',
    },
    filter: {
      providers: 'Provider:',
      types: 'Type:',
      needsAttention: 'Needs attention',
      hasSuggestion: 'Has suggestion',
      reset: 'Reset filters',
    },
    row: {
      needsAttention: 'Needs attention',
      hasSuggestion: 'Has suggestion',
      mark: 'Mark needs attention',
      unmark: 'Clear attention',
      openExternal: 'Open',
      viewFile: 'View file',
    },
  },
  fileViewer: {
    loading: 'Loading file…',
    error: 'Could not load this file.',
    unsupported: 'Preview not available for this file type. Use Download to open it locally.',
    download: 'Download',
    close: 'Close',
  },
  search: {
    page: {
      title: 'Semantic Search',
      description: 'Search every workspace object you own — privacy-preserving local embeddings.',
      placeholder: 'Type a natural-language question…',
      submit: 'Search',
      searching: 'Searching…',
      reset: 'Reset',
      local: 'Powered by local embeddings ({model})',
      noResults: 'No matches found. Try different words.',
      error: 'Search failed. Try again.',
    },
  },
  digest: {
    page: {
      title: 'Digest',
      description: 'Your morning brief: what changed across every connected workspace.',
      loading: 'Loading digest…',
      error: 'Could not load digest.',
      noTodayDigest: 'No digest yet for today. Trigger one or wait for the cron tick.',
      today: "Today's digest",
      history: 'Previous digests',
      generatedAt: 'Generated {ts}',
      sectionsCount: '{n} sections',
      triggerDaily: 'Trigger daily digest',
      triggerWeekly: 'Trigger weekly digest',
      triggering: 'Generating…',
      preferenceHint: 'Daily delivery: {hour}:00 ({tz})',
    },
    section: {
      highlights: 'Highlights',
      actionItems: 'Action items',
    },
  },
  adminAutomation: {
    dismiss: 'Dismiss',
    retry: 'Retry',
    policies: {
      title: 'AI Action Policies',
      description:
        'Default-strict approval rules. System defaults can be deactivated but not deleted.',
      loading: 'Loading policies…',
      error: 'Could not load policies.',
      empty: 'No policies configured yet.',
      systemDefault: 'System default',
      priority: 'Priority {p}',
      providerRegex: 'Provider regex',
      actionKindRegex: 'Action kind regex',
      riskCeiling: 'Risk ceiling',
      delete: 'Delete',
      cannotDelete: 'System defaults cannot be deleted',
      toggleActive: 'Toggle active',
      toggleSucceeded: 'Policy updated.',
      toggleFailed: 'Could not update policy.',
      deleteSucceeded: 'Policy deleted.',
      deleteFailed: 'Could not delete policy.',
      mutationError: 'An error occurred while updating the policy.',
      addPolicy: 'Add policy',
      editPolicy: 'Edit policy',
      createTitle: 'Create policy',
      editTitle: 'Edit policy',
      createDescription: 'Define a new approval rule for AI-drafted workspace actions.',
      editDescription: 'Update this approval rule. The name cannot be changed.',
      createSucceeded: 'Policy created.',
      createFailed: 'Could not create policy.',
      updateSucceeded: 'Policy updated.',
      updateFailed: 'Could not update policy.',
      submit: 'Save policy',
      submitting: 'Saving…',
      nameLabel: 'Name',
      nameHelp: 'Lowercase kebab-case identifier (e.g. deny-pii).',
      descriptionLabel: 'Description',
      kindFieldLabel: 'Kind',
      requireReasonLabel: 'Require reason for HIGH/CRITICAL',
      isActiveLabel: 'Active',
      riskMaxScoreLabel: 'Maximum risk score (0–100)',
      priorityLabel: 'Priority (0–10000)',
      kindLabel: {
        DENY: 'Deny',
        ALLOW: 'Allow',
        AUTO_APPROVE: 'Auto-approve',
      },
      riskLabel: {
        LOW: 'Low',
        MEDIUM: 'Medium',
        HIGH: 'High',
        CRITICAL: 'Critical',
      },
    },
    rules: {
      title: 'Suggestion Trigger Rules',
      description:
        'Rules that turn raw provider events into draft suggestions. Edit, deactivate, or delete.',
      loading: 'Loading rules…',
      error: 'Could not load rules.',
      empty: 'No rules configured yet.',
      systemDefault: 'System default',
      priority: 'Priority {p}',
      eventType: 'Event type',
      actionKind: 'Action kind',
      providerRegex: 'Provider regex',
      contentRegex: 'Content regex',
      delete: 'Delete',
      cannotDelete: 'System defaults cannot be deleted',
      toggleActive: 'Toggle active',
      toggleSucceeded: 'Rule updated.',
      toggleFailed: 'Could not update rule.',
      deleteSucceeded: 'Rule deleted.',
      deleteFailed: 'Could not delete rule.',
      mutationError: 'An error occurred while updating the rule.',
      addRule: 'Add rule',
      editRule: 'Edit rule',
      createTitle: 'Create rule',
      editTitle: 'Edit rule',
      createDescription: 'Define when to draft a suggestion from a workspace event.',
      editDescription: 'Update this trigger rule. The name cannot be changed.',
      createSucceeded: 'Rule created.',
      createFailed: 'Could not create rule.',
      updateSucceeded: 'Rule updated.',
      updateFailed: 'Could not update rule.',
      submit: 'Save rule',
      submitting: 'Saving…',
      nameLabel: 'Name',
      nameHelp: 'Lowercase kebab-case identifier (e.g. github-pr-opened).',
      descriptionLabel: 'Description',
      eventTypeHelp: 'Event pattern such as workspace.webhook.received.',
      actionKindHelp: 'Action kind such as SUMMARIZE, DRAFT, REWRITE.',
      isActiveLabel: 'Active',
      priorityLabel: 'Priority (0–10000)',
    },
  },
  adminWebhooks: {
    page: {
      title: 'Webhook Deliveries',
      description: 'Inspect and replay incoming webhook deliveries from your providers.',
      loading: 'Loading deliveries…',
      error: 'Failed to load webhook deliveries.',
      empty: 'No webhook deliveries match your filters.',
    },
    filter: {
      providerPlaceholder: 'Filter by provider (e.g. GITHUB)',
      connectorPlaceholder: 'Filter by connector ID',
      signaturePlaceholder: 'Signature status',
      signatureAny: 'Any signature',
      signatureValid: 'Valid signature',
      signatureInvalid: 'Invalid signature',
      clear: 'Clear filters',
    },
    row: {
      deliveryId: 'Delivery ID',
      connector: 'Connector',
      bytes: 'Body bytes',
      processedAt: 'Processed at',
    },
    status: {
      accepted: 'Accepted',
      rejected: 'Rejected',
      idempotent: 'Idempotent',
    },
    replay: 'Replay',
    replaying: 'Replaying…',
    replaySucceeded: 'Webhook delivery replayed.',
    replayFailed: 'Could not replay webhook delivery.',
  },
  implHandoff: {
    page: {
      title: 'Coding Handoffs',
      description:
        'Approved IMPL_PROMPT actions delivered to chat threads, agent terminals, or clipboard.',
      loading: 'Loading handoffs…',
      error: 'Could not load handoffs.',
      empty: 'No handoffs yet. Approve an IMPL_PROMPT in the queue to start one.',
      openThread: 'Open chat thread →',
    },
    picker: {
      title: 'Send IMPL_PROMPT to…',
      description: 'Pick where to deliver the approved coding brief.',
      cancel: 'Cancel',
      CHAT: { hint: 'Open a fresh chat thread pre-loaded with the brief' },
      AGENT: { hint: 'Drop into the connected agent device terminal queue' },
      CLIPBOARD: { hint: 'Copy to clipboard for use in any external tool' },
    },
  },
  learned: {
    panel: {
      title: "What we've learned",
      subtitle: '{count} preferences',
      description:
        'Patterns derived from your approve / reject / edit decisions. Used to personalise future suggestions.',
      loading: 'Loading…',
      error: 'Could not load preferences.',
      empty: "We'll learn from your approvals — no preferences yet.",
    },
  },
};
