import type { TranslationMap } from "../lib/types.ts";

export const en: TranslationMap = {
  common: {
    health: "Health",
    ok: "OK",
    yes: "Yes",
    no: "No",
    active: "Active",
    loading: "Loading…",
    refreshing: "Refreshing…",
    online: "Online",
    offline: "Offline",
    connect: "Connect",
    connected: "Connected",
    refresh: "Refresh",
    reload: "Reload",
    probe: "Probe",
    call: "Call",
    confirm: "Confirm",
    cancel: "Cancel",
    unselect: "Unselect",
    enabled: "Enabled",
    disabled: "Disabled",
    na: "n/a",
    configured: "Configured",
    running: "Running",
    linked: "Linked",
    mode: "Mode",
    baseUrl: "Base URL",
    lastStart: "Last start",
    lastProbe: "Last probe",
    lastInbound: "Last inbound",
    lastConnect: "Last connect",
    lastMessage: "Last message",
    authAge: "Auth age",
    credential: "Credential",
    audience: "Audience",
    publicKey: "Public Key",
    probeOk: "Probe ok",
    probeFailed: "Probe failed",
    reloadConfig: "Reload Config",
    loadConfig: "Load config",
    loadApprovals: "Load approvals",
    settingsSections: "Settings sections",
    version: "Version",
    docs: "Docs",
    theme: "Theme",
    resources: "Resources",
    search: "Search",
    save: "Save",
    saving: "Saving…",
    saveAndPublish: "Save & Publish",
    importing: "Importing…",
    importFromRelays: "Import from Relays",
    showAdvanced: "Show Advanced",
    hideAdvanced: "Hide Advanced",
    unsavedChanges: "You have unsaved changes",
    secondsAgo: "{count}s ago",
    working: "Working…",
    showQr: "Show QR",
    relink: "Relink",
    waitForScan: "Wait for scan",
    logout: "Logout",
  },
  channels: {
    health: {
      title: "Channel health",
      subtitle: "Channel status snapshots from the gateway.",
      noSnapshotYet: "No snapshot yet.",
    },
    generic: {
      subtitle: "Channel status and configuration.",
    },
    gatewayUrlConfirmation: {
      title: "Change Gateway URL",
      subtitle: "This will reconnect to a different gateway server",
      warning: "Only confirm if you trust this URL. Malicious URLs can compromise your system.",
    },
    nostr: {
      profile: "Profile",
      editProfile: "Edit Profile",
      profilePicture: "Profile picture",
      noProfile: "No profile set.",
      noProfileHint: 'Click "Edit Profile" to add your name, bio, and avatar.',
      name: "Name",
      displayName: "Display Name",
      about: "About",
      advanced: "Advanced",
      profilePicturePreview: "Profile picture preview",
      account: "Account",
      username: "Username",
      usernameHelp: "Short username (e.g., satoshi)",
      bio: "Bio",
      bioPlaceholder: "Tell people about yourself...",
      bioHelp: "A brief bio or description",
      displayNameHelp: "Your full display name",
      avatarUrl: "Avatar URL",
      avatarHelp: "HTTPS URL to your profile picture",
      bannerUrl: "Banner URL",
      bannerHelp: "HTTPS URL to a banner image",
      website: "Website",
      websiteHelp: "Your personal website",
      nip05Identifier: "NIP-05 Identifier",
      nip05Help: "Verifiable identifier (e.g., you@domain.com)",
      lightningAddress: "Lightning Address",
      lightningHelp: "Lightning address for tips (LUD-16)",
    },
  },
  nodes: {
    binding: {
      loadConfigHint: "Load config to edit bindings.",
      formModeHint: "Switch the Config tab to Form mode to edit bindings here.",
      execNodeBinding: "Exec node binding",
      execNodeBindingSubtitle: "Pin agents to a specific node when using exec host=node.",
      defaultBinding: "Default binding",
      defaultBindingHint: "Used when agents do not override a node binding.",
      node: "Node",
    },
  },
  instances: {
    title: "Connected Instances",
    subtitle: "Presence beacons from the gateway and clients.",
    showHosts: "Show hosts and IPs",
    hideHosts: "Hide hosts and IPs",
    toggleHostVisibility: "Toggle host visibility",
    noInstances: "No instances reported yet.",
    lastInput: "Last input {time}",
    reason: "Reason {reason}",
  },
  agentTools: {
    connectedSource: "Connected: {id}",
    connected: "Connected",
    channelSource: "Channel: {id}",
    channel: "Channel",
    builtIn: "Built-in",
  },
  nav: {
    chat: "Chat",
    control: "Control",
    agent: "Agent",
    settings: "Settings",
    expand: "Expand sidebar",
    collapse: "Collapse sidebar",
    resize: "Resize sidebar",
  },
  tabs: {
    agents: "Agents",
    overview: "Overview",
    channels: "Channels",
    instances: "Instances",
    sessions: "Sessions",
    usage: "Usage",
    cron: "Cron Jobs",
    skills: "Skills",
    nodes: "Nodes",
    chat: "Chat",
    config: "Config",
    communications: "Communications",
    appearance: "Appearance",
    automation: "Automation",
    infrastructure: "Infrastructure",
    aiAgents: "AI & Agents",
    debug: "Debug",
    logs: "Logs",
    dreams: "Dreaming",
  },
  subtitles: {
    agents: "Workspaces, tools, identities.",
    overview: "Status, entry points, health.",
    channels: "Channels and settings.",
    instances: "Connected clients and nodes.",
    sessions: "Active sessions and defaults.",
    usage: "API usage and costs.",
    cron: "Wakeups and recurring runs.",
    skills: "Skills and API keys.",
    nodes: "Paired devices and commands.",
    chat: "Gateway chat for quick interventions.",
    config: "Edit openclaw.json.",
    communications: "Channels, messages, and audio settings.",
    appearance: "Theme, UI, and setup wizard settings.",
    automation: "Commands, hooks, cron, and plugins.",
    infrastructure: "Gateway, web, browser, and media settings.",
    aiAgents: "Agents, models, skills, tools, memory, session.",
    debug: "Snapshots, events, RPC.",
    logs: "Live gateway logs.",
    dreams: "Memory dreaming, consolidation, and reflection.",
  },
  overview: {
    access: {
      title: "Gateway Access",
      subtitle: "Where the dashboard connects and how it authenticates.",
      wsUrl: "WebSocket URL",
      token: "Gateway Token",
      password: "Password (not stored)",
      sessionKey: "Default Session Key",
      language: "Language",
      connectHint: "Click Connect to apply connection changes.",
      trustedProxy: "Authenticated via trusted proxy.",
    },
    snapshot: {
      title: "Snapshot",
      subtitle: "Latest gateway handshake information.",
      status: "Status",
      uptime: "Uptime",
      tickInterval: "Tick Interval",
      lastChannelsRefresh: "Last Channels Refresh",
      channelsHint: "Use Channels to link WhatsApp, Telegram, Discord, Signal, or iMessage.",
    },
    stats: {
      instances: "Instances",
      instancesHint: "Presence beacons in the last 5 minutes.",
      sessions: "Sessions",
      sessionsHint: "Recent session keys tracked by the gateway.",
      cron: "Cron",
      cronNext: "Next wake {time}",
    },
    notes: {
      title: "Notes",
      subtitle: "Quick reminders for remote control setups.",
      tailscaleTitle: "Tailscale serve",
      tailscaleText: "Prefer serve mode to keep the gateway on loopback with tailnet auth.",
      sessionTitle: "Session hygiene",
      sessionText: "Use /new or sessions.patch to reset context.",
      cronTitle: "Cron reminders",
      cronText: "Use isolated sessions for recurring runs.",
    },
    auth: {
      required: "This gateway requires auth. Add a token or password, then click Connect.",
      failed:
        "Auth failed. Re-copy a tokenized URL with {command}, or update the token, then click Connect.",
    },
    pairing: {
      hint: "This device needs pairing approval from the gateway host.",
      mobileHint:
        "On mobile? Copy the full URL (including #token=...) from openclaw dashboard --no-open on your desktop.",
    },
    insecure: {
      hint: "This page is HTTP, so the browser blocks device identity. Use HTTPS (Tailscale Serve) or open {url} on the gateway host.",
      stayHttp: "If you must stay on HTTP, set {config} (token-only).",
    },
    connection: {
      title: "How to connect",
      step1: "Start the gateway on your host machine:",
      step2: "Get a tokenized dashboard URL:",
      step3: "Paste the WebSocket URL and token above, or open the tokenized URL directly.",
      step4: "Or generate a reusable token:",
      docsHint: "For remote access, Tailscale Serve is recommended. ",
      docsLink: "Read the docs →",
    },
    cards: {
      cost: "Cost",
      skills: "Skills",
      recentSessions: "Recent Sessions",
      modelAuth: "Model Auth",
      modelAuthOk: "{count} ok",
      modelAuthExpired: "{count} expired",
      modelAuthExpiring: "{count} expiring",
      modelAuthProviders: "{count} providers",
      modelAuthUsageLeft: "{pct}% left",
      modelAuthExpiresIn: "expires {when}",
      modelAuthAttentionExpiredTitle: "Model auth expired",
      modelAuthAttentionExpiringTitle: "Model auth expiring soon",
      modelAuthAttentionExpiredDesc: "{providers} — re-authenticate with openclaw models auth",
      modelAuthAttentionExpiringEntry: "{provider} ({when})",
    },
    attention: {
      title: "Attention",
    },
    eventLog: {
      title: "Event Log",
    },
    logTail: {
      title: "Gateway Logs",
    },
    quickActions: {
      newSession: "New Session",
      automation: "Automation",
      refreshAll: "Refresh All",
      terminal: "Terminal",
    },
    palette: {
      placeholder: "Type a command…",
      noResults: "No results",
    },
  },
  dreaming: {
    tabs: {
      scene: "Scene",
      diary: "Diary",
      advanced: "Advanced",
    },
    header: {
      refresh: "Refresh",
      refreshing: "Refreshing…",
      on: "Dreaming On",
      off: "Dreaming Off",
    },
    status: {
      active: "Dreaming Active",
      idle: "Dreaming Idle",
      promotedSuffix: "promoted",
      nextSweepPrefix: "next sweep",
    },
    scene: {
      backfill: "Backfill",
      dedupeDiary: "Dedupe Diary",
      reset: "Reset",
      clearGrounded: "Clear Replayed",
      repairCache: "Repair Dream Cache",
      working: "Working…",
    },
    phase: {
      light: "Light",
      deep: "Deep",
      rem: "Rem",
      off: "off",
    },
    advanced: {
      eyebrow: "Review",
      title: "Daily Log Review",
      description:
        "Review what came from the daily log, what is waiting for promotion, and what was promoted recently.",
      summaryFromDailyLog: "from daily log",
      summaryWaiting: "waiting",
      summaryPromotedToday: "promoted today",
      stagedTitle: "From the Daily Log",
      stagedDescription: "Replay candidates pulled from older daily log entries.",
      shortTermTitle: "Waiting for Promotion",
      shortTermDescription: "Current short-term candidates waiting to graduate into real memory.",
      sortRecent: "Most recent",
      sortSignals: "Strongest support",
      originDailyLog: "replayed",
      originLive: "live",
      originMixed: "mixed",
      promotedTitle: "Recent Promotions",
      promotedDescription: "Items that already made it through promotion.",
      emptyGrounded: "No staged grounded replay entries right now.",
      emptyShortTerm: "No short-term entries to inspect.",
      emptyPromoted: "No recent promotions to inspect.",
      updatedPrefix: "updated",
    },
    stats: {
      shortTerm: "Short-term",
      grounded: "Grounded",
      signals: "Signals",
      promoted: "Promoted",
      phaseHits: "Phase Hits",
    },
    trace: {
      shortTerm: "Short-term",
      grounded: "Grounded",
      signals: "Signals",
      promoted: "Promoted",
      groundedLed: "grounded-led",
      emptyShortTerm: "No active short-term items.",
      emptyGrounded: "No staged grounded items.",
      emptySignals: "No active signals.",
      emptyPromoted: "Nothing promoted yet today.",
    },
    diary: {
      title: "Dream Diary",
      noDreamsYet: "No dreams yet",
      noDreamsHint: "Dreams will appear here after the first dreaming cycle runs.",
      waitingTitle: "The diary is waiting",
      waitingHint: "Narrative entries will appear after the next dreaming cycle.",
      older: "Older",
      newer: "Newer",
      reload: "Reload",
      reloading: "Reloading…",
    },
    phrases: {
      consolidatingMemories: "consolidating memories…",
      tidyingKnowledgeGraph: "tidying the knowledge graph…",
      replayingConversations: "replaying today's conversations…",
      weavingShortTerm: "weaving short-term into long-term…",
      defragmentingMindPalace: "defragmenting the mind palace…",
      filingLooseThoughts: "filing away loose thoughts…",
      connectingDots: "connecting distant dots…",
      compostingContext: "composting old context windows…",
      alphabetizingSubconscious: "alphabetizing the subconscious…",
      promotingHunches: "promoting promising hunches…",
      forgettingNoise: "forgetting what doesn't matter…",
      dreamingEmbeddings: "dreaming in embeddings…",
      reorganizingAttic: "reorganizing the memory attic…",
      indexingDay: "softly indexing the day…",
      nurturingInsights: "nurturing fledgling insights…",
      simmeringIdeas: "simmering half-formed ideas…",
      whisperingVectorStore: "whispering to the vector store…",
    },
  },
  usage: {
    page: {
      subtitle: "See where tokens go, when sessions spike, and what drives cost.",
    },
    common: {
      emptyValue: "—",
      unknown: "unknown",
    },
    loading: {
      title: "Usage Overview",
      badge: "Loading",
    },
    metrics: {
      tokens: "Tokens",
      cost: "Cost",
      session: "session",
      sessions: "sessions",
    },
    presets: {
      today: "Today",
      last7d: "7d",
      last30d: "30d",
    },
    filters: {
      title: "Filters",
      to: "to",
      startDate: "Start date",
      endDate: "End date",
      timeZone: "Time zone",
      timeZoneLocal: "Local",
      timeZoneUtc: "UTC",
      pin: "Pin",
      pinned: "Pinned",
      unpin: "Unpin filters",
      selectAll: "Select All",
      clear: "Clear",
      clearAll: "Clear All",
      remove: "Remove filter",
      all: "All",
      days: "Days",
      hours: "Hours",
      session: "Session",
      agent: "Agent",
      channel: "Channel",
      provider: "Provider",
      model: "Model",
      tool: "Tool",
      daysCount: "{count} days",
      hoursCount: "{count} hours",
      sessionsCount: "{count} sessions",
    },
    query: {
      placeholder:
        "Filter sessions (e.g. key:agent:main:cron* model:gpt-4o has:errors minTokens:2000)",
      apply: "Filter (client-side)",
      matching: "{shown} of {total} sessions match",
      inRange: "{total} sessions in range",
      tip: "Tip: use filters or click bars to refine days.",
    },
    export: {
      label: "Export",
      sessionsCsv: "Sessions CSV",
      dailyCsv: "Daily CSV",
      json: "JSON",
    },
    empty: {
      title: "Start with a date range",
      subtitle:
        "Load usage data to compare costs, inspect sessions, and drill into timelines without leaving the dashboard.",
      hint: "Select a date range and click Refresh to load usage.",
      noData: "No data",
      featureOverview: "Overview cards",
      featureSessions: "Session ranking",
      featureTimeline: "Timeline drilldown",
    },
    daily: {
      title: "Daily Usage",
      total: "Total",
      byType: "By Type",
      tokensTitle: "Daily Token Usage",
      costTitle: "Daily Cost",
    },
    breakdown: {
      output: "Output",
      input: "Input",
      cacheWrite: "Cache Write",
      cacheRead: "Cache Read",
      total: "Total",
      tokensByType: "Tokens by Type",
      costByType: "Cost by Type",
    },
    overview: {
      title: "Usage Overview",
      messages: "Messages",
      messagesHint: "Total user and assistant messages in range.",
      messagesAbbrev: "msgs",
      user: "user",
      assistant: "assistant",
      toolCalls: "Tool Calls",
      toolCallsHint: "Total tool call count across sessions.",
      toolsUsed: "tools used",
      errors: "Errors",
      errorsHint: "Total message and tool errors in range.",
      toolResults: "tool results",
      avgTokens: "Avg Tokens / Msg",
      avgTokensHint: "Average tokens per message in this range.",
      avgCost: "Avg Cost / Msg",
      avgCostHint: "Average cost per message when providers report costs.",
      avgCostHintMissing:
        "Average cost per message when providers report costs. Cost data is missing for some or all sessions in this range.",
      acrossMessages: "Across {count} messages",
      sessions: "Sessions",
      sessionsHint: "Distinct sessions in the range.",
      sessionsInRange: "of {count} in range",
      throughput: "Throughput",
      throughputHint: "Throughput shows tokens per minute over active time. Higher is better.",
      tokensPerMinute: "tok/min",
      perMinute: "/ min",
      errorRate: "Error Rate",
      errorHint: "Error rate = errors / total messages. Lower is better.",
      avgSession: "avg session",
      cacheHitRate: "Cache Hit Rate",
      cacheHint: "Cache hit rate = cache read / (input + cache read). Higher is better.",
      cached: "cached",
      prompt: "prompt",
      calls: "calls",
      topModels: "Top Models",
      topProviders: "Top Providers",
      topTools: "Top Tools",
      topAgents: "Top Agents",
      topChannels: "Top Channels",
      peakErrorDays: "Peak Error Days",
      peakErrorHours: "Peak Error Hours",
      noModelData: "No model data",
      noProviderData: "No provider data",
      noToolCalls: "No tool calls",
      noAgentData: "No agent data",
      noChannelData: "No channel data",
      noErrorData: "No error data",
    },
    sessions: {
      title: "Sessions",
      shown: "{count} shown",
      total: "{count} total",
      avg: "avg",
      all: "All",
      recent: "Recently viewed",
      recentShort: "Recent",
      sort: "Sort",
      ascending: "Ascending",
      descending: "Descending",
      clearSelection: "Clear Selection",
      noRecent: "No recent sessions",
      noneInRange: "No sessions in range",
      more: "+{count} more",
      selected: "Selected ({count})",
      copy: "Copy",
      copyName: "Copy session name",
      limitReached: "Showing first 1,000 sessions. Narrow date range for complete results.",
    },
    details: {
      noUsageData: "No usage data for this session.",
      duration: "Duration",
      modelMix: "Model Mix",
      filtered: "(filtered)",
      close: "Close session details",
      noTimeline: "No timeline data",
      noDataInRange: "No data in range",
      usageOverTime: "Usage Over Time",
      reset: "Reset",
      perTurn: "Per Turn",
      cumulative: "Cumulative",
      turnRange: "Turns {start}–{end} of {total}",
      assistantOutputTokens: "Assistant output tokens",
      userToolInputTokens: "User + tool input tokens",
      tokensWrittenToCache: "Tokens written to cache",
      tokensReadFromCache: "Tokens read from cache",
      noContextData: "No context data",
      systemPromptBreakdown: "System Prompt Breakdown",
      collapse: "Collapse",
      collapseAll: "Collapse All",
      expandAll: "Expand All",
      baseContextPerMessage: "Base context per message",
      system: "System",
      systemShort: "Sys",
      skills: "Skills",
      tools: "Tools",
      files: "Files",
      ofInput: "of input",
      of: "of",
      timelineFiltered: "timeline filtered",
      conversation: "Conversation",
      noMessages: "No messages",
      tool: "Tool",
      toolResult: "Tool result",
      hasTools: "Has tools",
      searchConversation: "Search conversation",
      you: "You",
      noMessagesMatch: "No messages match the filters.",
    },
    mosaic: {
      title: "Activity by Time",
      subtitleEmpty: "Estimates require session timestamps.",
      subtitle: "Estimated from session spans (first/last activity). Time zone: {zone}.",
      noTimelineData: "No timeline data yet.",
      dayOfWeek: "Day of Week",
      midnight: "Midnight",
      fourAm: "4am",
      eightAm: "8am",
      noon: "Noon",
      fourPm: "4pm",
      eightPm: "8pm",
      legend: "Low → High token density",
      sun: "Sun",
      mon: "Mon",
      tue: "Tue",
      wed: "Wed",
      thu: "Thu",
      fri: "Fri",
      sat: "Sat",
    },
  },
  login: {
    subtitle: "Gateway Dashboard",
    passwordPlaceholder: "optional",
  },
  chat: {
    disconnected: "Disconnected from gateway.",
    refreshTitle: "Refresh chat data",
    thinkingToggle: "Toggle assistant thinking/working output",
    toolCallsToggle: "Toggle tool calls and tool results",
    focusToggle: "Toggle focus mode (hide sidebar + page header)",
    hideCronSessions: "Hide cron sessions",
    showCronSessions: "Show cron sessions",
    showCronSessionsHidden: "Show cron sessions ({count} hidden)",
    onboardingDisabled: "Disabled during setup",
  },
  languages: {
    en: "English",
    zhCN: "简体中文 (Simplified Chinese)",
    zhTW: "繁體中文 (Traditional Chinese)",
    ptBR: "Português (Brazilian Portuguese)",
    de: "Deutsch (German)",
    es: "Español (Spanish)",
    jaJP: "日本語 (Japanese)",
    ko: "한국어 (Korean)",
    fr: "Français (French)",
    tr: "Türkçe (Turkish)",
    uk: "Українська (Ukrainian)",
    id: "Bahasa Indonesia (Indonesian)",
    pl: "Polski (Polish)",
  },
  cron: {
    summary: {
      enabled: "Enabled",
      yes: "Yes",
      no: "No",
      jobs: "Jobs",
      nextWake: "Next wake",
      refreshing: "Refreshing...",
      refresh: "Refresh",
    },
    jobs: {
      title: "Jobs",
      subtitle: "All scheduled jobs stored in the gateway.",
      shownOf: "{shown} shown of {total}",
      searchJobs: "Search jobs",
      searchPlaceholder: "Name, description, or agent",
      enabled: "Enabled",
      schedule: "Schedule",
      lastRun: "Last run",
      all: "All",
      sort: "Sort",
      nextRun: "Next run",
      recentlyUpdated: "Recently updated",
      name: "Name",
      direction: "Direction",
      ascending: "Ascending",
      descending: "Descending",
      reset: "Reset",
      noMatching: "No matching jobs.",
      loading: "Loading...",
      loadMore: "Load more jobs",
    },
    runs: {
      title: "Run history",
      subtitleAll: "Latest runs across all jobs.",
      subtitleJob: "Latest runs for {title}.",
      scope: "Scope",
      allJobs: "All jobs",
      selectedJob: "Selected job",
      searchRuns: "Search runs",
      searchPlaceholder: "Summary, error, or job",
      newestFirst: "Newest first",
      oldestFirst: "Oldest first",
      status: "Status",
      delivery: "Delivery",
      clear: "Clear",
      allStatuses: "All statuses",
      allDelivery: "All delivery",
      selectJobHint: "Select a job to inspect run history.",
      noMatching: "No matching runs.",
      loadMore: "Load more runs",
      runStatusOk: "OK",
      runStatusError: "Error",
      runStatusSkipped: "Skipped",
      runStatusUnknown: "Unknown",
      deliveryDelivered: "Delivered",
      deliveryNotDelivered: "Not delivered",
      deliveryUnknown: "Unknown",
      deliveryNotRequested: "Not requested",
    },
    form: {
      editJob: "Edit Job",
      newJob: "New Job",
      updateSubtitle: "Update the selected scheduled job.",
      createSubtitle: "Create a scheduled wakeup or agent run.",
      required: "Required",
      requiredSr: "required",
      basics: "Basics",
      basicsSub: "Name it, choose the assistant, and set enabled state.",
      fieldName: "Name",
      description: "Description",
      agentId: "Agent ID",
      namePlaceholder: "Morning brief",
      descriptionPlaceholder: "Optional context for this job",
      agentPlaceholder: "main or ops",
      agentHelp: "Start typing to pick a known agent, or enter a custom one.",
      schedule: "Schedule",
      scheduleSub: "Control when this job runs.",
      every: "Every",
      at: "At",
      cronOption: "Cron",
      runAt: "Run at",
      unit: "Unit",
      minutes: "Minutes",
      hours: "Hours",
      days: "Days",
      expression: "Expression",
      expressionPlaceholder: "0 7 * * *",
      everyAmountPlaceholder: "30",
      timezoneOptional: "Timezone (optional)",
      timezonePlaceholder: "America/Los_Angeles",
      timezoneHelp: "Pick a common timezone or enter any valid IANA timezone.",
      jitterHelp: "Need jitter? Use Advanced → Stagger window / Stagger unit.",
      execution: "Execution",
      executionSub: "Choose when to wake, and what this job should do.",
      session: "Session",
      main: "Main",
      isolated: "Isolated",
      sessionHelp: "Main posts a system event. Isolated runs a dedicated agent turn.",
      wakeMode: "Wake mode",
      now: "Now",
      nextHeartbeat: "Next heartbeat",
      wakeModeHelp: "Now triggers immediately. Next heartbeat waits for the next cycle.",
      payloadKind: "What should run?",
      systemEvent: "Post message to main timeline",
      agentTurn: "Run assistant task (isolated)",
      systemEventHelp:
        "Sends your text to the gateway main timeline (good for reminders/triggers).",
      agentTurnHelp: "Starts an assistant run in its own session using your prompt.",
      timeoutSeconds: "Timeout (seconds)",
      timeoutPlaceholder: "Optional, e.g. 90",
      timeoutHelp:
        "Optional. Leave blank to use the gateway default timeout behavior for this run.",
      mainTimelineMessage: "Main timeline message",
      assistantTaskPrompt: "Assistant task prompt",
      deliverySection: "Delivery",
      deliverySub: "Choose where run summaries are sent.",
      resultDelivery: "Result delivery",
      announceDefault: "Announce summary (default)",
      webhookPost: "Webhook POST",
      noneInternal: "None (internal)",
      deliveryHelp: "Announce posts a summary to chat. None keeps execution internal.",
      webhookUrl: "Webhook URL",
      channel: "Channel",
      webhookPlaceholder: "https://example.com/cron",
      channelHelp: "Choose which connected channel receives the summary.",
      webhookHelp: "Send run summaries to a webhook endpoint.",
      to: "To",
      toPlaceholder: "+1555... or chat id",
      toHelp: "Optional recipient override (chat id, phone, or user id).",
      advanced: "Advanced",
      advancedHelp:
        "Optional overrides for delivery guarantees, schedule jitter, and model controls.",
      deleteAfterRun: "Delete after run",
      deleteAfterRunHelp: "Best for one-shot reminders that should auto-clean up.",
      clearAgentOverride: "Clear agent override",
      clearAgentHelp: "Force this job to use the gateway default assistant.",
      exactTiming: "Exact timing (no stagger)",
      exactTimingHelp: "Run on exact cron boundaries with no spread.",
      staggerWindow: "Stagger window",
      staggerUnit: "Stagger unit",
      staggerPlaceholder: "30",
      seconds: "Seconds",
      model: "Model",
      modelPlaceholder: "openai/gpt-5.2",
      modelHelp: "Start typing to pick a known model, or enter a custom one.",
      thinking: "Thinking",
      thinkingPlaceholder: "low",
      thinkingHelp: "Use a suggested level or enter a provider-specific value.",
      bestEffortDelivery: "Best effort delivery",
      bestEffortHelp: "Do not fail the job if delivery itself fails.",
      cantAddYet: "Can't add job yet",
      fillRequired: "Fill the required fields below to enable submit.",
      fixFields: "Fix {count} field to continue.",
      fixFieldsPlural: "Fix {count} fields to continue.",
      saving: "Saving...",
      saveChanges: "Save changes",
      addJob: "Add job",
      cancel: "Cancel",
    },
    jobList: {
      allJobs: "all jobs",
      selectJob: "(select a job)",
      enabled: "enabled",
      disabled: "disabled",
      edit: "Edit",
      clone: "Clone",
      disable: "Disable",
      enable: "Enable",
      run: "Run",
      history: "History",
      remove: "Remove",
    },
    jobDetail: {
      system: "System",
      prompt: "Prompt",
      delivery: "Delivery",
      agent: "Agent",
    },
    jobState: {
      status: "Status",
      next: "Next",
      last: "Last",
    },
    runEntry: {
      noSummary: "No summary.",
      runAt: "Run at",
      openRunChat: "Open run chat",
      next: "Next {rel}",
      due: "Due {rel}",
    },
    errors: {
      nameRequired: "Name is required.",
      scheduleAtInvalid: "Enter a valid date/time.",
      everyAmountInvalid: "Interval must be greater than 0.",
      cronExprRequired: "Cron expression is required.",
      staggerAmountInvalid: "Stagger must be greater than 0.",
      systemTextRequired: "System text is required.",
      agentMessageRequired: "Agent message is required.",
      timeoutInvalid: "If set, timeout must be greater than 0 seconds.",
      webhookUrlRequired: "Webhook URL is required.",
      webhookUrlInvalid: "Webhook URL must start with http:// or https://.",
      invalidRunTime: "Invalid run time.",
      invalidIntervalAmount: "Invalid interval amount.",
      cronExprRequiredShort: "Cron expression required.",
      invalidStaggerAmount: "Invalid stagger amount.",
      systemEventTextRequired: "System event text required.",
      agentMessageRequiredShort: "Agent message required.",
      nameRequiredShort: "Name required.",
    },
  },
};
