export const en = {
  app: {
    sectionWorkspace: "workspace",
    sectionObserve: "observe",
    sectionConfigure: "configure",
    tabChat: "Chat",
    tabPlans: "Plans",
    tabSessions: "Sessions",
    tabOverview: "Overview",
    tabUsage: "Usage",
    tabSystem: "System",
    tabSemantic: "Semantic",
    tabTools: "Tools",
    tabPermissions: "Permissions",
    tabMcp: "MCP",
    tabSkills: "Skills",
    tabMemory: "Memory",
    tabHooks: "Hooks",
    tabSettings: "Settings",
    sectionChanges: "Changes",
    tabChanges: "Changes",
    footer: "127.0.0.1 only · token-gated",
    themeToggle: "Toggle theme",
    themeLight: "Light",
    themeDark: "Dark",
  },
  changes: {
    chatPlaceholder: "Ask about your code...",
    chatCommentSummaryPlaceholder: "Summarize comments...",
    chatWelcome: "Changes — ask questions about your project files.",
    chatSend: "Send",
    viewerPlaceholder: "Select a file to view",
    treeEmpty: "(empty)",
    tabClose: "Close tab",
    newConversation: "New",
    clearConversation: "Clear",
    newTitle: "/new — wipe conversation context",
    clearTitle: "/clear — wipe visible scrollback",
    newConfirmBusy: "A turn is in flight. Abort and start a new conversation?",
    newConfirm: "Clear current conversation and start fresh?",
    newToast: "new conversation",
    clearToast: "scrollback cleared",
    newFailed: "/new failed: {error}",
    clearFailed: "/clear failed: {error}",
    chatSendBtn: "Send",
    fileTreeTitle: "Files",
    fileSearchPlaceholder: "Search files...",
    codeViewerTitle: "Code Viewer",
    chatPanelTitle: "Chat",
    loadingFiles: "Loading project files…",
    review: "Review",
    allFiles: "All Files",
    changes: "changes",
    commentLabel: "Commenting on line",
    commentPlaceholder: "Add a comment…",
    commentCancel: "Cancel",
    commentSubmit: "Comment",
    commentLine: "Line",
    commentEdit: "Edit",
    commentDelete: "Delete",
    diffSourceGit: "Git changes",
    diffSourceSession: "Previous session",
    diffSourceCheckpoint: "Checkpoint",
    checkpointEmpty: "No checkpoints in this workspace yet.",
    restoreBtn: "Restore",
    restoreConfirm: 'Restore "{name}"? This will overwrite current files.',
    deleteBtn: "Delete",
    deleteConfirm: 'Delete checkpoint "{name}"? Snapshot will be removed, files stay unchanged.',
    createBtn: "Snapshot",
    createPlaceholder: "name for snapshot…",
    backToList: "back to list",
    reviewEmpty: "No pending reviews.",
    diffStyleUnified: "Unified",
    diffStyleSplit: "Split",
    expandAll: "Expand all",
    collapseAll: "Collapse all",
    createFailed: "create failed",
    restoreFailed: "restore failed",
    deleteFailed: "delete failed",
  },
  common: {
    loading: "loading…",
    loadingFailed: "{name} failed: {error}",
    back: "← back",
    save: "Save",
    remove: "remove",
    cancel: "Cancel",
    delete: "Delete",
    add: "Add",
    confirm: "Confirm",
    noData: "No {name} yet.",
    all: "all",
    yes: "yes",
    no: "no",
    on: "ON",
    off: "off",
    enabled: "enabled",
    disabled: "disabled",
  },
  settings: {
    title: "Settings",
    loading: "loading settings…",
    saved: "saved: {fields}",
    sectionApi: "DeepSeek API",
    apiKey: "API key",
    notSet: "(not set)",
    replace: "replace",
    pasteKey: "paste a fresh sk-… token",
    saveKey: "Save key",
    baseUrl: "base url",
    baseUrlPlaceholder: "https://api.deepseek.com (default)",
    sectionDefaults: "Defaults",
    preset: "preset",
    presetAuto: "auto — flash → pro on hard turns",
    presetFlash: "flash — always flash, no auto-escalate",
    presetPro: "pro — always pro",
    appliesNextTurn: "applies next turn",
    effort: "effort",
    effortMax: "max (default — best)",
    effortHigh: "high (cheaper / faster)",
    webSearch: "web search",
    webSearchNote: "web_fetch + web_search tools",
    sectionCompute: "Compute",
    proNext: "/pro one-shot",
    proArm: "Arm for next turn",
    proArmed: "Armed — disarms after next turn",
    proNextNote: "next turn runs on deepseek-v4-pro, then auto-disarms",
    sectionBudget: "Budget",
    budgetOf: "of",
    budgetSetCap: "set a cap",
    budgetCustom: "custom",
    budgetBumpHint: "bump the cap to keep going",
    budgetClear: "Clear cap",
    budgetIdleLine: "warns at 80% · refuses past 100%",
    budgetWarnLine: "approaching cap — loop will refuse past 100%",
    budgetRefusing: "cap exhausted — next turn refused until bumped or cleared",
    sectionLoop: "Loop",
    loopIdleHint: "Auto-resubmit a prompt on a fixed interval.",
    loopCostHint: "Each iteration costs ~{cost} (last turn).",
    loopInterval: "interval",
    loopCustom: "custom",
    loopRangeError: "interval must fall in 5s..6h",
    loopPrompt: "prompt",
    loopPromptPlaceholder: "e.g. check the deploy status and report any errors",
    loopStart: "Start loop",
    loopStop: "Stop",
    loopRunning: "running",
    loopIter: "iter {iter}",
    loopFiresIn: "fires in {remaining}",
    sectionSkills: "Skills",
    skillPaths: "skill paths",
    skillPathsPlaceholder: "/path/to/skills-a, /path/to/skills-b",
    skillPathsNote: "comma-separated · next /new or new session",
    sectionRuntime: "Runtime",
    activeModel: "active model",
    modelPricingLine: "${hit} hit · ${miss} miss · ${out} out  per 1M tok",
    editMode: "edit mode",
    editModeNote: "switch from the Chat tab header",
    sectionLanguage: "Language",
    language: "language",
    langEn: "English",
    langZhCn: "简体中文",
  },
  chat: {
    modeMirror: "TUI mirror",
    modeView: "session view",
    placeholder: "Type a prompt — Enter sends, Shift+Enter for a newline · / @ for pickers",
    placeholderBusy: "wait for the current turn to finish…",
    send: "Send",
    new: "New",
    clear: "Clear",
    newTitle: "/new — wipe conversation context (loop log + scrollback)",
    clearTitle: "/clear — wipe just visible scrollback (context kept)",
    noConversation: "No conversation yet. Send a prompt below to begin.",
    newConfirmBusy: "A turn is in flight. Abort and start a new conversation?",
    newConfirm: "Clear current conversation and start fresh?",
    newToast: "new conversation",
    clearToast: "scrollback cleared",
    newFailed: "/new failed: {error}",
    clearFailed: "/clear failed: {error}",
    eventStreamError: "event stream interrupted — reconnecting…",
    semanticBanner: "Semantic search isn't enabled for this project.",
    semanticBannerDesc:
      'Build the index once and the model can find code by meaning ("where do we handle auth failures?") instead of grep on exact strings.',
    semanticBannerBtn: "Build it →",
    semanticBannerDismiss: "dismiss (don't show again)",
    slashCommands: "slash commands",
    projectFiles: "project files",
    effortTitle: "reasoning_effort — applies next turn",
    effortMaxTitle: "max (default — best quality)",
    effortHighTitle: "high (cheaper / faster)",
    presetTitle: "preset — model commitment",
    presetAutoTitle:
      "auto — flash baseline; auto-escalates to pro on hard turns (NEEDS_PRO / failure threshold)",
    presetFlashTitle:
      "flash — always flash; no auto-escalate. /pro still works for one-shot manual",
    presetProTitle:
      "pro — always pro; ~3× flash cost (5/31 discount). Locks in on hard architecture work.",
    editGateTitle: "edit gate — Shift+Tab cycles in TUI",
    editReviewTitle: "review — both edits and non-allowlisted shell ask first",
    editAutoTitle: "auto — edits auto-apply, shell still asks",
    editYoloTitle: "yolo — edits AND shell auto-run, allowlist bypassed",
    railSession: "Session",
    railTurns: "turns",
    railPromptTok: "prompt tok",
    railCost: "cost",
    railCacheHit: "cache hit",
    railToolBudget: "Tool budget",
    railSpend: "spend",
    railActivePlan: "Active plan",
    railProgress: "progress",
    statusModel: "model",
    statusCtx: "ctx",
    statusCache: "cache",
    statusTurn: "turn",
    statusSession: "session",
    statusBalance: "balance",
    statusTurns: "{count} turn{s}",
    waitingStats: "· · ·  waiting for live stats",
    inflightPhase: "{phase}",
    inflightRunning: "running",
    inflightThinking: "thinking",
    inflightStreaming: "streaming",
    inflightWaiting: "waiting",
    inflightReasoning: "reasoning {count} ch",
    inflightOut: "out {count} ch",
    abortBtn: "Abort (Esc)",
    confirmBtn: "Apply (y)",
    rejectBtn: "Reject (n)",
    applyRestBtn: "Apply rest (a)",
    flipAutoBtn: "Flip to AUTO (A)",
  },
  overview: {
    loading: "loading overview…",
    failed: "overview failed: {error}",
    standaloneTitle: "Standalone mode",
    standaloneDesc:
      "Read-only disk view. Start /dashboard from inside carboncode code for live session state, MCP, and tools.",
    cockpit: "Cockpit",
    balance: "balance",
    tokens7d: "tokens · 7d",
    cacheHit: "cache hit",
    toolCalls24h: "tool calls · 24h",
    budget: "budget",
    currentSession: "current session",
    noSession: "No live session — /dashboard from inside carboncode code to attach.",
    promptTok: "prompt tok",
    completionTok: "completion tok",
    cost: "cost",
    costTrend: "cost · 14 day",
    noUsageYet: "no usage yet",
    dayAvg: "/day avg",
    recentPlans: "recent plans",
    noPlans: "No plans yet — submit one with submit_plan.",
    toolActivity: "tool activity",
    noToolCalls: "No tool calls yet.",
    toolsLoaded: "tools loaded",
    mcpServers: "mcp servers",
    editMode: "edit mode",
    version: "Carbon Code",
    workingDir: "Working directory",
    projectRoot: "project root",
    noPriorData: "no prior data",
    stable: "— stable",
    vsPrior: "{arrow} {pct}% vs prior",
    active: "active",
    allUp: "all up",
    yoloWarning: "all prompts bypassed",
    checking: "checking",
    latest: "latest",
  },
  usage: {
    loading: "loading usage…",
    failed: "usage failed: {error}",
    records: "{count} records",
    dailyUsage: "Daily usage",
    dailyMeta: "cost · cache saved · turns",
    noData: "No usage data yet — run a turn in carboncode chat / code / run and refresh.",
    windows: "Rolling windows",
    colWindow: "window",
    colTurns: "turns",
    colCacheHit: "cache hit",
    colCost: "cost (USD)",
    colCacheSaved: "cache saved",
    colVsClaude: "vs Claude",
    colSaved: "saved",
    axisTime: "time",
    axisUsd: "USD",
    axisTurns: "turns",
    seriesCost: "cost",
    seriesCacheSaved: "cache saved",
    seriesTurns: "turns",
    mostUsed: "Most used models",
    colModel: "model",
  },
  sessions: {
    loading: "loading sessions…",
    failed: "sessions failed: {error}",
    noSessions: "No saved sessions yet.",
    filterPlaceholder: "filter sessions",
    msgs: "msgs",
    pickHint: "Pick a session on the left to read its transcript.",
    resumeTitle: "Resume in TUI",
    resumeDesc:
      "Mid-session swap requires a restart so the message log can rewind cleanly. Quit your current session, then run:",
    loadingTranscript: "loading transcript…",
    emptyTranscript: "empty transcript.",
    messages: "{count} message{s}",
    newBtn: "New session",
    newHint: "Archive the current conversation and start a fresh one",
    switchBtn: "Switch to this session",
    deleteBtn: "Delete",
    deleteConfirm:
      'Delete session "{name}"? This removes the transcript file and cannot be undone.',
    cantDeleteActive: "Switch to a different session before deleting this one.",
    attachRequired:
      "Live session operations need an attached CLI session. Launch via carboncode chat or open the dashboard from inside a TUI session.",
    activeChip: "active",
    activePill: "active",
  },
  tools: {
    loading: "loading tools…",
    failed: "tools failed: {error}",
    noTools: "No tools registered.",
    planMode: "plan mode — writes gated",
    colTool: "tool",
    colFlags: "flags",
    colDesc: "description",
    readOnly: "read-only",
    write: "write",
    flat: "flat",
    desc: {
      web_search:
        "Search the public web. Returns ranked results with title, url, and snippet. Call this when the answer depends on current state — events, prices, releases, real-world status.",
      web_fetch:
        "Download a URL and return its visible text content (scripts/styles/nav stripped). Use after web_search when a snippet isn't enough.",
      run_command:
        "Run a shell command in the project root; returns combined stdout+stderr. Allowlisted read-only commands run immediately; mutations are gated by user confirmation.",
      run_background:
        "Spawn a long-running process and detach. Returns a job id for tailing logs, waiting for completion, or killing. Use for dev servers, watchers, and one-shot long jobs.",
      job_output:
        "Read the latest output of a background job. Returns the tail of the buffer and tells you whether the job is still running.",
      wait_for_job:
        "Block server-side until a background job finishes, bounded by timeout. Use instead of polling job_output in a loop.",
      stop_job:
        "Stop a background job. SIGTERM first, SIGKILL after a grace period. Safe to call on an already-exited job.",
      list_jobs:
        "List every background job started this session — running and exited — with id, command, pid, and status.",
      remember:
        "Save a memory for future sessions. Use when the user states a preference, corrects your approach, shares a non-obvious fact, or asks you to remember something.",
      forget:
        "Delete a memory file and remove it from MEMORY.md. Use when the user asks to forget something or a remembered fact is now wrong.",
      recall_memory:
        "Read the full body of a memory file when its one-line summary isn't enough detail.",
      read_file:
        "Read a file under the sandbox root. Supports head/tail/range scoping to save context. Auto-returns a preview for files over 200 lines.",
      list_directory:
        "List entries in a directory. Returns one line per entry, marking directories with a trailing slash.",
      directory_tree:
        "Recursively list entries in a directory as an indented tree. Budget-aware with auto-collapse for large subtrees.",
      search_files:
        "Find files whose NAME matches a substring or regex. Case-insensitive. Skips dependency/build directories by default.",
      search_content:
        "Recursively grep file CONTENTS for a substring or regex. Returns matches in path:line:text format. The right tool for finding references.",
      glob: "List files matching a glob pattern, sorted by mtime. Default limit 200, max 1000. Skips node_modules/.git/dist by default.",
      get_file_info: "Stat a path under the sandbox root. Returns type, size in bytes, and mtime.",
      write_file:
        "Create or overwrite a file with the given content. Parent directories are created as needed.",
      edit_file:
        "Apply a SEARCH/REPLACE edit to an existing file. The search must match exactly and be unique in the file.",
      multi_edit:
        "Apply N SEARCH/REPLACE edits across one or more files atomically. If any edit fails, no files are written.",
      create_directory: "Create a directory (and any missing parents) under the sandbox root.",
      move_file: "Rename or move a file or directory under the sandbox root.",
      delete_file:
        "Delete one file under the sandbox root. Refuses directories — use delete_directory for those.",
      delete_directory:
        "Recursively delete a directory under the sandbox root. Pass recursive:false to refuse non-empty directories.",
      copy_file:
        "Copy a file or directory under the sandbox root. Refuses to overwrite an existing destination.",
      submit_plan:
        "Submit one concrete plan for a review gate. Use for multi-file refactors, architecture changes, or anything expensive to undo.",
      mark_step_complete:
        "Mark one step of the approved plan as done. Call exactly once after finishing each step.",
      revise_plan:
        "Surgically replace the remaining steps of an in-flight plan. Done steps are never touched.",
      run_skill:
        "Invoke a playbook from the Skills index. Pass the bare skill name. Subagent-tagged skills spawn an isolated subagent.",
      spawn_subagent:
        "Spawn an isolated subagent for a self-contained subtask. Use for parallel fan-out or when the work needs many file reads.",
      todo_write:
        "In-session task tracker for multi-step work. Replaces the entire list every call. No approval gate or file writes.",
      ask_choice:
        "Present 2-6 alternatives to the user. Use when the user asks for options or you need a preference decision.",
      create_skill:
        "Scaffold a new skill the user can invoke later via /skill. Supports inline and subagent run modes.",
      add_mcp_server:
        "Register a new MCP server in the user's config. Takes effect on the next session. Supports stdio, SSE, and streamable-http.",
    },
  },
  permissions: {
    loading: "loading permissions…",
    failed: "permissions failed: {error}",
    yoloTitle: "YOLO mode",
    yoloDesc:
      "Every shell command auto-runs, allowlist bypassed. Switch back with /mode review in the TUI.",
    project: "project",
    builtin: "builtin",
    addPrefix: "add a prefix",
    addPlaceholder: 'e.g. "npm run build" or "deploy.sh"',
    clearAll: "Clear all",
    alreadyIn: "{prefix} already in list",
    added: "added: {prefix}",
    removed: "removed: {prefix}",
    cleared: "cleared {count} entr{y}",
    removeConfirm: 'Remove "{prefix}" from this project\'s allowlist?',
    clearConfirm: "Wipe every project allowlist entry? Builtin entries are unaffected.",
    projectAllowlist: "Project allowlist · {count}",
    nothingStored: "Nothing stored yet for this project.",
    colNum: "#",
    colPrefix: "prefix",
    builtinTitle: "Builtin · {count} · read-only",
    standaloneWarning:
      "Mutations require /dashboard from inside an active carboncode code session — standalone carboncode dashboard can't tell which project's allowlist to edit.",
  },
  mcp: {
    loading: "loading MCP…",
    servers: "MCP servers · {count} bridged",
    all: "all",
    live: "live",
    unbridged: "unbridged",
    specPlaceholder: "spec — e.g. fs=npx -y @modelcontextprotocol/...",
    saved: "saved",
    savedRestart: "saved — restart carboncode code to bridge this server",
    removed: "removed — restart to drop the live bridge",
    removeConfirm: "Remove MCP spec from config?\n\n{spec}",
    noServers: "No MCP servers in this session.",
    tools: "tools",
    inConfig: "in config · not loaded",
    unbridgedTitle: "unbridged · in config",
    removeBtn: "Remove",
    spec: "spec",
    whyUnbridged: "Why unbridged?",
    whyUnbridgedDesc:
      "This spec lives in your config.json but isn't bridged into the live session. MCP servers attach when carboncode code starts; the dashboard alone can't spawn the child process.",
    whyUnbridgedHint: "To activate: restart carboncode code, then refresh this dashboard.",
    bridgeFailed: "Bridge failed",
    bridgeFailedTitle: "bridge failed · in config",
    bridgeFailedHint:
      "Carbon Code tried to bridge this server and the attempt errored. Common causes: wrong URL, missing auth header, upstream 404/5xx, missing local command. Fix and restart carboncode code to retry.",
    pickHint: "Pick an MCP server on the left to inspect tools / resources / prompts.",
    toolsTitle: "Tools · {count}",
    resourcesTitle: "Resources · {count}",
    promptsTitle: "Prompts · {count}",
    colName: "name",
    colDesc: "description",
    colUri: "uri",
    marketplace: "marketplace",
    marketplaceSearch: "search the registry…",
    marketplaceLoading: "loading registry…",
    marketplaceMore: "load 5 more pages",
    marketplaceMoreLabel: "load 50 more  ·  showing {shown} / {total}",
    marketplaceMoreHint: "fetches more pages from the registry",
    marketplaceMoreCachedHint: "more entries already cached locally",
    marketplaceExhausted: "all pages loaded",
    marketplaceExhaustedFull: "showing all {total} entries — registry exhausted",
    marketplaceCount: "{loaded} loaded · {matched} match · source: {source}{cached}",
    marketplaceCachedSuffix: " · cached",
    marketplaceNoMatches: "No matches. Try different terms or load more pages.",
    marketplaceInstall: "Install",
    marketplacePickHint: "Pick a server on the left, then Install.",
    marketplaceInstalled: "installed → {spec}",
    marketplaceInstalledBridged: "installed + bridged → {spec}",
    marketplaceAlready: "already installed",
    marketplaceNeedsEnv: "needs env: {names}",
    marketplaceSourceTag: "[{source}]",
    marketplaceNoInstall:
      "smithery listing — install metadata not exposed; use `npx -y @smithery/cli install {name}` directly",
    marketplaceFetchOnInstall:
      "Smithery listing — install detail fetched on Install. http servers map to streamable-http remotes; stdio servers run via @smithery/cli.",
    marketplaceInstalledBadge: "installed",
    marketplaceUninstall: "Uninstall",
    marketplaceEnvTitle: "Required environment variables",
    marketplaceEnvHint:
      "Set these in your shell before next `carboncode code` so the bridged server can authenticate.",
    marketplaceRestartHint:
      "Spec written to ~/.carboncode/config.json. Restart `carboncode code` to bridge the server (live hot-reload is on the roadmap).",
  },
  memory: {
    loading: "loading memory…",
    files: "memory · {count} files",
    exists: "exists",
    create: "create",
    noFiles: "No memory files yet.",
    pickHint: "Pick a memory file on the left.",
    pickDesc: "Project CARBON.md is committable; global notes live in ~/.carboncode/CARBON.md.",
    chars: "{count} chars",
    saved: "saved {scope}",
    reloadHint: "re-applied on next /new or session restart",
  },
  hooks: {
    loading: "loading hooks…",
    resolved: "resolved",
    eventMatrix: "Event matrix",
    matrixSub: "{scripts} script{s} × {events} event{s}",
    noHooks: "No hooks configured. Edit the JSON below to add some.",
    colScript: "script",
    noProject: "No active project — open /dashboard from carboncode code to edit project hooks.",
    saveReload: "Save + Reload",
    discard: "Discard changes",
    savedReloaded: "saved + reloaded {scope}",
    recentRuns: "Recent runs",
    noRuns: "No hook runs in the recent session log.",
    colWhen: "when",
    colPhase: "phase",
    colHook: "hook",
    colOutcome: "outcome",
  },
  skills: {
    loading: "loading skills…",
    filterPlaceholder: "filter skills",
    project: "project",
    custom: "custom",
    global: "global",
    builtin: "builtin",
    newSkill: "new skill",
    noDescription: "(no description)",
    runs7d: "runs · 7d",
    pickHint: "Pick a skill on the left, or create a new one above.",
    readOnlyBuiltin: "read-only · builtin",
    readOnlyCustom: "read-only · custom path",
    builtinDesc:
      "Built-in skills ship with Carbon Code; the model picks them up automatically. To customize, create a project- or global-scoped skill with the same name.",
    saved: "saved {scope}/{name}",
    deleteConfirm: "Delete skill {scope}/{name}?",
    reloadHint: "re-loaded on next /new or session restart",
  },
  system: {
    loading: "loading health…",
    failed: "health failed: {error}",
    healthChecks: "Health checks",
    version: "version",
    checking: "checking",
    latest: "● latest",
    outOfDate: "● out of date",
    versionPending: "version check pending",
    upToDate: "up to date",
    latestVer: "latest: {version}",
    sessions: "sessions",
    ok: "● ok",
    memory: "memory",
    semanticIndex: "semantic index",
    built: "● built",
    none: "— none",
    runIndex: "run carboncode index to build",
    usageLog: "usage log",
    backgroundJobs: "background jobs",
    noSession: "— no session",
    running: "{count} running",
    attachHint: "attach a session to see jobs",
    shellSpawn: "shell + spawn",
    paths: "paths",
    home: "home",
    sessionsPath: "sessions",
    memoryPath: "memory",
    semanticPath: "semantic",
    usagePath: "usage",
  },
  plans: {
    loading: "loading plans…",
    failed: "plans failed: {error}",
    noPlans: "No archived plans yet — run a turn that calls submit_plan and mark_step_complete.",
    filterPlaceholder: "filter plans",
    active: "active",
    done: "done",
    idle: "idle",
    steps: "steps",
    pickHint: "Pick a plan on the left.",
    noTitle: "(no title)",
    stepTimeline: "Step timeline · {done} / {total}",
    step: "step {n}",
  },
  semantic: {
    codeRequired: "Semantic — code-mode required",
    indexBuilt: "index built",
    noIndex: "no index yet",
    ready: "ready",
    setupNeeded: "setup needed",
    installOllama: "Install Ollama",
    installOllamaDesc:
      "Carbon Code doesn't run package managers for you. Install Ollama first, then come back:",
    macWindows: "macOS / Windows:",
    download: "download from ollama.com/download",
    linux: "Linux:",
    refreshHint:
      "Refresh after install — this panel will offer to start the daemon and pull {model}.",
    daemon: "Daemon",
    daemonDesc: "ollama is on your PATH but the HTTP daemon isn't reachable.",
    startDaemon: "Start daemon",
    runsOllama: "runs ollama serve detached",
    model: "Model",
    modelMissing: "{model} isn't installed yet.",
    modelSize: "~270 MB on first pull.",
    pulling: "pulling…",
    pullModel: "Pull {model}",
    indexStatus: "index status",
    builtStatus: "● built",
    incompatibleStatus: "● incompatible",
    chunks: "chunks",
    files: "files",
    dim: "dim",
    size: "size",
    lastBuild: "last build",
    builtWith: "built with",
    currentTarget: "current target",
    incompatibleHint:
      "This on-disk index was built for a different provider or model. Run Rebuild to replace it.",
    runIndexHint: "Run an index to enable semantic_search.",
    reIndex: "Re-index",
    build: "Build",
    rebuild: "Rebuild",
    stop: "Stop",
    provider: "provider",
    providerType: "service type",
    openaiCompat: "openai-compatible",
    apiUrl: "API URL",
    apiKey: "API key",
    apiKeyStoredNote: "API key is stored in ~/.carboncode/config.json — do not share that file.",
    customRequestBody: "custom request body",
    invalidCustomRequestBody: "Custom request body must be valid JSON: {error}",
    customRequestBodyMustBeObject: "Custom request body must be a JSON object.",
    saveBeforeIndex: "Save semantic settings before starting an index.",
    extraBody: "extra body",
    batchSize: "batch size",
    keepExistingKey: "leave blank to keep existing key",
    remoteProvider: "Remote embedding provider",
    remoteProviderDesc:
      "Configure the full OpenAI-compatible embeddings URL here. Carbon Code will send requests exactly to the URL you provide.",
    ollama: "ollama",
    binary: "binary",
    found: "found",
    missing: "missing",
    daemonStatus: "daemon",
    up: "up",
    down: "down",
    pulled: "pulled",
    indexConfig: "index config",
    reset: "reset",
    excludeDirs: "exclude dirs",
    excludeFiles: "exclude files",
    excludeExts: "exclude exts",
    excludePatterns: "exclude patterns",
    glob: "glob",
    respectGitignore: "respect .gitignore",
    maxFileBytes: "max file bytes",
    skipLarger: "skip files larger than ~{size} MiB",
    preview: "Preview",
    searchPlaceholder: "describe what to find — 'where do we handle abort signals'",
    searching: "searching…",
    results: "{count} result{s} · {ms}ms · {model}",
    noMatches: "No matches above the score threshold.",
    previewSummary: "Preview — would index {included} file(s), skip {skipped}",
    nothingSkipped: "nothing skipped — all walked files would be indexed.",
    firstIncluded: "first {count} included file(s)",
    job: "Job",
    phaseSetup: "preparing",
    phaseScan: "scanning files",
    phaseEmbed: "embedding chunks",
    phaseWrite: "writing index",
    phaseDone: "done",
    phaseError: "error",
    phaseCancelled: "cancelled",
    setupFailed: "setup failed",
    stopping: "stopping",
    scanned: "scanned {count}",
    changed: "changed {count}",
    skipped: "skipped {count}",
    chunksProgress: "{done} / {total} ({pct}%)",
    result: "result",
    added: "added {count}",
    removed: "removed {count}",
    failed: "failed {count}",
    skippedFiles: "{total} files ({details})",
    rebuildStarted: "rebuild started",
    incrementalStarted: "incremental index started",
    stopRequested: "stopping requested — current chunk batch will finish first",
    startingDaemon: "starting ollama daemon (15s timeout)…",
    daemonUp: "daemon is up",
    daemonTimeout: "daemon didn't come up in time — check ollama serve manually",
    pullingModel: "pulling {model} — this may take a few minutes on first install",
    savedConfig: "saved · {count} fields updated · re-run index to apply",
    runningPreview: "running dry walk against project root…",
    exclude: "exclude",
  },
  modal: {
    shellTitle: "shell command",
    shellBgTitle: "background process",
    shellSubtitle: "model wants to run a shell command",
    shellBgSubtitle: "long-running — keeps running after approval",
    runOnce: "Run once",
    alwaysAllow: 'Always allow "{prefix}"',
    deny: "Deny",
    choiceTitle: "model wants you to pick",
    typeOwn: "Type my own answer",
    typeOwnSummary: "None of the above fits — write a free-form reply.",
    typePlaceholder: "Type a free-form answer…",
    send: "Send",
    cancel: "Cancel",
    cancelSummary: "Drop the question. Model will ask what you actually want.",
    planTitle: "plan submitted",
    planSubtitle: "model proposed a plan; review then pick",
    approveInstructions:
      "Optional last instructions / answers to open questions (Enter to send blank)",
    refinePlaceholder: "What needs to change? Be specific.",
    approve: "Approve",
    refine: "Refine",
    sendRefinement: "Send refinement",
    editTitle: "edit pending review",
    editSubtitle: "{path} · {remaining} of {total} blocks remaining",
    before: "before",
    after: "after",
    workspaceTitle: "model wants to switch workspace",
    workspaceSubtitle: "every subsequent file / shell / memory tool resolves against the new root",
    switchBtn: "Switch (Enter)",
    denyBtn: "Deny (Esc)",
    stepComplete: "step complete{counter}",
    continueBtn: "Continue",
    reviseBtn: "Revise…",
    stopBtn: "Stop",
    revisionTitle: "model proposed a plan revision",
    sendRevision: "Send revision",
    accept: "Accept",
    reject: "Reject",
    arguments: "arguments",
    revisePlaceholder: "What needs to change before the next step? Leave blank to just continue.",
    pickerFilter: "Filter…",
    pickerEmpty: "Nothing to show.",
    pickerLoadMore: "Load more",
    pickerPick: "Open",
    pickerInstall: "Install",
    pickerUninstall: "Uninstall",
    pickerRename: "Rename…",
    pickerNew: "New…",
    pickerNewPlaceholder: "Name (leave blank for default)",
    viewerClose: "Close",
  },
  error: {
    title: "Something broke in the dashboard",
    body: "The TUI is unaffected — only this browser tab tripped. You can dismiss and keep working, or report it so we can fix the underlying cause.",
    copyDetails: "Copy details",
    copied: "Copied ✓",
    reportOnGithub: "Report on GitHub",
    dismiss: "Dismiss (Esc)",
    crashing: "this panel keeps crashing — {name}",
    retry: "Try again",
    recovering: "recovering…",
  },
  fmt: {
    justNow: "just now",
    minutesAgo: "{n}m ago",
    hoursAgo: "{n}h ago",
    daysAgo: "{n}d ago",
  },
};
