import type { Translations } from "./types";

export const en: Translations = {
  common: {
    save: "Save",
    saving: "Saving...",
    cancel: "Cancel",
    close: "Close",
    confirm: "Confirm",
    delete: "Delete",
    refresh: "Refresh",
    retry: "Retry",
    search: "Search...",
    loading: "Loading...",
    create: "Create",
    creating: "Creating...",
    set: "Set",
    replace: "Replace",
    clear: "Clear",
    live: "Live",
    off: "Off",
    enabled: "enabled",
    disabled: "disabled",
    active: "active",
    inactive: "inactive",
    unknown: "unknown",
    untitled: "Untitled",
    none: "None",
    form: "Form",
    noResults: "No results",
    of: "of",
    page: "Page",
    msgs: "msgs",
    tools: "tools",
    match: "match",
    other: "Other",
    configured: "configured",
    removed: "removed",
    failedToToggle: "Failed to toggle",
    failedToRemove: "Failed to remove",
    failedToReveal: "Failed to reveal",
    collapse: "Collapse",
    expand: "Expand",
    general: "General",
    messaging: "Messaging",
    gateway: "Gateway",
    gatewayHint:
      "Messaging platforms, the API server and webhooks are configured on the Channels page. These are gateway-wide settings (proxy/relay mode and the global allowlist).",
    pluginLoadFailed:
      "Could not load this plugin’s script. Check the Network tab (dashboard-plugins/…) and the server’s plugin path.",
    pluginNotRegistered:
      "The plugin’s script did not call register(), or the script errored. Open the browser console for details.",
  },

  app: {
    brand: "Hermes Agent",
    brandShort: "HA",
    closeNavigation: "Close navigation",
    closeModelTools: "Close model and tools",
    footer: {
      org: "Nous Research",
    },
    activeSessionsLabel: "Active Sessions:",
    gatewayStatusLabel: "Gateway Status:",
    gatewayStrip: {
      failed: "Start failed",
      off: "Off",
      running: "Running",
      starting: "Starting",
      stopped: "Stopped",
    },
    nav: {
      analytics: "Analytics",
      chat: "Chat",
      config: "Config",
      cron: "Cron",
      documentation: "Documentation",
      keys: "Keys",
      logs: "Logs",
      models: "Models",
      profiles: "Profiles",
      plugins: "Plugins",
      sessions: "Sessions",
      skills: "Skills",
    },
    modelToolsSheetSubtitle: "& tools",
    modelToolsSheetTitle: "Model",
    navigation: "Navigation",
    openDocumentation: "Open documentation in a new tab",
    openNavigation: "Open navigation",
    pluginNavSection: "Plugins",
    sessionsActiveCount: "{count} active",
    statusOverview: "Status overview",
    system: "System",
    webUi: "Web UI",
    managingProfile: "Managing profile",
    currentProfileOption: "this dashboard ({name})",
    managingProfileBanner:
      "Managing profile \u201c{name}\u201d \u2014 config, keys, skills, MCPs, model, and new chats apply to that profile.",
  },

  status: {
    actionFailed: "Action failed",
    actionFinished: "Finished",
    actions: "Actions",
    agent: "Agent",
    activeSessions: "Active Sessions",
    connected: "Connected",
    connectedPlatforms: "Connected Platforms",
    disconnected: "Disconnected",
    error: "Error",
    failed: "Failed",
    gateway: "Gateway",
    gatewayFailedToStart: "Gateway failed to start",
    lastUpdate: "Last update",
    noneRunning: "None",
    notRunning: "Not running",
    pid: "PID",
    platformDisconnected: "disconnected",
    platformError: "error",
    recentSessions: "Recent Sessions",
    restartGateway: "Restart Gateway",
    restartingGateway: "Restarting gateway…",
    running: "Running",
    runningRemote: "Running (remote)",
    startFailed: "Start failed",
    starting: "Starting",
    startedInBackground: "Started in background — check logs for progress",
    stopped: "Stopped",
    updateHermes: "Update Hermes",
    updatingHermes: "Updating Hermes…",
    waitingForOutput: "Waiting for output…",
  },

  sessions: {
    title: "Sessions",
    history: "History",
    overview: "Overview",
    searchPlaceholder: "Search message content...",
    noSessions: "No sessions yet",
    noMatch: "No sessions match your search",
    startConversation: "Start a conversation to see it here",
    noMessages: "No messages",
    untitledSession: "Untitled session",
    deleteSession: "Delete session",
    confirmDeleteTitle: "Delete session?",
    confirmDeleteMessage:
      "This permanently removes the conversation and all of its messages. This cannot be undone.",
    sessionDeleted: "Session deleted",
    failedToDelete: "Failed to delete session",
    deleteEmpty: "Delete empty",
    deleteEmptyConfirmTitle: "Delete empty sessions?",
    deleteEmptyConfirmMessage:
      "This permanently removes {count} sessions that have no messages. Active and archived sessions are skipped. This cannot be undone.",
    emptySessionsDeleted: "{count} empty sessions deleted",
    failedToDeleteEmpty: "Failed to delete empty sessions",
    selectSession: "Select session",
    selectAllOnPage: "Select all on this page",
    clearSelection: "Clear selection",
    selectedCount: "{count} selected",
    deleteSelected: "Delete {count}",
    deleteSelectedConfirmTitle: "Delete {count} sessions?",
    deleteSelectedConfirmMessage:
      "This permanently removes {count} selected sessions and all their messages. This cannot be undone.",
    selectedSessionsDeleted: "{count} sessions deleted",
    failedToDeleteSelected: "Failed to delete selected sessions",
    resumeInChat: "Resume in Chat",
    previousPage: "Previous page",
    nextPage: "Next page",
    roles: {
      user: "User",
      assistant: "Assistant",
      system: "System",
      tool: "Tool",
    },
  },

  analytics: {
    period: "Period:",
    totalTokens: "Total Tokens",
    totalSessions: "Total Sessions",
    apiCalls: "API Calls",
    dailyTokenUsage: "Daily Token Usage",
    dailyBreakdown: "Daily Breakdown",
    perModelBreakdown: "Per-Model Breakdown",
    topSkills: "Top Skills",
    skill: "Skill",
    loads: "Agent Loaded",
    edits: "Agent Managed",
    lastUsed: "Last Used",
    input: "Input",
    output: "Output",
    total: "Total",
    noUsageData: "No usage data for this period",
    startSession: "Start a session to see analytics here",
    date: "Date",
    model: "Model",
    tokens: "Tokens",
    perDayAvg: "/day avg",
    acrossModels: "across {count} models",
    inOut: "{input} in / {output} out",
  },

  models: {
    modelsUsed: "Models Used",
    estimatedCost: "Est. Cost",
    tokens: "tokens",
    sessions: "sessions",
    avgPerSession: "avg/session",
    apiCalls: "API calls",
    toolCalls: "tool calls",
    noModelsData: "No model usage data for this period",
    startSession: "Start a session to see model data here",
  },

  logs: {
    title: "Logs",
    autoRefresh: "Auto-refresh",
    file: "File",
    level: "Level",
    component: "Component",
    lines: "Lines",
    noLogLines: "No log lines found",
  },

  cron: {
    confirmDeleteMessage:
      "This removes the job from the schedule. This cannot be undone.",
    confirmDeleteTitle: "Delete scheduled job?",
    newJob: "New Cron Job",
    nameOptional: "Name (optional)",
    namePlaceholder: "e.g. Daily summary",
    prompt: "Prompt",
    promptPlaceholder: "What should the agent do on each run?",
    schedule: "Schedule (cron expression)",
    schedulePlaceholder: "0 9 * * *",
    scheduleMode: "Schedule",
    scheduleModes: {
      interval: "Every interval",
      daily: "Daily",
      weekly: "Weekly",
      monthly: "Monthly",
      once: "Once",
      custom: "Custom (cron expression)",
      intervalEvery: "Every",
      intervalUnit: "Unit",
      unitMinutes: "minutes",
      unitHours: "hours",
      unitDays: "days",
      timeOfDay: "Time of day",
      weekdays: "Days of week",
      weekdaysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
      dayOfMonth: "Day of month",
      onceAt: "Run at",
      customLabel: "Cron expression",
      customPlaceholder: "0 9 * * *",
      customHint:
        "Five-field cron expression (minute, hour, day, month, weekday).",
      preview: "Sends as",
      previewEmpty: "(incomplete)",
    },
    scheduleDescribe: {
      none: "—",
      everyMinutes: "Every {n} min",
      everyHours: "Every {n} h",
      everyDays: "Every {n} d",
      dailyAt: "Daily at {time}",
      weeklyAt: "Weekly on {days} at {time}",
      monthlyAt: "Monthly on the {day} at {time}",
      onceAt: "Once at {time}",
    },
    deliverTo: "Deliver to",
    scheduledJobs: "Scheduled Jobs",
    noJobs: "No cron jobs configured. Create one above.",
    last: "Last",
    next: "Next",
    pause: "Pause",
    resume: "Resume",
    triggerNow: "Trigger now",
    delivery: {
      local: "Local",
      telegram: "Telegram",
      discord: "Discord",
      slack: "Slack",
      email: "Email",
      needsHomeChannel: "set a home channel first",
      noneConfigured:
        "No messaging platforms configured. Set one up under Channels to deliver reports.",
    },
  },

  profiles: {
    newProfile: "New Profile",
    name: "Name",
    namePlaceholder: "e.g. coder, writer, etc.",
    nameRequired: "Name is required",
    nameRule:
      "Lowercase letters, digits, _ and - only; must start with a letter or digit; up to 64 characters.",
    invalidName: "Invalid profile name",
    cloneFrom: "Clone config from",
    cloneFromNone: "None (blank)",
    allProfiles: "Profiles",
    noProfiles: "No profiles found.",
    defaultBadge: "default",
    hasEnv: "env",
    model: "Model",
    skills: "Skills",
    rename: "Rename",
    editSoul: "Edit SOUL.md",
    soulSection: "SOUL.md (personality / system prompt)",
    soulPlaceholder: "# How this agent should behave…",
    saveSoul: "Save SOUL",
    soulSaved: "SOUL.md saved",
    openInTerminal: "Copy CLI command",
    commandCopied: "Copied to clipboard",
    copyFailed: "Could not copy",
    confirmDeleteTitle: "Delete profile?",
    confirmDeleteMessage:
      "This permanently deletes profile '{name}' — config, keys, memories, sessions, skills, cron jobs. Cannot be undone.",
    created: "Created",
    deleted: "Deleted",
    renamed: "Renamed",
    activeProfile: "Active profile",
    activeBadge: "active",
    setActive: "Set as active",
    activeSet: "Active profile set",
    gatewayRunning: "Gateway running",
    gatewayStopped: "Gateway stopped",
    gatewayRunningWarning:
      "This profile's gateway is running — it will be stopped.",
    aliasBadge: "alias",
    description: "Description",
    descriptionPlaceholder:
      "What is this profile good at? Used to route kanban tasks by role.",
    noDescription: "No description",
    editDescription: "Edit description",
    descriptionSaved: "Description saved",
    reviewBadge: "review",
    autoGenerate: "Auto-generate",
    generating: "Generating…",
    describeFailed: "Could not generate description",
    distribution: "Distribution",
    advancedOptions: "Advanced options",
    cloneAll: "Clone everything (memories, sessions, skills, state)",
    noSkillsOption: "Don't seed bundled skills",
    descriptionOptional: "Description (optional)",
    modelOptional: "Model (optional)",
    modelInherit: "Inherit from clone / default",
    modelLoading: "Loading models…",
    modelNone: "No authenticated providers — set a key first",
    editModel: "Change model",
    modelSaved: "Model updated",
    modelSelect: "Select a model",
    actions: "Actions",
  },

  pluginsPage: {
    contextEngineLabel: "Context engine",
    dashboardSlots: "Dashboard slots",
    disableRuntime: "Disable",
    enableAfterInstall: "Enable after install",
    enableRuntime: "Enable",
    forceReinstall: "Force reinstall (delete existing folder first)",
    headline:
      "Discover, install, enable, and update Hermes plugins (`hermes plugins` parity).",
    identifierLabel: "Git URL or owner/repo",
    inactive: "inactive",
    installBtn: "Install",
    installHeading: "Install from GitHub / Git URL",
    installHint: "Use owner/repo shorthand or a full https:// or git@ clone URL. For a plugin in a subdirectory, append the path: owner/repo/path/to/plugin (or <url>#path/to/plugin).",
    memoryProviderLabel: "Memory provider",
    missingEnvWarn: "Set these in Keys before the plugin can run:",
    noDashboardTab: "No dashboard tab",
    openTab: "Open",
    orphanHeading: "Dashboard-only extensions (no agent plugin.yaml match)",
    pluginListHeading: "Installed plugins",
    providerDefaults: "built-in / default",
    providersHeading: "Runtime provider plugins",
    providersHint:
      "Writes memory.provider (empty = built-in) and context.engine to config.yaml. Takes effect next session.",
    refreshDashboard: "Rescan dashboard extensions",
    removeConfirm: "Remove this plugin from ~/.hermes/plugins/?",
    removeHint: "Only user-installed plugins under ~/.hermes/plugins can be removed.",
    rescanHeading: "SPA plugin registry",
    rescanHint: "Rescan after adding files on disk so the dashboard sidebar picks up new manifests.",
    runtimeHeading: "Gateway runtime (YAML plugins)",
    saveProviders: "Save provider settings",
    savedProviders: "Provider settings saved.",
    sourceBadge: "Source",
    authRequired: "Auth required",
    authRequiredHint: "Run this command to authenticate:",
    updateGit: "Git pull",
    versionBadge: "Version",
    showInSidebar: "Show in sidebar",
    hideFromSidebar: "Hide from sidebar",
  },

  skills: {
    title: "Skills",
    searchPlaceholder: "Search skills and toolsets...",
    enabledOf: "{enabled}/{total} enabled",
    all: "All",
    categories: "Categories",
    filters: "Filters",
    noSkills: "No skills found. Skills are loaded from ~/.hermes/skills/",
    noSkillsMatch: "No skills match your search or filter.",
    skillCount: "{count} skill{s}",
    resultCount: "{count} result{s}",
    noDescription: "No description available.",
    toolsets: "Toolsets",
    toolsetLabel: "{name} toolset",
    noToolsetsMatch: "No toolsets match the search.",
    setupNeeded: "Setup needed",
    disabledForCli: "Disabled for CLI",
    more: "+{count} more",
    profileSelector: "Profile",
    currentProfile: "current ({name})",
    managingProfile:
      "Managing profile \u201c{name}\u201d — toggles apply to that profile, not this dashboard\u2019s.",
  },

  config: {
    configPath: "~/.hermes/config.yaml",
    filters: "Filters",
    sections: "Sections",
    exportConfig: "Export config as JSON",
    importConfig: "Import config from JSON",
    resetDefaults: "Reset to defaults",
    resetScopeTooltip: "Reset {scope} to defaults",
    confirmResetScope: "Reset all {scope} settings to their defaults? This only updates the form — changes aren't written to config.yaml until you press Save.",
    resetScopeToast: "{scope} reset to defaults — review and Save to persist",
    rawYaml: "Raw YAML Configuration",
    searchResults: "Search Results",
    fields: "field{s}",
    noFieldsMatch: 'No fields match "{query}"',
    configSaved: "Configuration saved",
    yamlConfigSaved: "YAML config saved",
    failedToSave: "Failed to save",
    failedToSaveYaml: "Failed to save YAML",
    failedToLoadRaw: "Failed to load raw config",
    configImported: "Config imported — review and save",
    invalidJson: "Invalid JSON file",
    categories: {
      general: "General",
      agent: "Agent",
      terminal: "Terminal",
      display: "Display",
      delegation: "Delegation",
      memory: "Memory",
      compression: "Compression",
      security: "Security",
      browser: "Browser",
      voice: "Voice",
      tts: "Text-to-Speech",
      stt: "Speech-to-Text",
      logging: "Logging",
      discord: "Discord",
      auxiliary: "Auxiliary",
    },
  },

  env: {
    changesNote: "Changes are saved to disk immediately. Active sessions pick up new keys automatically.",
    confirmClearMessage:
      "The stored value for this variable will be removed from your .env file. This cannot be undone from the UI.",
    confirmClearTitle: "Clear this key?",
    description: "Manage API keys and secrets stored in",
    hideAdvanced: "Hide Advanced",
    showAdvanced: "Show Advanced",
    showLess: "Show less",
    showMore: "Show more",
    llmProviders: "LLM Providers",
    providersConfigured: "{configured} of {total} providers configured",
    getKey: "Get key",
    notConfigured: "{count} not configured",
    notSet: "Not set",
    keysCount: "{count} key{s}",
    enterValue: "Enter value...",
    replaceCurrentValue: "Replace current value ({preview})",
    showValue: "Show real value",
    hideValue: "Hide value",
  },

  oauth: {
    title: "Provider Logins (OAuth)",
    providerLogins: "Provider Logins (OAuth)",
    description: "{connected} of {total} OAuth providers connected. Login flows currently run via the CLI; click Copy command and paste into a terminal to set up.",
    connected: "Connected",
    expired: "Expired",
    notConnected: "Not connected. Run {command} in a terminal.",
    runInTerminal: "in a terminal.",
    noProviders: "No OAuth-capable providers detected.",
    login: "Login",
    disconnect: "Disconnect",
    managedExternally: "Managed externally",
    copied: "Copied ✓",
    cli: "Copy",
    copyCliCommand: "Copy CLI command (for external / fallback)",
    connect: "Connect",
    sessionExpires: "Session expires in {time}",
    initiatingLogin: "Initiating login flow…",
    exchangingCode: "Exchanging code for tokens…",
    connectedClosing: "Connected! Closing…",
    loginFailed: "Login failed.",
    sessionExpired: "Session expired. Click Retry to start a new login.",
    reOpenAuth: "Re-open auth page",
    reOpenVerification: "Re-open verification page",
    submitCode: "Submit code",
    pasteCode: "Paste authorization code (with #state suffix is fine)",
    waitingAuth: "Waiting for you to authorize in the browser…",
    enterCodePrompt: "A new tab opened. Enter this code if prompted:",
    pkceStep1: "A new tab opened to claude.ai. Sign in and click Authorize.",
    pkceStep2: "Copy the authorization code shown after authorizing.",
    pkceStep3: "Paste it below and submit.",
    flowLabels: {
      pkce: "Browser login (PKCE)",
      device_code: "Device code",
      external: "External CLI",
    },
    expiresIn: "expires in {time}",
  },

  language: {
    switchTo: "Switch language",
  },

  theme: {
    title: "Theme",
    switchTheme: "Switch theme",
    fontTitle: "Font",
    fontDefault: "Theme default",
    fontDefaultHint: "Use the active theme's font",
    fontSans: "Sans",
    fontSerif: "Serif",
    fontMono: "Mono",
  },

  achievements: {
    hero: {
      kicker: "Agentic Gamerscore",
      title: "Hermes Achievements",
      subtitle:
        "Collectible Hermes badges earned from real session history. Known unfinished achievements are shown as Discovered; Secret achievements stay hidden until the first matching behavior appears.",
      scan_subtitle:
        "Scanning Hermes session history. First scan can take 5–10 seconds on large histories.",
    },
    actions: {
      rescan: "Rescan",
    },
    stats: {
      unlocked: "Unlocked",
      unlocked_hint: "earned badges",
      discovered: "Discovered",
      discovered_hint: "known, not earned yet",
      secrets: "Secrets",
      secrets_hint: "hidden until first signal",
      highest_tier: "Highest tier",
      highest_tier_hint: "Copper → Silver → Gold → Diamond → Olympian",
      latest: "Latest",
      latest_hint_empty: "run Hermes more",
      none_yet: "None yet",
    },
    state: {
      unlocked: "Unlocked",
      discovered: "Discovered",
      secret: "Secret",
    },
    tier: {
      target: "Target {tier}",
      hidden: "Hidden",
      complete: "Complete",
      objective: "Objective",
    },
    progress: {
      hidden: "hidden",
    },
    scan: {
      building_headline: "Building achievement profile…",
      building_detail:
        "Reading sessions, tool calls, model metadata, and unlock state.",
      starting_headline: "Starting achievement scan…",
      progress_detail:
        "Scanned {scanned} of {total} sessions · {pct}%. Badges unlock as more history streams in.",
      idle_detail:
        "Reading sessions, tool calls, model metadata, and unlock state. Badges appear here as they unlock.",
    },
    guide: {
      tiers_header: "Tiers",
      secret_header: "Secret achievements",
      secret_body:
        "Secrets hide their exact trigger. Once Hermes sees a related signal, the card becomes Discovered and shows its requirement.",
      scan_status_header: "Scan status",
      scan_status_body:
        "Hermes is scanning local history once, then cards will appear automatically. Nothing is stuck if this takes a few seconds.",
      what_scanned_header: "What is scanned",
      what_scanned_body:
        "Sessions, tool calls, model metadata, errors, achievements, and local unlock state.",
    },
    card: {
      share_title: "Share this achievement",
      share_label: "Share {name}",
      share_text: "Share",
      how_to_reveal: "How to reveal",
      what_counts: "What counts",
      evidence_label: "Evidence",
      evidence_session_fallback: "session",
      no_evidence: "No evidence yet",
    },
    latest: {
      header: "Recent unlocks",
    },
    empty: {
      no_secrets_header: "No hidden secrets left in this scan.",
      no_secrets_body:
        "Clue: secrets usually start from unusual failure or power-user patterns — port conflicts, permission walls, missing env vars, YAML mistakes, Docker collisions, rollback/checkpoint use, cache hits, or tiny fixes after lots of red text.",
    },
    filters: {
      all_categories: "All",
      visibility_all: "all",
      visibility_unlocked: "unlocked",
      visibility_discovered: "discovered",
      visibility_secret: "secret",
    },
    share: {
      dialog_label: "Share achievement",
      header: "Share: {name}",
      close: "Close",
      rendering: "Rendering…",
      card_alt: "{name} share card",
      error_generic: "Something went wrong.",
      x_title: "Opens X with a pre-filled post",
      x_button: "Share on X",
      copy_title: "Copy the image to paste into your post",
      copy_button: "Copy image",
      copied: "Copied ✓",
      download_button: "Download PNG",
      hint:
        "Share on X opens a pre-filled post in a new tab. Click Copy image first if you want the 1200×630 badge attached — X lets you paste it right into the tweet composer. Download PNG saves the file for use anywhere.",
      clipboard_unsupported:
        "Clipboard image copy not supported in this browser — use Download instead.",
      tweet_text: "Just unlocked {tier_part}\"{name}\" in Hermes Agent ☤",
    },
  },

  kanban: {
    loading: "Loading Kanban board…",
    loadFailed: "Failed to load Kanban board: ",
    loadFailedHint:
      "The backend auto-creates kanban.db on first read. If this persists, check the dashboard logs.",
    board: "Board",
    newBoard: "+ New board",
    newBoardTitle: "New board",
    newBoardDescription:
      "Boards let you separate unrelated streams of work — one per project, repo, or domain. Workers on one board never see another board's tasks.",
    slug: "Slug",
    slugHint: "— lowercase, hyphens, e.g. atm10-server",
    displayName: "Display name",
    displayNameHint: "(optional)",
    description: "Description",
    descriptionHint: "(optional)",
    icon: "Icon",
    iconHint: "(single character or emoji)",
    switchAfterCreate: "Switch to this board after creating it",
    cancel: "Cancel",
    creating: "Creating…",
    createBoard: "Create board",
    search: "Search",
    filterCards: "Filter cards…",
    tenant: "Tenant",
    allTenants: "All tenants",
    assignee: "Assignee",
    allProfiles: "All profiles",
    showArchived: "Show archived",
    lanesByProfile: "Lanes by profile",
    nudgeDispatcher: "Nudge dispatcher",
    refresh: "Refresh",
    selected: "selected",
    complete: "Complete",
    archive: "Archive",
    apply: "Apply",
    clear: "Clear",
    createTask: "Create task in this column",
    noTasks: "— no tasks —",
    unassigned: "unassigned",
    needsAssignee: "Needs assignee",
    needsAssigneeHint:
      "Dependencies are satisfied, but the dispatcher skips this task until you assign a profile.",
    untitled: "(untitled)",
    loadingDetail: "Loading…",
    addComment: "Add a comment… (Enter to submit)",
    comment: "Comment",
    status: "Status",
    workspace: "Workspace",
    skills: "Skills",
    createdBy: "Created by",
    result: "Result",
    comments: "Comments",
    events: "Events",
    runHistory: "Run history",
    workerLog: "Worker log",
    loadingLog: "Loading log…",
    noWorkerLog:
      "— no worker log yet (task hasn't spawned or log was rotated away) —",
    noDescription: "— no description —",
    noComments: "— no comments —",
    edit: "edit",
    save: "Save",
    dependencies: "Dependencies",
    parents: "Parents:",
    children: "Children:",
    none: "none",
    addParent: "— add parent —",
    addChild: "— add child —",
    removeDependency: "Remove dependency",
    block: "Block",
    unblock: "Unblock",
    notifyHomeChannels: "Notify home channels",
    diagnostics: "Diagnostics",
    hide: "Hide",
    show: "Show",
    attention: "Attention",
    tasksNeedAttention: "tasks need attention",
    taskNeedsAttention: "1 task needs attention",
    diagnostic: "diagnostic",
    open: "Open",
    close: "Close (Esc)",
    reassignTo: "Reassign to:",
    copied: "Copied",
    copyCommand: "Copy command to clipboard",
    reclaim: "Reclaim",
    reassign: "Reassign",
    renderingError: "Kanban tab hit a rendering error",
    reloadView: "Reload view",
    wsAuthFailed:
      "WebSocket auth failed — reload the page to refresh the session token.",
    markDone: "Mark {n} task(s) as done?",
    markArchived: "Archive {n} task(s)?",
    warning: "Warning",
    phantomIds: "Phantom ids:",
    active: "active",
    ended: "ended",
    noProfile: "(no profile)",
    showAllAttempts: "Show all attempts",
    sendingUpdates: "Sending updates to",
    sendNotifications: "Send completed / blocked / gave_up notifications to",
    archiveBoardConfirm:
      "Archive board '{name}'? It will be moved to boards/_archived/ so you can recover it later. Tasks on this board will no longer appear anywhere in the UI.",
    archiveBoardTitle: "Archive this board",
    boardSwitcherHint: "Boards let you separate unrelated streams of work",
    taskCreatedWarning: "Task created, but: ",
    moveFailed: "Move failed: ",
    bulkFailed: "Bulk: ",
    completionBlockedHallucination: "⚠ Completion blocked — phantom card ids",
    suspectedHallucinatedReferences: "⚠ Prose referenced phantom card ids",
    pickProfileFirst: "Pick a profile first.",
    unblockedMessage: "Unblocked {id}. Task is ready for the next tick.",
    unblockFailed: "Unblock failed: ",
    reclaimedMessage: "Reclaimed {id}. Task is back to ready.",
    reclaimFailed: "Reclaim failed: ",
    reassignedMessage: "Reassigned {id} to {profile}.",
    reassignFailed: "Reassign failed: ",
    selectForBulk: "Select for bulk actions",
    clickToEdit: "Click to edit",
    clickToEditAssignee: "Click to edit assignee",
    emptyAssignee: "(empty = unassign)",
    columnLabels: {
      triage: "Triage",
      todo: "Todo",
      scheduled: "Scheduled",
      ready: "Ready",
      running: "In Progress",
      blocked: "Blocked",
      done: "Done",
      archived: "Archived",
    },
    columnHelp: {
      triage: "Raw ideas — a specifier will flesh out the spec",
      todo: "Waiting on dependencies or unassigned",
      scheduled: "Waiting on a known time delay or scheduled follow-up",
      ready: "Dependencies satisfied; assign a profile to dispatch",
      running: "Claimed by a worker — in-flight",
      blocked: "Worker asked for human input",
      done: "Completed",
      archived: "Archived",
    },
    confirmDone:
      "Mark this task as done? The worker's claim is released and dependent children become ready.",
    confirmArchive:
      "Archive this task? It disappears from the default board view.",
    confirmBlocked:
      "Mark this task as blocked? The worker's claim is released.",
    confirmScheduled:
      "Move this task to Scheduled? Use this for known time delays rather than human blockers.",
    completionSummary:
      "Completion summary for {label}. This is stored as the task result.",
    completionSummaryRequired:
      "Completion summary is required before marking a task done.",
    triagePlaceholder: "Rough idea — AI will spec it…",
    taskTitlePlaceholder: "New task title…",
    specifier: "specifier",
    assigneePlaceholder: "assignee",
    priority: "Priority",
    skillsPlaceholder:
      "skills (optional, comma-separated): translation, github-code-review",
    noParent: "— no parent —",
    workspacePathDir: "workspace path (required, e.g. ~/projects/my-app)",
    workspacePathOptional:
      "workspace path (optional, derived from assignee if blank)",
    logTruncated: "(showing last 100 KB — full log at ",
    logAt: ")",
  },
};
