{
  "common": {
    "loading": "Loading…",
    "saving": "Saving…",
    "save": "Save",
    "cancel": "Cancel",
    "create": "Create",
    "creating": "Creating…",
    "edit": "Edit",
    "delete": "Delete",
    "update": "Update",
    "add": "Add",
    "close": "Close",
    "copy": "Copy",
    "copied": "Copied",
    "loadFailed": "Failed to load: {{error}}"
  },
  "root": {
    "title": "User Folder",
    "intro": "A per-user workspace that persists across sessions. Open a subdirectory from the tree on the left, then select a file to edit.",
    "fileCount": "There are currently {{count}} file(s). Select one from the tree on the left to edit.",
    "subdirs": {
      "agentsMd": {
        "title": "AGENTS.md",
        "desc": "Persistent, user-specific instructions automatically injected into the system prompt at task startup. Write the preferences and rules you want remembered on every task, like \"always answer in polite Japanese\" or \"prefer Tailwind\". Max 64KB. Markdown format.",
        "agency": "User-edited / referenced automatically by the agent"
      },
      "browserMacros": {
        "title": "browser-macros/",
        "desc": "Playwright-based browser macros. Generated from recordings/ via \"Save as Script\", or hand-written in the UI. Run with the RunUserScript tool. The main({ context, params }) signature exposes context as a Playwright BrowserContext. session_profile_id lets you reuse a saved login. .next.js files are auto-patch candidates produced when self-healing fails — accept/reject them after a diff review. Put templates and runbooks in Skills, and ad-hoc code execution in the Bash tool.",
        "agency": "Agent-executed / recordings → scripted in the UI"
      },
      "recordings": {
        "title": "recordings/",
        "desc": "BrowseWeb action traces (JSON). When you pass the recordTo parameter to a BrowseWeb call, successful actions are buffered and written here when the task ends. Convert them into browser macros via \"Save as Script\" (saved into browser-macros/).",
        "agency": "Recorded by the agent / scripted in the UI"
      },
      "pets": {
        "title": "pets/",
        "desc": "Where you import Codex Pets-compatible characters per user. They appear at the bottom-right of the Chat screen and react subtly to task state and tool calls.",
        "agency": "User-managed / referenced by the Chat UI"
      },
      "browserSessions": {
        "title": "browser-sessions/",
        "desc": "Browser login profile management. Cookies/storage captured past CAPTCHA or 2FA walls are encrypted and stored user-scoped, and referenced from browser-macros by session_profile_id.",
        "agency": "User-managed (log in via noVNC → save) / used by browser-macros"
      },
      "trash": {
        "title": "trash/",
        "desc": "Where deleted files go. Nothing is hard-deleted; files land with the `{YYYYMMDD-HHMMSS}-{rand4hex}-{name}` naming. Old script versions land here on accept/reject too. Viewing is read-only; to restore, copy the content and PUT it back into the original subdir. Files older than 30 days are auto-deleted on server startup / every 24h (configurable via `tools.trash_retention_days`).",
        "agency": "Soft delete / read-only / 30-day auto cleanup"
      },
      "memory": {
        "title": "memory/",
        "desc": "The agent's persistent fact store. `MEMORY.md` (index) is auto-injected into the system prompt at task startup (32 KB cap). View, edit, and delete entries in this panel. Reflection run history and revert live in Settings → Reflection history.",
        "agency": "Agent-managed + user-edited (this panel)"
      },
      "mcp": {
        "title": "mcp/",
        "desc": "Register MCP servers and manage their connections and settings in one place. OAuth / API key authentication, tool discovery, and connection status all happen here. Credentials are stored encrypted with AES-256-GCM.",
        "agency": "User-managed / admins can also add global servers"
      },
      "skills": {
        "title": "skills/",
        "desc": "Manage the agent's skills (reference knowledge and runbooks). Install from a URL, create manually, edit, and delete. Skills are injected into the agent as context during task execution.",
        "agency": "User-managed / referenced by the agent via ReadSkill"
      },
      "sshConnections": {
        "title": "ssh-connections/",
        "desc": "Manage the SSH connections used by the agent's SshExec / SshUpload / SshDownload tools. Private keys are stored with envelope encryption (AES-256-GCM + per-user DEK), and host keys are pinned via TOFU after user confirmation. Global connections are registered by admins and only usable when a grant has been added per piece.",
        "agency": "User-managed / global connections registered by admins"
      }
    }
  },
  "tree": {
    "header": "User Folder",
    "empty": "Empty",
    "deleteAria": "Delete {{name}}"
  },
  "newFile": {
    "label": {
      "browserMacros": "browser macro"
    },
    "heading": "Create new {{label}}",
    "namePlaceholder": "Filename (no extension, {{ext}} added automatically)",
    "errorNameRequired": "Please enter a filename",
    "errorNamePattern": "Only alphanumerics / hyphens / underscores allowed (no spaces; the extension is added automatically)",
    "errorExists": "{{filename}} already exists. Please choose a different name",
    "hint": "After creating, the editor opens. A skeleton (frontmatter + main function) is prefilled — edit it and save."
  },
  "delete": {
    "failed": "Failed to delete {{path}}"
  },
  "mcp": {
    "title": "MCP servers",
    "intro": "Register MCP servers and manage their connections and settings in one place. OAuth credentials and API keys are stored encrypted with AES-256-GCM.",
    "loading": "Loading…",
    "globalServers": "Global servers",
    "sharedAcrossUsers": "Shared across all users",
    "personalServers": "Personal servers",
    "empty": "No MCP servers registered yet. Add one with the button below.",
    "addGlobalHeading": "Add a global server",
    "addPersonalHeading": "Add a personal server",
    "addPersonal": "+ Add personal server",
    "addGlobal": "+ Add global server",
    "toolCount": "{{count}} tools",
    "scope": {
      "global": "global",
      "personal": "personal"
    },
    "connection": {
      "apiKeyConnected": "API key connected",
      "apiKeyMissing": "API key not set",
      "oauthConnected": "OAuth connected",
      "connect": "Connect"
    },
    "row": {
      "disconnect": "Disconnect",
      "refreshTools": "Refresh tools",
      "edit": "Edit",
      "delete": "Delete"
    },
    "form": {
      "id": "ID (slug, e.g. canva)",
      "name": "Display name",
      "url": "MCP URL (https://...)",
      "authKind": "Authentication method",
      "oauthClientId": "OAuth client_id",
      "oauthClientSecretEdit": "OAuth client_secret (leave blank to keep current)",
      "oauthClientSecret": "OAuth client_secret",
      "scopes": "scopes (space-separated, optional)",
      "apiKeyEdit": "API key (leave blank to keep current)",
      "apiKey": "API key / token",
      "authHeaderName": "Auth header name (optional — blank means Authorization: Bearer)",
      "authHeaderHelp": "When set, the token is sent verbatim under this header name (no Bearer prefix). Example: NocoDB uses <code>xc-mcp-token</code>.",
      "saving": "Saving…",
      "update": "Update",
      "add": "Add",
      "cancel": "Cancel"
    },
    "confirmDeleteGlobal": "Delete {{id}}? All users' tokens will also be revoked.",
    "confirmDeletePersonal": "Delete {{name}}?",
    "confirmDisconnect": "Disconnect {{name}}?",
    "saveFailed": "Save failed: {{error}}",
    "refreshFailed": "Tool refresh failed: {{error}}"
  },
  "memory": {
    "title": "memory/",
    "intro": "The agent's persistent fact store. MEMORY.md (the index) is auto-injected into the system prompt at task startup. View reflection (auto-learning) run history and revert under Settings → Reflection history.",
    "entriesTitle": "Memory entries",
    "entriesSubtitle": "Persistent information injected into every agent session.",
    "newEntry": "+ New entry",
    "filterAll": "All",
    "searchPlaceholder": "Search memory (name, description, body)",
    "noMatches": "No memory entries match your filter.",
    "expand": "Show full",
    "collapse": "Collapse",
    "loading": "Loading…",
    "loadFailed": "Failed to load memory entries: {{error}}",
    "fetchFailed": "Failed to load memory entries ({{status}})",
    "emptyTitle": "No memory entries yet.",
    "emptyHint": "The reflection engine adds them automatically after tasks complete. You can also add them manually.",
    "edit": "Edit",
    "delete": "Delete",
    "confirmDelete": "Delete memory entry \"{{name}}\"?",
    "deleteFailed": "Failed to delete \"{{name}}\": {{error}}",
    "modal": {
      "newTitle": "New memory entry",
      "editTitle": "Edit — {{name}}",
      "closeAria": "Close",
      "name": "Name",
      "nameHint": "(alphanumerics, hyphens, underscores)",
      "description": "Description",
      "descriptionPlaceholder": "A one-line description shown in the memory list",
      "type": "Type",
      "typeHelp": "user: your own preferences and roles ／ feedback: past feedback and lessons ／ project: per-project context ／ reference: reference material and external info",
      "body": "Body",
      "bodyPlaceholder": "Markdown or plain text…",
      "cancel": "Cancel",
      "saving": "Saving…",
      "save": "Save"
    },
    "rejection": {
      "badName": "Name is invalid (alphanumerics, hyphens, underscores; 1–64 characters)",
      "badDescription": "A description is required, on a single line",
      "unknownType": "Type must be one of user / feedback / project / reference",
      "badBody": "Body must be a string",
      "bodyTooLarge": "Body exceeds the allowed size",
      "badRequest": "The request format is invalid"
    }
  },
  "ssh": {
    "title": "SSH connections",
    "disabled": "The SSH subsystem is disabled. Set <code>ssh.enabled: true</code> in <code>config.yaml</code> and the <code>MCP_ENCRYPTION_KEY</code> environment variable, then restart the server.",
    "intro": "Manage the SSH connections used by the agent's SshExec / SshUpload / SshDownload tools.",
    "create": "+ New",
    "loadFailed": "Failed to load: {{error}}",
    "newHeading": "New SSH connection",
    "ownSection": "Your connections",
    "ownEmpty": "No connections yet. Register one with \"+ New\".",
    "globalSection": "Global connections (info-only)",
    "globalNote": "Shared connections registered by an admin. They are only usable from tools when a grant is configured on the piece.",
    "toast": {
      "created": "SSH connection created",
      "updated": "SSH connection updated",
      "deleted": "SSH connection deleted",
      "deleteFailed": "Delete failed",
      "testFailed": "Test failed",
      "publicKeyFetchFailed": "Failed to fetch public key",
      "publicKeyFetchFailedShort": "Public key fetch failed",
      "hostKeyMatch": "Host key matches ({{fingerprint}}…)",
      "algNotAllowed": "The host key algorithm is not in the allow list",
      "hostKeyVerified": "Host key verified"
    },
    "row": {
      "reasonLabel": "Reason: {{reason}}",
      "testing": "Testing…",
      "test": "Test",
      "publicKeyTitle": "Show the public key to add to authorized_keys",
      "fetching": "Fetching…",
      "publicKey": "Public key",
      "edit": "Edit",
      "delete": "Delete",
      "adminDisabled": "admin-disabled",
      "disabled": "disabled",
      "remoteUnrestricted": "remote: unrestricted",
      "privateAddrs": "private addrs"
    },
    "confirmDelete": "Delete connection \"{{label}}\"?",
    "hostKey": {
      "verified": "host-key verified",
      "pending": "host-key pending",
      "untested": "host-key untested"
    },
    "copyUuid": {
      "title": "Click to copy the UUID: {{value}}",
      "copied": "✓ Copied"
    }
  },
  "sshForm": {
    "label": "Label",
    "labelPlaceholder": "prod-db (any display name)",
    "username": "Username",
    "host": "Host",
    "port": "Port",
    "keypairSource": "Key source",
    "useExisting": "Paste an existing private key",
    "useExistingHelp": "Upload a key you already created with <code>ssh-keygen</code> locally.",
    "generate": "Generate a new one in the Orchestrator",
    "generateHelp": "The Orchestrator holds the private key, and the public key is shown after creation. Add it to the target's <code>~/.ssh/authorized_keys</code>.",
    "keyType": "Key type",
    "keyTypeEd25519": "Ed25519 (recommended)",
    "keyTypeRsa": "RSA 4096-bit (for compatibility)",
    "privateKey": "Private Key (PEM)",
    "privateKeyEditSuffix": "  ←  leave blank to keep the current key",
    "privateKeyHelp": "Encrypted server-side with AES-256-GCM on save. SHA1-based RSA keys are rejected on detection.",
    "passphrase": "Passphrase  ←  only when the key is encrypted",
    "remotePathPrefix": "Remote Path Prefix",
    "remotePathHelp": "File operations (Upload/Download) are confined under this prefix.",
    "commandDeny": "Command Deny Patterns (1 regex per line)",
    "commandAllow": "Command Allow Patterns (empty = allow all)",
    "adminFlags": "Admin-only flags",
    "allowRemoteUnrestricted": "Allow remote unrestricted",
    "allowRemoteUnrestrictedHelp": "Disables the Remote Path Prefix. Only when truly necessary.",
    "allowPrivateAddresses": "Allow private addresses",
    "allowPrivateAddressesHelp": "Allows connecting to RFC1918 / localhost. Loosens the SSRF guard.",
    "reason": "Reason (≥ 8 chars; recorded in the audit log)",
    "reasonPlaceholder": "Adding a new global connection for staging",
    "cancel": "Cancel",
    "saving": "Saving…",
    "create": "Create",
    "update": "Update"
  },
  "sshPublicKey": {
    "title": "Public key",
    "freshlyGenerated": "A new key was generated in the Orchestrator. Add the public key below to the target's <code>~/.ssh/authorized_keys</code>.",
    "existing": "This is the public key for the private key this connection holds. Authentication will fail unless the same line is registered in the target's <code>~/.ssh/authorized_keys</code>.",
    "lineLabel": "The single line to add to authorized_keys",
    "troubleshoot": "If the SSH connection test reports \"All configured authentication methods failed\", first check that this value is registered in the target's <code>authorized_keys</code>.",
    "copied": "Copied",
    "copy": "Copy",
    "close": "Close"
  },
  "sshHostKey": {
    "recordTitle": "Record host key",
    "replaceTitle": "Replace host key",
    "recordDesc": "Please confirm the host key observed on first contact.",
    "replaceDesc": "⚠️ This differs from the recorded host key. Verify carefully, including the possibility of a MITM.",
    "reason": "Reason (≥ 8 chars)",
    "reasonPlaceholder": "Replacing because the host OS was rebuilt",
    "cancel": "Cancel",
    "saving": "Saving…",
    "record": "Record",
    "replace": "Replace"
  },
  "pets": {
    "title": "Codex Pets",
    "intro": "Import a Codex Pets-compatible zip and show it at the bottom-right of the Chat screen. Settings and pets are stored per user.",
    "importing": "Importing…",
    "importButton": "Import pet zip",
    "imported": "{{name}} imported",
    "importFailed": "Pet import failed: {{error}}",
    "settingsSaveFailed": "Failed to save pet settings: {{error}}",
    "deleteFailed": "Failed to delete pet: {{error}}",
    "loadFailed": "Failed to load: {{error}}",
    "spriteAlt": "pet",
    "showInChat": "Show on Chat screen",
    "showToolSpark": "Show Tool Spark",
    "reduceMotion": "Reduce motion",
    "size": "Size",
    "workers": "Workers ({{count}})",
    "workerHintTopology": "Review worker / GPU pool configuration",
    "workerHintAssign": "Assign a pet to display per worker",
    "noPetsImportHint": "Import a pet to assign one per worker / backend.",
    "defaultWorker": "default (unassigned)",
    "defaultWorkerSub": "same as activePetId",
    "none": "(none)",
    "proxyDefaultTitle": "proxy default (used when no backend has its own mapping)",
    "proxyDefaultOption": "(none / default)",
    "backendListFailed": "Failed to fetch backend list: {{error}}",
    "backendNotFound": "No backends found (proxy /v1/models is empty)",
    "noPetsYet": "No pets yet. Import a zip containing `pet.json` and images.",
    "makeDefault": "Make default",
    "delete": "Delete",
    "confirmDelete": "Delete {{name}}?"
  },
  "browserSessions": {
    "title": "Browser sessions",
    "add": "Add a site session",
    "intro": "Stores cookies / storageState after login, encrypted per user, so browser macros can reference it by <code>session_profile_id</code>. Saved sessions are not shared with other users.",
    "loading": "Loading…",
    "emptyTitle": "No saved sessions yet.",
    "emptyHint": "Get started with the \"Add a site session\" button above.",
    "status": {
      "pending": "Pending",
      "active": "Active",
      "expired": "Expired",
      "revoked": "Revoked",
      "error": "Error"
    },
    "saved": "Saved: {{time}}",
    "notSaved": "Not saved",
    "lastUsed": " · Last used: {{time}}",
    "test": "Test",
    "reLogin": "Re-login",
    "delete": "Delete",
    "confirmDelete": "Delete {{label}}?",
    "dialog": {
      "novncTitle": "noVNC — login: {{label}}",
      "novncTitleNoLabel": "noVNC — login",
      "reLoginTitle": "Re-login: {{label}}",
      "addTitle": "Add a browser session",
      "label": "Label",
      "startUrl": "Start URL",
      "loggedInSelector": "Logged-in selector (optional)",
      "loginUrlPattern": "Login URL pattern (optional)",
      "cancel": "Cancel",
      "openLoginWindow": "Open login window",
      "pipShown": "Showing in the PiP window. Close it to return here.",
      "loginPrompt": "Log in using the window above, and click \"Save\" when done.",
      "save": "Save",
      "savingState": "Saving…",
      "doneState": "Saved.",
      "close": "Close"
    }
  },
  "agentsMd": {
    "loadFailed": "Failed to load: {{error}}",
    "title": "AGENTS.md",
    "intro": "Persistent, user-specific instructions automatically injected into the system prompt at task startup. Max 64KB.",
    "delete": "Delete",
    "confirmDelete": "Delete AGENTS.md?"
  }
}
