{
  "common": {
    "save": "Save",
    "cancel": "Cancel",
    "confirm": "Confirm",
    "delete": "Delete",
    "edit": "Edit",
    "back": "Back",
    "next": "Next",
    "loading": "Loading...",
    "prev": "Prev",
    "public": "Public",
    "private": "Private",
    "limited": "Limited access",
    "required": "Required",
    "set": "Set",
    "skills": "skills",
    "skill": "skill",
    "found": "found",
    "by": "by",
    "clearSearch": "Clear Search",
    "close": "Close",
    "gotIt": "Got it",
    "remove": "Remove",
    "unsavedChanges": "Unsaved changes",
    "aria": {
      "dismissNotification": "Dismiss notification",
      "notifications": "Notifications",
      "categoryDescriptions": "Category descriptions",
      "closeDrawer": "Close drawer"
    }
  },
  "nav": {
    "home": "Home",
    "registry": "Registry",
    "build": "Build",
    "docs": "Docs",
    "news": "News",
    "contact": "Contact",
    "signIn": "Sign In",
    "signOut": "Sign Out",
    "settings": "Settings",
    "adminPanel": "Admin Panel",
    "redeemCode": "Redeem code",
    "goToNyxId": "Go to NyxID",
    "createSkill": "Create Skill",
    "lightMode": "Light Mode",
    "darkMode": "Dark Mode",
    "myProfile": "My Profile",
    "myOrgs": "My Organizations",
    "myServices": "My Services",
    "adminServices": "Admin Services",
    "admin": {
      "broadcasts": "Broadcasts"
    }
  },
  "breadcrumb": {
    "ornn": "ornn",
    "publicSkills": "public skills",
    "mySkills": "my skills",
    "createSkill": "create skill",
    "guided": "guided",
    "upload": "upload",
    "generate": "generate",
    "editSkill": "edit skill",
    "playground": "playground",
    "settings": "settings",
    "docs": "docs",
    "admin": "admin",
    "categories": "categories",
    "tags": "tags",
    "auditHistory": "Audit history"
  },
  "explore": {
    "systemSkills": "System Skills",
    "publicSkills": "Public Skills",
    "mySkills": "My Skills",
    "sharedWithMe": "Shared With Me",
    "noSkillsFound": "No skills found",
    "noSharedSkills": "No one has shared a skill with you yet.",
    "tryAdjusting": "Try adjusting your search, or upload the first skill.",
    "noSkillsYet": "No skills yet",
    "createFirst": "Create your first skill to get started",
    "uploadSkill": "Upload Skill",
    "createSkill": "Create Skill"
  },
  "mySkills": {
    "searchPlaceholder": "Search your skills...",
    "skillsFound": "{{count}} {{unit}} found",
    "noMatching": "No matching skills",
    "tryAdjusting": "Try adjusting your search",
    "noSkillsYet": "No skills yet",
    "createFirst": "Create your first skill to get started",
    "deleteTitle": "Delete Skill?",
    "deleteConfirm": "Are you sure you want to delete <strong>{{name}}</strong>? This action cannot be undone.",
    "deleteSuccess": "Skill deleted successfully",
    "deleteFailed": "Failed to delete skill"
  },
  "skillInstallCard": {
    "title": "Install",
    "subtitle": "Drop this skill into your own agent with one of the two flows below.",
    "tablistAria": "Install method",
    "tabPrompt": "Via prompt",
    "tabNpx": "Via npx",
    "promptHelper": "Copy the block below and paste it into your agent — it instructs the agent to fetch and install this skill from Ornn.",
    "npxHelper": "Mirrored to GitHub for one-line installation in any agent harness.",
    "npxNotAvailablePrivate": "Not available — private skills are never mirrored to GitHub. Use the prompt flow instead.",
    "npxNotAvailableMirrorOff": "Not available — this deployment doesn't have the GitHub mirror configured. Use the prompt flow instead.",
    "copy": "Copy",
    "copied": "Copied",
    "copyPromptAria": "Copy install prompt",
    "copyNpxAria": "Copy install command",
    "viewOnGithub": "View on GitHub",
    "synced": "Synced",
    "lagging": "Lagging",
    "pending": "Pending first sync",
    "lastSync": "Last sync",
    "commit": "Commit"
  },
  "skillDetail": {
    "packageContents": "Package Contents",
    "description": "Description",
    "tags": "Tags",
    "author": "Author",
    "created": "Created",
    "updated": "Updated",
    "visibility": "Visibility",
    "sharedWithSummary": "Shared with {{users}} users, {{orgs}} orgs",
    "tryPlayground": "Try in Playground",
    "managePermissions": "Manage permissions",
    "startAuditing": "Start Auditing",
    "auditStartedTitle": "Audit started",
    "auditStartedBody": "We're running the audit in the background. It takes around 20–30 seconds — when it's done, a new entry will appear in the Audit history card below. You can close this dialog and keep working.",
    "auditDone": "Audit complete — verdict {{v}}, score {{s}}/10",
    "makePublic": "Make Public",
    "makePrivate": "Make Private",
    "saveChanges": "Save Changes",
    "saveConfirm": "Save your changes to {{name}}?",
    "skipValidation": "Skip validation",
    "skipDescription": "Upload without checking format rules",
    "deleteTitle": "Delete Skill",
    "deleteConfirm": "Are you sure you want to delete <strong>{{name}}</strong>? This action cannot be undone.",
    "updateSuccess": "Skill updated",
    "saveFailed": "Failed to save package",
    "deleteSuccess": "Skill deleted",
    "deleteFailed": "Failed to delete skill",
    "nowPublic": "Skill is now public",
    "nowPrivate": "Skill is now private",
    "visibilityFailed": "Failed to update visibility",
    "notFound": "Skill Not Found",
    "notFoundDesc": "The skill you are looking for does not exist.",
    "backToExplore": "Back to Explore",
    "failedPackage": "Failed to load package contents.",
    "noPackage": "No package contents available.",
    "downloadSkill": "Download Package",
    "tryWithCli": "Try with Nyx CLI",
    "version": "Version",
    "versions": "Versions",
    "latest": "latest",
    "deprecated": "deprecated",
    "deprecationWarning": "This version is marked deprecated by the author. Pin to a newer version if possible.",
    "deprecationBannerTitle": "Version {{version}} is deprecated",
    "deprecationBannerBody": "Author note: {{note}}",
    "viewLatest": "Switch to latest ({{version}})",
    "markDeprecated": "Mark deprecated",
    "unmarkDeprecated": "Undeprecate",
    "deprecationModalTitle": "Deprecation for version {{version}}",
    "deprecationNoteLabel": "Note (optional)",
    "deprecationNotePlaceholder": "Reason, migration path, or replacement version…",
    "deprecationUpdated": "Deprecation status updated",
    "deprecationFailed": "Failed to update deprecation status",
    "auditBannerNotAudited": "v{{v}} has not been audited yet. Owners share with permission gates that read this audit.",
    "auditBannerYellow": "Audit verdict for v{{v}} is YELLOW ({{score}}/10). Some findings flagged.",
    "auditBannerRed": "Audit verdict for v{{v}} is RED ({{score}}/10). Use with caution.",
    "deleteVersion": "Delete this version",
    "deleteVersionBlockedOnly": "Can't delete the only remaining version. Use 'Delete skill' in the danger zone instead.",
    "deleteVersionBlockedLatest": "Can't delete the current latest version. Publish a newer version first, then delete this one.",
    "deleteVersionTitle": "Delete v{{version}}?",
    "deleteVersionConfirm": "Are you sure you want to delete v{{version}}? The version's package zip and audit history are removed and this cannot be undone.",
    "versionDeleted": "Version v{{version}} deleted",
    "versionDeleteFailed": "Failed to delete version",
    "heroAuditNone": "Not audited",
    "heroAuditPass": "Pass",
    "heroAuditWarn": "Caution",
    "heroAuditFail": "Risk",
    "heroAuditPill": "Audit {{score}} · {{label}}",
    "heroPulls7d": "{{n}} pulls · 7d",
    "heroPublishedOn": "Published {{date}}",
    "heroUpdatedOn": "Updated {{date}}",
    "heroTagsMore": "+{{n}} more",
    "heroTryPlayground": "Try in Playground",
    "heroDownload": "Download package",
    "heroEditSkill": "Edit skill",
    "tabContent": "Skill content",
    "tabAuditHistory": "Audit history",
    "cardAudit": "Audit",
    "cardVisibility": "Visibility",
    "cardVersions": "Versions",
    "cardDanger": "Danger zone",
    "auditLast": "Last audited {{date}}",
    "auditNoneYet": "Not audited yet for this version.",
    "auditNone": "Not audited",
    "auditPassLabel": "Pass · low risk",
    "auditWarnLabel": "Caution",
    "auditFailLabel": "Risk",
    "startNewAudit": "Start new audit",
    "shareUsers": "users",
    "shareOrgs": "organizations",
    "versionsTotal": "{{n}} versions total",
    "browseVersions": "Browse all versions",
    "hideVersions": "Hide all versions",
    "dangerExplain": "Permanently delete this skill and every version. This cannot be undone.",
    "deleteSkill": "Delete skill",
    "metaCategory": "Category",
    "metaTags": "Tags",
    "metaSource": "Source",
    "metaUpdated": "Updated",
    "metaGuid": "GUID",
    "metaLicense": "License",
    "metaCompatibility": "Compatibility",
    "cardMetadata": "Metadata",
    "cardAdvanced": "Advanced options",
    "guidCopied": "GUID copied",
    "auditRunning": "Audit in progress",
    "auditRunningHint": "Scoring against the audit engine — this usually takes 30–60 seconds."
  },
  "editSkill": {
    "backToSkill": "Back to {{name}}",
    "titlePrefix": "EDIT",
    "visibilityHeading": "Visibility",
    "currentVisibility": "Current visibility:",
    "badgePrivate": "Private",
    "badgePublic": "Public",
    "privateDesc": "Only you can see this skill. Make it public to share with others.",
    "publicDesc": "This skill is visible to everyone. Make it private to hide it.",
    "makePublic": "Make Public",
    "makePrivate": "Make Private",
    "updatePackageHeading": "Update Package",
    "updatePackageDesc": "Upload a new ZIP package to replace the current skill contents. Tags, description, and metadata are extracted from the SKILL.md inside the ZIP.",
    "selectZip": "Click to select a .zip file",
    "zipSizeHint": ".zip files up to 50 MB",
    "uploadPackage": "Upload Package",
    "nowPublic": "Skill is now public",
    "nowPrivate": "Skill is now private",
    "visibilityFailed": "Failed to update visibility",
    "packageUpdated": "Skill package updated",
    "packageFailed": "Failed to update package",
    "notFound": "Skill not found"
  },
  "audit": {
    "historyHeading": "Audit history",
    "historyLoading": "Loading audit history…",
    "historyError": "Could not load audit history.",
    "historyEmpty": "No audits recorded yet.",
    "historyEmptyForVersion": "No audits for v{{v}} yet.",
    "historyForVersion": "{{n}} audit(s) for v{{v}}",
    "historyHeadingForVersion": "Audit history · v{{v}}",
    "historyCountWithRunning": "{{n}} record(s) — {{r}} running",
    "versionOne": "1 audited version",
    "versionMany": "{{n}} audited versions",
    "viewHistory": "View history",
    "backToSkill": "Back to skill",
    "notAuditedYet": "Not audited yet",
    "scoresHeading": "Scores by dimension",
    "findingsHeading": "Findings",
    "noFindings": "No findings — the auditor had nothing to flag.",
    "findingOne": "finding",
    "findingMany": "findings",
    "model": "Model",
    "triggeredBy": "Triggered by",
    "statusRunning": "Running",
    "statusFailed": "Failed",
    "runningHint": "Scoring against the audit engine…",
    "rerun": "Rerun",
    "runFirst": "Run audit",
    "triggeredByUnknown": "Unknown user"
  },
  "analytics": {
    "heading": "Usage analytics",
    "executions": "executions",
    "uniqueUsers": "unique users",
    "successRate": "success rate",
    "outcomeBreakdown": "Outcome breakdown",
    "topErrors": "Top errors",
    "loading": "Loading analytics…",
    "loadFailed": "Could not load analytics.",
    "unavailable": "Usage analytics are not available yet.",
    "usageHeading": "Skill Usage",
    "usageSubtitle": "Pulls over time. api = SDK / CLI / agent · web = detail-page download · playground = in-product trial.",
    "bucketHour": "Hour",
    "bucketDay": "Day",
    "bucketMonth": "Month",
    "totalPulls": "Total",
    "noUsage": "No usage in this range."
  },
  "cookieConsent": {
    "stamp": "[ § ANALYTICS — CONSENT ]",
    "title": "We use cookies for product analytics.",
    "body": "We use a cookie to measure feature usage so we can improve the platform. Session replay is sampled with input fields masked. See our <privacyLink>Privacy Policy</privacyLink> for details. You can change your choice anytime in settings.",
    "decline": "Decline",
    "accept": "Accept"
  },
  "versionDiff": {
    "openButton": "Compare versions",
    "title": "Compare versions",
    "fromLabel": "From",
    "toLabel": "To",
    "summary": "{{added}} added · {{removed}} removed · {{modified}} modified · {{unchanged}} unchanged",
    "needTwoVersions": "This skill only has one version — there's nothing to compare yet.",
    "sameVersion": "Pick two different versions to see a diff.",
    "loading": "Computing diff…",
    "error": "Failed to compute diff.",
    "noChanges": "These two versions have identical files.",
    "addedHeading": "Added ({{count}})",
    "removedHeading": "Removed ({{count}})",
    "modifiedHeading": "Modified ({{count}})",
    "added": "added",
    "removed": "removed",
    "modified": "modified",
    "binaryHint": "Binary file. {{from}} → {{to}} (hash {{fromHash}} → {{toHash}})",
    "binaryAdded": "Binary file ({{size}}).",
    "binaryRemoved": "Binary file ({{size}}).",
    "truncated": "File content truncated at 64 KiB per side."
  },
  "notifications": {
    "bellAria": "Notifications",
    "title": "Notifications",
    "empty": "No notifications yet.",
    "noUnread": "No unread notifications.",
    "loading": "Loading…",
    "loadFailed": "Could not load notifications.",
    "markAllRead": "Mark all read",
    "showUnreadOnly": "Show unread only",
    "showAll": "Show all",
    "viewAll": "View all",
    "broadcast": {
      "tag": "Broadcast",
      "modal": {
        "aria": "Broadcast notification details"
      }
    },
    "detail": {
      "modal": {
        "aria": "Notification details"
      }
    }
  },
  "permissions": {
    "title": "Permissions",
    "levelPublic": "Public access",
    "levelLimited": "Limited access",
    "levelPrivate": "Private access",
    "publicTitle": "Public",
    "publicDesc": "Anyone on Ornn can find and use this skill, including unauthenticated visitors.",
    "orgsTitle": "Shared with organizations",
    "orgsDesc": "Every admin and member of a checked org can see and use this skill.",
    "usersTitle": "Shared with specific users",
    "usersDesc": "Search by email. Only users who have signed into Ornn appear here.",
    "privateTitle": "Private",
    "privateDesc": "Only you and platform admins can see this skill. Active when nothing above is set.",
    "searchPlaceholder": "type an email to find a user...",
    "removeUser": "Remove",
    "noOrgs": "No organizations to choose from.",
    "noUsersYet": "No users added yet.",
    "notMember": "not member",
    "noChanges": "No changes to save.",
    "saveSuccess": "Permissions updated"
  },
  "platformSettings": {
    "title": "Platform settings",
    "subtitle": "Platform-wide knobs that affect every owner and reviewer. Changes take effect on the next audit run.",
    "loading": "Loading…",
    "loadFailed": "Could not load platform settings.",
    "auditThresholdLabel": "Audit waiver threshold",
    "auditThresholdHint": "Audit overall score at or above this cutoff auto-grants a new share. Below it, the grant becomes a waiver request that the owner must justify and a reviewer must approve.",
    "auditThresholdInvalid": "Must be a number between 0 and 10.",
    "saved": "Platform settings saved."
  },
  "playground": {
    "selectSkill": "Select a skill to try in the playground.",
    "browseSkills": "Browse Skills",
    "clearChat": "Clear Chat",
    "fillEnvVars": "Fill in the required environment variables on the right to start chatting.",
    "askAbout": "Ask me anything about \"{{name}}\" or tell me to run it.",
    "envVars": "Environment Variables",
    "envVarsDesc": "This skill requires the following environment variables. Fill them in before chatting.",
    "envVarsLockHint": "Chat is locked until every required env var has a value.",
    "enterValue": "Enter value...",
    "noPackage": "No package contents",
    "fillFirst": "Fill in env vars to start chatting...",
    "askPlaceholder": "Ask about \"{{name}}\" or tell me to run it...",
    "heroTitle": "Probe the skill.",
    "heroSubtitle": "Ask anything about {{name}}, or have it run with sample input.",
    "heroEnvFirst": "Set the runtime env vars in the Env drawer on the right, then start chatting.",
    "starter1Label": "Walk me through it",
    "starter1Body": "Walk me through what `{{name}}` does and the main ways I'd use it.",
    "starter2Label": "Show an example",
    "starter2Body": "Give me a concrete usage example for `{{name}}` — make up sample input and run it.",
    "starter3Label": "List capabilities",
    "starter3Body": "List every capability `{{name}}` exposes, with a one-line description for each.",
    "drawerHint": "Skill · Env · Package on the right edge",
    "kbHint": "Enter to send · Shift + Enter for newline",
    "tabSkill": "Skill",
    "tabEnv": "Env",
    "tabPackage": "Package",
    "pin": "Pin",
    "unpin": "Unpin",
    "pinned": "Pinned",
    "aboutThisSkill": "About",
    "tags": "Tags",
    "openDetail": "Skill page",
    "openInRegistry": "Open in registry →"
  },
  "upload": {
    "chooseMode": "Choose how you want to create your skill",
    "guidedTitle": "Guided Mode",
    "guidedDesc": "Step-by-step wizard that guides you through creating a skill. Perfect for beginners or structured authoring.",
    "guidedBullets": [
      "Step-by-step form",
      "Markdown editor with preview",
      "Folder-based file uploads",
      "Full package preview"
    ],
    "startGuided": "Start",
    "freeTitle": "Free Mode",
    "freeDesc": "Upload a pre-built skill package as a ZIP file. Best for experienced authors with existing skills.",
    "freeBullets": [
      "ZIP file upload",
      "Structure validation",
      "Auto-metadata extraction",
      "Preview before upload"
    ],
    "startFree": "Start",
    "genTitle": "Generative Mode",
    "genDesc": "Describe what you need and let AI generate a complete skill for you. Refine with chat.",
    "genBullets": [
      "AI-powered generation",
      "Real-time streaming",
      "Chat refinement",
      "Auto-structured output"
    ],
    "startGen": "Start",
    "githubTitle": "Import from GitHub",
    "githubDesc": "Pull a skill from a public GitHub repo. Later updates can be re-synced with one click.",
    "githubBullets": [
      "Public repos only",
      "Branch / tag / commit pinning",
      "One-click resync",
      "No ZIP packaging needed"
    ],
    "startGithub": "Import"
  },
  "guided": {
    "backToModes": "Back to mode selection",
    "header": "CREATE SKILL",
    "headerDesc": "Follow the steps below to create a new skill",
    "stepBasic": "Basic Info",
    "stepBasicDesc": "Name, category & tags",
    "stepContent": "Content",
    "stepContentDesc": "SKILL.md body",
    "stepFiles": "Files",
    "stepFilesDesc": "Scripts & assets",
    "stepPreview": "Preview",
    "stepPreviewDesc": "Review & create",
    "createSkill": "Create Skill",
    "saveSuccess": "Skill \"{{name}}\" saved to My Skills",
    "saveFailed": "Failed to create skill",
    "basicTitle": "Basic Information",
    "skillName": "Skill Name",
    "skillNamePlaceholder": "my-awesome-skill",
    "descLabel": "Description",
    "descPlaceholder": "A brief description of what this skill does (min 10 chars)",
    "categoryLabel": "Category",
    "selectCategory": "Select category",
    "outputType": "Output Type",
    "textStdout": "Text (stdout)",
    "fileArtifact": "File (artifact)",
    "selectOutputType": "Select output type",
    "runtimeDeps": "Runtime Dependencies (optional)",
    "runtimeDepsPlaceholder": "npm package name + Enter",
    "runtimeDepsHelper": "npm packages required by runtime scripts (e.g., axios, lodash)",
    "envVars": "Environment Variables (optional)",
    "envVarsPlaceholder": "ENV_VAR_NAME + Enter",
    "envVarsHelper": "Must be UPPER_SNAKE_CASE (e.g., API_KEY, SECRET_TOKEN)",
    "envVarsValidation": "Must be UPPER_SNAKE_CASE",
    "license": "License (optional)",
    "licensePlaceholder": "MIT, Apache-2.0, etc.",
    "compatibilityLabel": "Compatibility (optional)",
    "compatibilityPlaceholder": "claude-code >= 1.0",
    "advancedSettings": "Advanced Settings (Claude)",
    "disableModelInvocation": "Disable Model Invocation",
    "disableModelInvocationDesc": "Prevent the AI from invoking this skill as a sub-model call",
    "userInvocable": "User Invocable",
    "userInvocableDesc": "Allow users to directly invoke this skill",
    "allowedTools": "Allowed Tools",
    "allowedToolsPlaceholder": "Tool name + Enter",
    "allowedToolsHelper": "Tools this skill is allowed to use (Claude spec)",
    "modelLabel": "Model",
    "modelPlaceholder": "claude-sonnet-4-20250514",
    "contextPaths": "Context Paths",
    "contextPathsPlaceholder": "./path/to/file + Enter",
    "contextPathsHelper": "File paths to include as context for the skill",
    "agentLabel": "Agent",
    "agentPlaceholder": "agent-identifier",
    "argumentHint": "Argument Hint",
    "argumentHintPlaceholder": "Provide a file path or URL",
    "contentTitle": "Skill Content",
    "contentDesc": "Write the body content for your SKILL.md. This will appear below the auto-generated YAML frontmatter.",
    "contentLabel": "SKILL.md Body",
    "contentPlaceholder": "# My Skill\n\nDescribe what this skill does, how to use it, and provide examples...",
    "filesTitle": "Supporting Files (Optional)",
    "filesDesc": "Upload script files, reference docs, or assets to specific folders. SKILL.md is auto-generated from your metadata and content.",
    "previewTitle": "Review & Create",
    "dropHint": "Drop file here or click to browse",
    "noFiles": "(no files)",
    "remove": "Remove"
  },
  "generative": {
    "backToModes": "Back to mode selection",
    "title": "GENERATE SKILL",
    "desc": "Describe the skill you need and AI will generate it for you. You can refine it with follow-up messages.",
    "note": "Generated skills are plain or runtime-based only.",
    "placeholder": "Generating...",
    "askPlaceholder": "Describe the skill you want to create…",
    "emptyPreview": "Generate a skill to preview its contents",
    "emptyPreviewHero": "Package preview lands here once the model drafts a skill.",
    "emptyPreviewHint": "Send a prompt on the left to start.",
    "startOver": "Start over",
    "saveSkill": "Save skill",
    "fixErrors": "Fix frontmatter validation errors before saving",
    "saveSuccess": "Skill \"{{name}}\" saved to My Skills",
    "saveFailed": "Failed to create skill",
    "eyebrow": "Generative skill builder",
    "heroTitle": "Describe a skill. Build it.",
    "heroSubtitle": "Tell the model what the skill should do. It drafts the package; you iterate; you save.",
    "drawerHint": "Package preview + Save on the right edge",
    "tabPackage": "Package",
    "pin": "Pin",
    "unpin": "Unpin",
    "pinned": "Pinned",
    "validationTitle": "Validation Errors",
    "starter1Label": "Slack notifier",
    "starter1Body": "Build a skill that posts a formatted message to a Slack channel via webhook. Take channel + message as inputs.",
    "starter2Label": "Fetch GitHub PRs",
    "starter2Body": "Build a skill that lists open pull requests for a given GitHub repo, sorted by latest activity.",
    "starter3Label": "CSV → JSON",
    "starter3Body": "Build a skill that reads a CSV file and outputs a JSON array, inferring types per column."
  },
  "free": {
    "backToModes": "Back to mode selection",
    "title": "UPLOAD SKILL PACKAGE",
    "subtitle": "Upload a pre-built skill as a .zip file",
    "dropzone": "Drag & drop a .zip file or click to browse",
    "maxSize": ".zip files up to 50 MB",
    "changeFile": "Choose a different file",
    "validating": "Validating package structure...",
    "valid": "Package structure is valid.",
    "validWithErrors": "Package structure is valid, but frontmatter has validation errors. Fix them before uploading.",
    "onlyZip": "Only .zip files are accepted.",
    "tooLarge": "File exceeds the maximum size of 50 MB ({{size}}).",
    "skipValidation": "Skip validation",
    "uploadSkill": "Upload Skill",
    "uploadSuccess": "Skill \"{{name}}\" uploaded successfully",
    "uploadFailed": "Failed to upload skill"
  },
  "settings": {
    "title": "Settings",
    "subtitle": "Manage your account",
    "signOut": "Sign Out",
    "accountMgmt": "Account Management",
    "accountDesc": "Your profile, LLM credentials, and security settings are managed through NyxID.",
    "openNyxID": "Open NyxID Settings",
    "redeemCode": {
      "title": "Redeem code",
      "placeholder": "ENTER YOUR CODE",
      "codeAria": "Redemption code",
      "redeem": "Redeem",
      "helpText": "Got a code from the team? Enter it here to add quota to your account.",
      "added": "Added:",
      "activeUntil": "Active until end of month.",
      "dismissAria": "Dismiss",
      "dismiss": "Dismiss",
      "recentlyRedeemed": "Recently redeemed"
    }
  },
  "login": {
    "eyebrow": "[ § ENTRY — NYXID ]",
    "tagline": "Skill life-cycle for AI agents",
    "desc": "Sign in with your NyxID account to access the platform.",
    "loginBtn": "Login with NyxID",
    "terms": "By continuing, you agree to our Terms of Service and Privacy Policy."
  },
  "notFound": {
    "eyebrow": "[ § 404 — NOT FOUND ]",
    "code": "404",
    "message": "This sector of the grid does not exist.",
    "goHome": "Return to home"
  },
  "docs": {
    "onThisPage": "On this page",
    "notFound": "Not Found",
    "loadFailed": "Failed to fetch documentation.",
    "copyMarkdown": "Copy as markdown",
    "copyMarkdownHint": "Copy this whole document as markdown — paste it into your AI agent to install as a skill",
    "copied": "Copied"
  },
  "skillToggle": {
    "makePrivateTitle": "Make Skill Private?",
    "makePublicTitle": "Make Skill Public?",
    "makePrivateDesc": "Are you sure you want to make this skill private? Other users will no longer be able to view it.",
    "makePublicDesc": "Are you sure you want to make this skill public? All users will be able to view it.",
    "nowPrivate": "Skill is now private. Only you can view it.",
    "nowPublic": "Skill is now public. All users can view it.",
    "failed": "Failed to update skill visibility"
  },
  "chatInput": {
    "model": "Model",
    "generating": "Generating response...",
    "awaitingTool": "Awaiting tool approval...",
    "placeholder": "Type a message... (Enter to send, Shift+Enter for newline)",
    "stopGeneration": "Stop generation",
    "sendMessage": "Send message"
  },
  "quota": {
    "surfacePlayground": "Playground",
    "surfaceSkillGen": "Skill-gen",
    "surfaceLabelPlayground": "playground",
    "surfaceLabelSkillGen": "skill-gen",
    "admin": "Admin",
    "adminUnlimited": "Unlimited {{surface}}",
    "chipAriaAdmin": "{{surface}} quota — admin unlimited",
    "chipTitleAdmin": "{{surface}} · Unlimited (admin bypass)",
    "chipAriaRemaining": "{{surface}} quota — {{remaining}} of {{ceiling}} remaining",
    "chipTitleRemaining": "{{surface}}: {{remaining}} / {{ceiling}} this month",
    "groupAriaLabel": "Quota usage",
    "warningHeading": "{{surface}} — {{percent}}% used this month",
    "warningBody": "{{remaining}} {{surface}} calls left{{adminGrant}}. Click the quota chip in the nav for full breakdown.",
    "warningAdminGrantSuffix": " (includes +{{value}} admin grant)",
    "callsLeft": "left",
    "grantSuffix": "+{{value}} grant"
  },
  "modelPicker": {
    "label": "Model",
    "defaultSuffix": " — default",
    "defaultBadge": "default",
    "loading": "Loading models…",
    "unavailable": "{{surface}} — temporarily unavailable. Contact admin.",
    "ariaPlayground": "Playground",
    "ariaSkillGen": "Skill Generation",
    "ariaTrigger": "{{label}}: {{selected}}",
    "ariaOptions": "{{label}} options"
  },
  "fileTree": {
    "files": "Files",
    "noFiles": "No files yet",
    "createFirst": "Create your first file",
    "newFile": "New file",
    "delete": "Delete"
  },
  "form": {
    "name": "Name",
    "namePlaceholder": "my-skill-name",
    "nameRequired": "Name is required",
    "description": "Description",
    "descPlaceholder": "What does this skill do?",
    "descRequired": "Description is required",
    "category": "Category",
    "selectCategory": "Select category",
    "categoryRequired": "Category is required",
    "outputType": "Output Type",
    "textStdout": "Text (stdout)",
    "fileArtifact": "File (artifact)",
    "selectOutputType": "Select output type",
    "license": "License",
    "licensePlaceholder": "MIT, Apache-2.0, etc.",
    "repoUrl": "Repository URL",
    "repoPlaceholder": "https://github.com/...",
    "invalidUrl": "Must be a valid URL",
    "uploadSkill": "Upload Skill",
    "saveChanges": "Save Changes",
    "tools": {
      "placeholder": "Type a tool name + Enter",
      "suggested": "Suggested:",
      "help": "Ensure that the tools you list are available in your target Claude client environment. Skills referencing unavailable tools will fail at runtime."
    }
  },
  "landing": {
    "scrollHint": "Scroll to equip ↓",
    "browseSkills": "Browse skills →",
    "publishYours": "Publish yours",
    "getStarted": "Get started",
    "themeLabel": "Theme",
    "themeLight": "Light",
    "themeDark": "Dark",
    "languageLabel": "Language",
    "languageEnglish": "English",
    "languageChinese": "中文",
    "launchPopup": {
      "eyebrow": "[§ LAUNCH — ORNN]",
      "date": "2026 · 05 · 13",
      "title": "To celebrate Ornn's official launch, we've set aside extra free credit for our users as a heartfelt thank-you.",
      "creditsLead": "First 500 users get",
      "credit1Number": "200",
      "credit1Title": "Playground",
      "credit1Caption": "Conversations · GPT-5.5",
      "credit2Number": "200",
      "credit2Title": "Skill Generation",
      "credit2Caption": "Conversations · GPT-5.5",
      "conditionsHeading": "How to redeem",
      "step1Before": "Star",
      "step1After": "on GitHub",
      "step2": "Sign in with the same GitHub account to claim your free credit.",
      "inviteLabel": "NyxID invite · first-time users",
      "inviteAria": "Copy NyxID invite code",
      "copy": "Copy",
      "copied": "Copied",
      "inviteHelp": "When you click Sign In (top-right of Ornn), you'll be redirected to NyxID — our identity provider — to complete login. On the NyxID page, paste this invite code into the invite field, then choose GitHub to finish sign-up.",
      "fulfillmentBefore": "Once you've signed in and starred the GitHub repository, your redemption code will be delivered to your notification inbox within 24 hours. Open the bell icon at the top-right of Ornn to view it, then apply it from your profile dropdown under \"Redeem code\". If you encounter any issues during redemption, please reach out on the",
      "fulfillmentLinkLabel": "Ornn discussions thread",
      "fulfillmentAfter": "for assistance.",
      "limitedSlots": "Limited slots — first come, first served.",
      "dismiss": "Dismiss",
      "cta": "Star on GitHub",
      "dismissAria": "Dismiss launch announcement"
    },
    "hero": {
      "headlineStart": "Start with",
      "headlineNothing": "nothing",
      "headlineEnd": "Ship with",
      "headlineEverything": "everything",
      "subhead": "The skill life-cycle manager for AI agents. Search, install, run, build, audit, and publish — one platform from spec to ship, without bolting six tools together.",
      "subheadStatic": "The skill life-cycle manager for AI agents — search, install, build, publish, audit. One platform, every runtime.",
      "finalLine1": "Your product. Your agent.",
      "finalLine2": "Fully equipped."
    },
    "why": {
      "headlineLine1": "Stop copy-pasting prompts.",
      "headlineLine2Start": "Install",
      "headlineLine2Highlight": "skills",
      "headlineLine2End": "like packages.",
      "pillarLabel": "Pillar",
      "pillar1Title": "Pull, don't paste.",
      "pillar1TitleHighlight": "don't",
      "pillar1Body": "Skills live on a versioned, audited registry — not in Slack threads or random gists. Pull on demand from inside your agent via {{cmd}}.",
      "pillar1Proof": "// versioned · audited · agent-ready",
      "pillar2Title": "Generate skills",
      "pillar2TitleLine2": "from a prompt.",
      "pillar2TitleHighlight": "from a prompt",
      "pillar2Body": "Describe the skill in plain English; {{cmd}} drafts a working SKILL.md you can iterate on, sandbox, and publish to the registry.",
      "pillar2Proof": "// ornn-build is itself a skill on the registry",
      "pillar3Title": "Portable by",
      "pillar3TitleLine2": "format.",
      "pillar3TitleHighlight": "format",
      "pillar3Body": "Platform-agnostic skill format with a sandbox playground (Node + Python) before you ship. NyxID-gated for anything that needs auth.",
      "pillar3Proof": "// chrono-sandbox · nyxid · audited"
    },
    "compare": {
      "headlineNot": "Not",
      "headlineThat": "that",
      "headlineThis": "This.",
      "subhead": "A few things ORNN is often confused with, and what makes it different.",
      "themHeader": "Often confused with",
      "themDescHeader": "What they do",
      "usHeader": "What ORNN does",
      "themLabel": "Them",
      "usLabel": "Ornn",
      "row1Them": "Ships pre-built tools Composio owns.",
      "row1UsPrefix": "Hosts skills",
      "row1UsHighlight": "anyone",
      "row1UsSuffix": "creates — you, your team, the world.",
      "row2Them": "Shares prompt templates.",
      "row2UsPrefix": "Shares",
      "row2UsHighlight": "executable skills",
      "row2UsSuffix": "with a sandboxed runtime and audited, versioned releases.",
      "row3Them": "Work only inside Claude.",
      "row3UsHighlight": "Open format",
      "row3UsSuffix": "— not Claude-locked. Skills travel with the agent that consumes them.",
      "row4Them": "Not a runtime — execution happens in the agent.",
      "row4UsPrefix": "ORNN is the",
      "row4UsHighlight": "registry",
      "row4UsSuffix": ". It finds, versions, and audits."
    },
    "install": {
      "headlineLine1Start": "One",
      "headlineLine1Highlight": "format",
      "headlineLine1End": ".",
      "headlineLine2": "Every agent.",
      "body": "Skills ship as plain markdown with manifest metadata — portable by design, with no glue code between runtimes. Today they pull into Claude Code; the format is open and agent-agnostic.",
      "surfacesLabel": "Targeted agent surfaces",
      "statusLive": "live today",
      "statusCompatible": "format-compatible"
    },
    "publish": {
      "headlineLine1": "Publish a skill",
      "headlineLine2": "in 60 seconds",
      "body": "You built something useful. Others need it too. Push to ORNN and it lives on the registry — versioned, audited, ready to pull into your agent.",
      "startPublishing": "Start publishing →",
      "readGuide": "Read the guide",
      "step1Title": "Describe the skill.",
      "step1Body": "Plain English.",
      "step2Title": "Test in the sandbox.",
      "step2BodyPrefix": "Run in",
      "step2BodySuffix": "(Node + Python). NyxID-gated for anything that needs auth.",
      "step3Title": "Audit & ship.",
      "step3Body": "One command. Versioned, audited, live on the registry."
    },
    "featured": {
      "headlineStart": "Skills,",
      "headlineHighlight": "freshly forged",
      "seeAll": "See all →",
      "alsoOnRegistry": "Also on the registry"
    },
    "footer": {
      "tagline": "The end-to-end skill life-cycle manager for AI agents.",
      "productHeading": "Product",
      "developersHeading": "Developers",
      "productBrowse": "Browse",
      "productPublish": "Publish",
      "productCli": "CLI",
      "productChangelog": "Changelog",
      "developersDocs": "Docs",
      "developersSkillFormat": "Skill format",
      "developersGitHub": "GitHub",
      "copyright": "© 2026 Chrono AI"
    }
  },
  "advancedOptions": {
    "title": "Advanced options",
    "navLabel": "Advanced settings",
    "nyxidServiceBinding": "Bind to NyxID Service",
    "githubLink": "Link to GitHub"
  },
  "githubLink": {
    "intro": "Point this skill at a folder in a public GitHub repo. Saving the link does not pull anything; click Sync afterwards to preview changes and publish a new version.",
    "urlLabel": "GitHub folder URL",
    "urlHelp": "Use the folder URL (the /tree/<ref>/<path> form). The skill's SKILL.md must be at the root of that folder. Default-branch and repo-root URLs work too.",
    "skipValidationLabel": "Skip Ornn package validation",
    "skipValidationHelp": "GitHub-hosted skills don't always follow Ornn's package rules; tick this if you trust the upstream and want syncs to succeed even when the validator would reject the layout.",
    "currentlyLinked": "Currently linked",
    "lastSyncedAt": "Last synced {{when}}",
    "neverSynced": "Linked but never synced.",
    "syncButton": "Sync from GitHub",
    "unlinkButton": "Unlink",
    "saveBeforeSync": "Save the URL change first, then sync.",
    "linkSuccess": "GitHub link saved",
    "unlinkSuccess": "GitHub link removed",
    "alreadyInSync": "Already in sync — no changes to pull from GitHub.",
    "syncSuccess": "Synced from GitHub — new version published.",
    "previewTitle": "Sync preview",
    "previewSubtitle": "Apply this sync to publish v{{version}} of {{name}} from the linked GitHub source.",
    "applySync": "Apply sync",
    "urlPlaceholder": "https://github.com/owner/repo/tree/main/path/to/skill"
  },
  "githubImport": {
    "title": "Import from GitHub",
    "subtitle": "Publish a skill from a folder in a public GitHub repo. Subsequent updates can be re-synced from the same link in one click.",
    "urlLabel": "GitHub folder URL",
    "urlHint": "Use the folder URL (the /tree/<ref>/<path> form). The skill's SKILL.md must sit at the root of that folder. Default-branch and repo-root URLs work too.",
    "urlInvalid": "Enter a github.com URL (e.g. https://github.com/owner/repo/tree/main/path).",
    "skipValidationLabel": "Skip Ornn package validation",
    "skipValidationHelp": "GitHub-hosted skills don't always follow Ornn's package rules; tick this if you trust the upstream and want the import to succeed even when the validator would reject the layout.",
    "syncButton": "Sync from GitHub",
    "backToModes": "Back to creation modes",
    "success": "Skill pulled from GitHub.",
    "genericError": "Failed to pull from GitHub."
  },
  "contact": {
    "eyebrow": "[ § 01 — CONTACT ]",
    "headlineStart": "Talk to the",
    "headlineHighlight": "team",
    "headlineEnd": ".",
    "subhead": "Three channels, each with its own purpose. Pick the one that fits — we read everything.",
    "channelsLabel": "Contact channels",
    "cardEmailLabel": "EMAIL",
    "cardEmailHint": "Use for security disclosures, account or billing questions, GDPR / personal-data requests — anything that needs to stay private. Expect a reply within two business days.",
    "cardDiscussionsLabel": "DISCUSSIONS",
    "cardDiscussionsHint": "Public community space. Ask a how-do-I question, propose a feature idea, or show off something you built. Start here if you're not sure where else to post.",
    "cardIssuesLabel": "ISSUES & PRS",
    "cardIssuesHint": "For confirmed bugs (with repro steps) and code contributions. For new feature ideas, post in Discussions → Ideas first so we can shape the scope together.",
    "categoriesEyebrow": "[ § 02 — DISCUSSION CATEGORIES ]",
    "categoriesHeadline": "Where to post on Discussions",
    "categoriesSubhead": "Each category has a different shape of conversation. Click any row to jump straight in.",
    "categoryAnnouncementsName": "Announcements",
    "categoryAnnouncementsPurpose": "Read-only. Release notes and product updates from maintainers.",
    "categoryGeneralName": "General",
    "categoryGeneralPurpose": "Anything that doesn't fit the other categories.",
    "categoryIdeasName": "Ideas",
    "categoryIdeasPurpose": "Feature proposals and design discussions. Where a feature request lives before it becomes an Issue.",
    "categoryPollsName": "Polls",
    "categoryPollsPurpose": "Community votes maintainers occasionally run. You can react to existing polls; creating one is rare.",
    "categoryQaName": "Q&A",
    "categoryQaPurpose": "\"How do I X?\" — usage questions answered by the team or the community.",
    "categoryShowAndTellName": "Show and tell",
    "categoryShowAndTellPurpose": "Show off a skill, agent, or app you built on Ornn.",
    "signoff": "[ END · CONTACT ]"
  },
  "news": {
    "eyebrow": "[ § 01 — NEWS ]",
    "headlineStart": "Stamps from the",
    "headlineHighlight": "forge",
    "headlineEnd": ".",
    "subhead": "Every announcement we've ever pressed — release notes, platform changes, and editorial dispatches. Newest first.",
    "archiveLabel": "Announcement archive",
    "loading": "[ LOADING ARCHIVE… ]",
    "errorLabel": "ARCHIVE UNREACHABLE",
    "errorBody": "The news feed didn't load. Retry in a moment, or check the Contact page if it persists.",
    "emptyLabel": "NO STAMPS YET",
    "emptyBody": "No announcements have been released yet. Check back when the forge cools.",
    "signoff": "[ END · NEWS ]"
  },
  "serviceDetail": {
    "failedToLoad": "Failed to load service: {{error}}",
    "notFound": "Not found",
    "back": "Back",
    "backToMy": "Back to My Services",
    "backToAdmin": "Back to Admin Services",
    "statusActive": "active",
    "statusInactive": "inactive",
    "generateSkillBtn": "Generate Skill",
    "proxyUrlHeading": "NyxID Proxy URL",
    "openapiHeading": "OpenAPI Spec URL",
    "openapiNotConfigured": "No OpenAPI spec configured",
    "sourceCodeHeading": "Source Code",
    "homepageHeading": "Homepage",
    "notConfigured": "Not configured"
  },
  "announcementsAdmin": {
    "noAnnouncements": "No announcements yet",
    "emptyHint": "Create the first announcement and visitors will see it on their next landing-page load.",
    "createBtn": "Create announcement"
  },
  "aria": {
    "toggleLanguage": "Toggle language",
    "toggleTheme": "Toggle theme",
    "accountMenu": "Account menu",
    "openMenu": "Open menu",
    "closeMenu": "Close menu",
    "dismissAnnouncement": "Dismiss announcement",
    "legal": "Legal",
    "productOverview": "{{brand}} product overview",
    "playgroundSkillDrawer": "Skill drawer",
    "playgroundEnvDrawer": "Env drawer",
    "skillPackageDrawer": "Skill package drawer",
    "skillPackagePreview": "Skill package preview",
    "generating": "Generating",
    "brandHome": "{{brand}} home",
    "brandOnGitHub": "{{brand}} on GitHub",
    "expandSidebar": "Expand sidebar",
    "collapseSidebar": "Collapse sidebar",
    "closeSidebar": "Close sidebar",
    "mirrorSetupInstructions": "Mirror setup instructions",
    "settingsSections": "Settings sections",
    "noLifetimeUsageHistory": "No lifetime usage history",
    "lifetimeMonthlyUsage": "Lifetime monthly usage",
    "currentQuotaPeriod": "Current quota period",
    "grantAmount": "Grant amount",
    "copyCode": "Copy code",
    "invalidateCode": "Invalidate code",
    "redemptionCodeDetail": "Redemption code detail",
    "chatMessageInput": "Chat message input",
    "quotaUsage": "Quota usage",
    "adminQuotaUnlimited": "Admin — quota unlimited",
    "adminUnlimitedUsageTitle": "Admin · Unlimited usage",
    "quotaUsageDetails": "Quota usage details"
  },
  "skillComponents": {
    "generateModal": {
      "title": "Generate Skill",
      "addRefPlaceholder": "Add reference URL...",
      "add": "Add"
    },
    "card": {
      "linkedToGithub": "Linked to GitHub"
    },
    "grid": {
      "emptyTitle": "No skills found",
      "emptyDesc": "Try adjusting your search or filters, or upload the first skill."
    },
    "fileBrowser": {
      "noFiles": "No package files available"
    },
    "frontmatter": {
      "runtime": "Runtime",
      "requiredTools": "Required Tools",
      "dependencies": "Dependencies",
      "envVars": "Environment Variables",
      "compatibility": "Compatibility"
    }
  },
  "userProfile": {
    "displayNamePlaceholder": "Your display name",
    "bioPlaceholder": "Tell us about yourself...",
    "newEmailPlaceholder": "your-new@email.com",
    "phoneNumberPlaceholder": "Phone number",
    "searchCountryPlaceholder": "Search country...",
    "apiKeyGeneratedTitle": "API Key Generated",
    "notConnected": "Not connected",
    "unlinkAccountTitle": "Unlink Account"
  },
  "editor": {
    "startTyping": "Start typing..."
  },
  "adminPages": {
    "dashboard": {
      "heading": "Dashboard",
      "subtitle": "Platform snapshot — user breakdown, skill visibility partition, and the latest 10 activities.",
      "loadFailed": "Failed to load stats",
      "users": {
        "heading": "Users",
        "ariaLabel": "Users overview",
        "total": "Total users",
        "admin": "Admin users",
        "normal": "Normal users",
        "bypassQuota": "Bypass quota"
      },
      "skills": {
        "heading": "Skills",
        "ariaLabel": "Skills overview",
        "system": "System skills",
        "public": "Public skills",
        "private": "Private skills"
      },
      "recentActivity": {
        "heading": "Recent activity",
        "body": "Audit + activity events live in PostHog. Every API request, login, skill mutation, and admin action is captured there as a typed event with caller, source IP, status, and timing — searchable, filterable, and pivotable into funnels.",
        "notConfigured": "PostHog isn't configured yet — set it up under Settings → Telemetry.",
        "activityFeed": "Activity feed",
        "insights": "Insights"
      }
    },
    "announcements": {
      "eyebrow": "[§ ADMIN — ANNOUNCEMENTS]",
      "title": "Landing page popup",
      "description": "One announcement is shown at a time on the marketing page — the most recently created enabled record currently inside its schedule window. Disabled and out-of-window records stay here for history.",
      "action": {
        "new": "New announcement",
        "disable": "Disable",
        "enable": "Enable"
      },
      "table": {
        "title": "Title",
        "status": "Status",
        "window": "Window",
        "created": "Created",
        "actions": "Actions"
      },
      "status": {
        "live": "LIVE",
        "scheduled": "SCHEDULED",
        "expired": "EXPIRED",
        "disabled": "DISABLED"
      },
      "window": {
        "always": "Always (no schedule)"
      },
      "confirm": {
        "deleteTitle": "Delete announcement?",
        "delete": "\"{{title}}\" will be removed permanently."
      },
      "toast": {
        "disabled": "Announcement disabled",
        "enabled": "Announcement enabled",
        "deleted": "Announcement deleted",
        "updateFailed": "Update failed",
        "deleteFailed": "Delete failed"
      }
    },
    "broadcasts": {
      "eyebrow": "[§ ADMIN — BROADCASTS]",
      "title": "Broadcast notifications",
      "description": "Every broadcast lands in every authenticated user's notification inbox immediately. There is no schedule window — a broadcast is live the moment it's created and gone the moment it's deleted. Both English and Chinese are required so every user reads in their own language.",
      "action": {
        "new": "New broadcast"
      },
      "table": {
        "title": "Title",
        "preview": "Preview",
        "recipients": "Recipients",
        "created": "Created",
        "updated": "Updated",
        "readCount": "Read by",
        "actions": "Actions"
      },
      "recipients": {
        "heading": "Recipients",
        "audienceAll": "All users",
        "audienceSpecific": "Specific users",
        "summaryAll": "All users",
        "summaryCount": "{{count}} users",
        "lockedHint": "Recipients are locked after creation.",
        "searchPlaceholder": "Type an email to add a recipient",
        "searchAria": "Search users by email",
        "loading": "Searching…",
        "noMatches": "No matching users.",
        "remove": "Remove {{email}}"
      },
      "empty": {
        "title": "No broadcasts yet",
        "hint": "Create the first broadcast and it will appear in every user's notification bell on their next refresh."
      },
      "confirm": {
        "deleteTitle": "Delete broadcast?",
        "delete": "\"{{title}}\" will be removed from every user's inbox and its read receipts will be cleared."
      },
      "toast": {
        "created": "Broadcast created",
        "updated": "Broadcast updated",
        "deleted": "Broadcast deleted",
        "createFailed": "Create failed",
        "updateFailed": "Update failed",
        "deleteFailed": "Delete failed"
      },
      "drawer": {
        "eyebrowNew": "[§ NEW — BROADCAST]",
        "eyebrowEdit": "[§ EDIT — BROADCAST]",
        "newTitle": "New broadcast",
        "newAria": "New broadcast",
        "editAria": "Edit broadcast",
        "englishHeading": "English (required)",
        "chineseHeading": "中文 (required)",
        "titleEnLabel": "Title (EN)",
        "titleZhLabel": "Title (ZH)",
        "titleEnPlaceholder": "Short, scannable. Visible in the bell.",
        "titleZhPlaceholder": "简短、易扫读。展示在通知铃中。",
        "bodyEnLabel": "Body — EN (markdown)",
        "bodyZhLabel": "Body — ZH (markdown)",
        "bodyEnPlaceholder": "Markdown supported. Keep it under a screenful — this renders inline in the notification bell.",
        "bodyZhPlaceholder": "支持 Markdown。建议控制在一屏内 —— 此内容将直接渲染在通知铃中。",
        "createBtn": "Create broadcast",
        "saveBtn": "Save changes"
      },
      "errors": {
        "titleEnRequired": "English title is required",
        "titleZhRequired": "中文标题为必填项",
        "bodyEnRequired": "English body is required",
        "bodyZhRequired": "中文正文为必填项",
        "titleTooLong": "Title is too long",
        "bodyTooLong": "Body is too long",
        "recipientsRequired": "Add at least one recipient or switch to 'All users'."
      }
    },
    "skills": {
      "title": "Skills",
      "subtitle": "Manage all platform skills",
      "subtitleForUser": "Skills for selected user",
      "searchLabel": "Search Skills",
      "searchPlaceholder": "Search by name or description...",
      "searchBtn": "Search",
      "clearBtn": "Clear",
      "empty": "No skills found.",
      "loadFailed": "Failed to load skills",
      "table": {
        "name": "Name",
        "author": "Author",
        "visibility": "Visibility",
        "tags": "Tags",
        "created": "Created",
        "actions": "Actions"
      },
      "modal": {
        "deleteTitle": "Delete Skill?",
        "deleteBodyPrefix": "Are you sure you want to delete",
        "deleteBodySuffix": "?",
        "deleteWarning": "This action cannot be undone. The skill will be permanently removed from the platform."
      },
      "toast": {
        "deleted": "Skill deleted",
        "deleteFailed": "Failed to delete skill"
      }
    },
    "quota": {
      "title": "Quota",
      "subtitle": "Per-user monthly counters with admin-applied grants. Admin users bypass quota and are excluded from this table.",
      "tabs": {
        "playground": "Playground",
        "skillGen": "Skill Generation"
      },
      "placeholder": {
        "filter": "Filter by email or display name…"
      },
      "aria": {
        "filter": "Filter users",
        "surface": "Surface"
      },
      "loadFailed": "Failed to load users"
    },
    "redemption": {
      "title": "Redemption codes",
      "subtitle": "Mint single-use codes that bundle one or more current-month quota grants. Codes can be invalidated before redemption.",
      "action": {
        "mint": "Mint code"
      },
      "tabs": {
        "all": "All",
        "active": "Active",
        "redeemed": "Redeemed",
        "invalidated": "Invalidated"
      },
      "placeholder": {
        "filter": "Filter by code prefix or note…"
      },
      "aria": {
        "filter": "Filter redemption codes",
        "status": "Status"
      },
      "confirm": {
        "invalidateTitle": "Invalidate redemption code?",
        "invalidate": "{{code}} will no longer be redeemable.",
        "invalidateAction": "Invalidate"
      },
      "toast": {
        "invalidated": "Code {{code}} invalidated.",
        "invalidateFailed": "Failed to invalidate code."
      },
      "loadFailed": "Failed to load redemption codes"
    },
    "userMgmt": {
      "title": "Users",
      "subtitle": "Two views: admins (quota-bypass) and normal users. Per-row Grant quota link deep-links to the Quota page.",
      "adminTitle": "Admin users",
      "adminDescription": "Carry ornn:admin:skill — bypass all quota counters.",
      "normalTitle": "Normal users",
      "normalDescription": "Subject to monthly playground + skill-gen quotas."
    },
    "users": {
      "title": "Users",
      "subtitle": "Platform users and their activity",
      "empty": "No users found.",
      "loadFailed": "Failed to load users",
      "table": {
        "user": "User",
        "email": "Email",
        "skills": "Skills",
        "activities": "Activities",
        "lastActive": "Last Active"
      }
    }
  },
  "adminSettings": {
    "secretSentinelHint": "(unchanged — secret preserved)",
    "secretReplaceHint": "Replace to overwrite. Saving an unchanged mid-mask keeps the existing DB value.",
    "sections": {
      "mirror": {
        "title": "GitHub mirror",
        "description": "Repo coords + App credentials + scheduled reconcile cadence. Run controls are on the legacy mirror dashboard.",
        "savedToast": "Mirror config saved",
        "label": {
          "enabled": "Mirror enabled",
          "owner": "Owner",
          "repo": "Repo",
          "branch": "Branch",
          "appId": "App ID",
          "installationId": "Installation ID",
          "privateKey": "App private key (PEM)",
          "schedule": "Reconcile schedule"
        },
        "schedule": {
          "preset": {
            "disabled": "Disabled",
            "daily2am": "Daily at 02:00",
            "every6h": "Every 6 hours",
            "every12h": "Every 12 hours",
            "hourly": "Hourly",
            "custom": "Custom (cron expression)…"
          },
          "tzNote": "Schedules are interpreted in Singapore time (UTC+8, no DST).",
          "disabledHint": "Scheduled reconciles are paused. Publish-time webhooks still fire.",
          "customHint": "5-field cron expression (minute hour day month weekday).",
          "invalidHint": "Invalid cron expression.",
          "nextRun": "Next run: {{at}}",
          "nextRunUnavailable": "Next run: —",
          "lastRun": "Last run: {{at}}",
          "lastRunUnavailable": "Last run: —",
          "lastRunSucceeded": "✓ Succeeded",
          "lastRunFailed": "✗ Failed",
          "lastRunRunning": "⟳ Running…",
          "lastRunDuration": "{{seconds}}s"
        },
        "openDashboard": "Open mirror dashboard →"
      },
      "nyxid": {
        "title": "NyxID integration",
        "description": "OAuth service-account credentials + the API base URL the backend proxies through, plus the chrono-storage / chrono-sandbox endpoints (folded in here as part of #302 — same NyxID-orbit integration tier). Browser-side link coords live in ornn-web's configmap (NYXID_WEB_BASE_URL + path env vars) — change them there and redeploy.",
        "savedToast": "NyxID integration saved",
        "label": {
          "tokenUrl": "Token URL",
          "clientId": "Client ID",
          "clientSecret": "Client Secret",
          "baseApiUrl": "Base API URL",
          "chronoStorageUrl": "chrono-storage URL",
          "chronoStorageBucket": "chrono-storage bucket",
          "chronoSandboxUrl": "chrono-sandbox URL"
        }
      },
      "telemetry": {
        "title": "PostHog",
        "description": "PostHog product analytics + per-request audit. Backend reads this on boot — restart ornn-api to apply changes.",
        "savedToast": "PostHog config saved",
        "restartBadge": "Restart required · Backend reads on boot",
        "label": {
          "enabled": "PostHog enabled",
          "apiKey": "Project API key",
          "host": "Host",
          "projectId": "Project ID",
          "errorSampleRate": "api.error sample rate (0–1)"
        },
        "apiKeyHint": "Public project key from your PostHog dashboard. Empty disables analytics.",
        "hostHint": "https://us.i.posthog.com or https://eu.i.posthog.com depending on your region.",
        "projectIdPlaceholder": "optional — log correlation only",
        "errorSampleRateHint": "Fraction of 5xx errors emitted as `api.error` events. `api.request` always emits at 100%.",
        "frontendNote": "Frontend pageviews + identify still run from env-injected `window.__ORNN_CONFIG__` for now — DB-driven frontend runtime config is a follow-up."
      },
      "skillAudit": {
        "title": "Skill auditing",
        "description": "LLM-driven audit, AgentSeal hardening, risk threshold.",
        "savedToast": "Skill audit saved",
        "label": {
          "llmAuditEnabled": "LLM audit enabled",
          "provider": "LLM audit provider",
          "model": "LLM audit model (optional)",
          "riskThreshold": "Risk threshold (0..10)",
          "agentSealEnabled": "AgentSeal enabled",
          "agentSealTimeout": "AgentSeal timeout (ms) — 1000..600000"
        },
        "option": {
          "select": "— select —",
          "providerDefault": "— provider default —"
        }
      },
      "runtime": {
        "label": {
          "defaultProvider": "Default provider",
          "defaultModel": "Default model",
          "sseKeepAlive": "SSE keep-alive (ms) — 1000..600000",
          "defaultMonthlyQuota": "Default monthly quota — non-admin users (0..1,000,000)"
        },
        "option": {
          "none": "— none —",
          "providerDefault": "— provider default —"
        },
        "defaultModelHint": "Only enabled, non-removed models from the selected provider appear.",
        "defaultMonthlyQuotaHint": "Raising the default mid-month grants existing users headroom; lowering does not retroactively claw back."
      },
      "playground": {
        "title": "Playground",
        "description": "Runtime defaults for the playground surface.",
        "savedToast": "Playground settings saved"
      },
      "skillGen": {
        "title": "Skill generation",
        "description": "Runtime defaults for the AI-assisted skill generation surface.",
        "savedToast": "Skill-gen settings saved"
      },
      "extras": {
        "title": "Service binding list configuration",
        "description": "Additional NyxID-managed services proxied through Ornn — bind each by name + base URL + optional scopes.",
        "savedToast": "Extras saved",
        "empty": "No extra services configured",
        "label": {
          "name": "Name",
          "baseUrl": "Base URL (optional)",
          "scopes": "Scopes (comma-separated, optional)"
        },
        "aria": {
          "remove": "Remove {{name}}"
        },
        "fallbackRow": "row",
        "action": {
          "add": "Add service"
        }
      },
      "llmProviders": {
        "eyebrow": "[§ LLM PROVIDERS]",
        "title": "LLM providers",
        "description": "Per-provider gateway, auth, and model catalog. Click Models on a row to enable / disable models and pick per-surface defaults — defaults are global across providers, so setting one unselects every other.",
        "action": {
          "new": "New provider",
          "addFirst": "Add your first provider",
          "models": "Models",
          "sync": "Sync"
        },
        "loadFailed": "Failed to load providers",
        "empty": "No providers configured",
        "table": {
          "name": "Name",
          "auth": "Auth",
          "models": "Models",
          "actions": "Actions"
        },
        "modelCounts": "{{playground}} playground · {{skillGen}} skillGen · {{total}} total",
        "archivedCount": "{{count}} archived",
        "toast": {
          "synced": "Synced {{name}}: +{{added}} added, {{updated}} updated, {{removed}} removed.",
          "syncFailed": "Sync failed"
        }
      },
      "exportImport": {
        "eyebrow": "[§ EXPORT / IMPORT]",
        "title": "Export / import",
        "description": "Download the full settings tree as JSON, or import to apply a previously-exported configuration. Secrets in the export are sentinel-redacted; importing a sentinel preserves the existing DB value.",
        "downloadTitle": "Download",
        "downloadHintPrefix": "File name follows",
        "uploadTitle": "Upload + import",
        "uploadSteps": "Step 1: upload. Step 2: dry-run. Step 3: confirm + apply.",
        "invalidFile": "File is not a valid Ornn settings export (missing schemaVersion or sections)",
        "parseFailed": "Parse failed",
        "loaded": "Loaded · schemaVersion {{schemaVersion}} · exported {{exportedAt}}",
        "dryRunTitle": "Dry-run preview",
        "appliedTitle": "Import applied",
        "action": {
          "export": "Export settings",
          "chooseFile": "Choose file",
          "dryRun": "Run dry-run preview",
          "apply": "Apply import",
          "applyConfirm": "Apply"
        },
        "confirm": {
          "title": "Apply import?",
          "body": "This will write every section that passes validation. Sections that fail validation are skipped — the rest still apply. Sentinel-valued secrets keep the existing DB value."
        },
        "table": {
          "section": "Section",
          "status": "Status",
          "detail": "Detail"
        },
        "toast": {
          "exported": "Exported {{filename}}",
          "exportFailed": "Export failed",
          "dryRunFailed": "Dry-run failed",
          "importPartial": "Import partial — {{failed}} section(s) failed.",
          "importApplied": "Import applied.",
          "importFailed": "Import failed"
        }
      }
    }
  },
  "adminMirror": {
    "savedRepo": "Mirror settings saved.",
    "savedCreds": "GitHub App credentials saved.",
    "title": "GitHub Mirror",
    "loading": "Loading mirror status…",
    "loadFailed": "Could not load mirror status.",
    "featureOn": "Feature enabled",
    "featureOff": "Feature disabled — flip the toggle below to enable",
    "branch": "Branch",
    "lastReconcile": "Last reconcile",
    "runningSince": "Running since {{when}}",
    "never": "Never",
    "duration": "Duration",
    "lastError": "Last error",
    "countEligible": "Eligible",
    "countEligibleHint": "Public + system skills",
    "countSynced": "Synced",
    "countSyncedHint": "Latest version on the mirror",
    "countLagging": "Lagging",
    "countLaggingHint": "Mirrored, but stale version",
    "countNeverSynced": "Never synced",
    "countNeverSyncedOldest": "Oldest pending: {{when}}",
    "countNeverSyncedNone": "Nothing pending",
    "reconcileTitle": "Manual reconcile",
    "reconcileRunning": "Running…",
    "reconcileButton": "Reconcile now",
    "repoFormTitle": "Mirror repository",
    "fieldEnabled": "Mirror enabled",
    "fieldOwner": "Owner",
    "fieldRepo": "Repo",
    "fieldBranch": "Branch",
    "credsTitle": "GitHub App credentials",
    "fieldAppId": "App ID",
    "fieldAppIdHint": "Numeric, from the App settings page on GitHub.",
    "fieldInstallationId": "Installation ID",
    "fieldPrivateKey": "App private key (PEM)",
    "confirmTitle": "Confirm: abandon current mirror repo",
    "confirmConfirm": "Yes, change repo"
  },
  "errors": {
    "generic": {
      "unknown": "Something went wrong"
    },
    "api": {
      "quota": {
        "snapshotMissing": "Quota snapshot missing",
        "snapshotShapeInvalid": "Quota snapshot shape invalid: {{detail}}",
        "adminListMissing": "Admin quota list missing",
        "lifetimeMissing": "Lifetime quota response missing",
        "grantMissing": "Grant response missing",
        "bulkGrantMissing": "Bulk grant response missing",
        "auditListMissing": "Audit list missing"
      },
      "redemption": {
        "mintMissing": "Mint response missing",
        "mintShapeInvalid": "Mint response shape invalid: {{detail}}",
        "adminListMissing": "Admin redemption-code list missing",
        "adminListShapeInvalid": "Admin redemption-code list shape invalid: {{detail}}",
        "detailMissing": "Redemption code detail missing",
        "detailShapeInvalid": "Redemption code shape invalid: {{detail}}",
        "invalidateMissing": "Invalidate response missing",
        "invalidateShapeInvalid": "Invalidate response shape invalid: {{detail}}",
        "redeemMissing": "Redeem response missing",
        "redeemShapeInvalid": "Redeem response shape invalid: {{detail}}",
        "historyMissing": "Redemption history missing",
        "historyShapeInvalid": "Redemption history shape invalid: {{detail}}"
      },
      "settings": {
        "sectionMissing": "Section {{section}} missing from response",
        "sectionPutMissing": "Section {{section}} update returned no data",
        "providerNotFound": "Provider not found",
        "providerCreateFailed": "Failed to create provider",
        "providerUpdateFailed": "Failed to update provider",
        "syncFailed": "Failed to sync provider models",
        "modelPatchFailed": "Failed to update model flags",
        "exportMissing": "Export response missing",
        "importMissing": "Import response missing"
      },
      "adminUsers": {
        "listMissing": "Admin users list missing"
      },
      "models": {
        "pickerMissing": "Model picker response missing"
      },
      "adminDashboard": {
        "statsMissing": "Dashboard stats missing"
      },
      "audit": {
        "startMissing": "Audit returned no data"
      },
      "skillPackage": {
        "downloadFailed": "Failed to download skill package: {{status}}",
        "loadFailed": "Failed to load skill package"
      }
    },
    "zip": {
      "readFailed": "Failed to read ZIP file. The file may be corrupted.",
      "skillMdNested": "SKILL.md was found in a subdirectory but must be at the root level.",
      "skillMdRootRequired": "Invalid skill package: SKILL.md is required at the root of the archive.",
      "skillMdMultiple": "Multiple SKILL.md files found. Nested skills are not allowed.",
      "unrecognizedDirs": "Unrecognized directories found: {{dirs}}. Only scripts/, references/, and assets/ are standard.",
      "frontmatterUnparseable": "Could not extract metadata from SKILL.md frontmatter. You may need to add or fix the YAML frontmatter block.",
      "onlyZipAccepted": "Only .zip files are accepted.",
      "fileTooLarge": "File too large ({{size}})."
    },
    "frontmatter": {
      "panelTitle": "Frontmatter Validation Errors",
      "panelCount": "{{count}} error found. Fix all errors before saving.",
      "generic": "{{detail}}",
      "unparseable": "Could not parse SKILL.md frontmatter",
      "tagFormat": "Tags must be lowercase alphanumeric with hyphens",
      "envVarFormat": "Environment variable names must be UPPER_SNAKE_CASE",
      "nameFormat": "Name must start with a letter or number and contain only lowercase letters, numbers, and hyphens",
      "versionFormat": "version must be in `<major>.<minor>` format, e.g. `1.0` (non-negative integers, no leading zeroes, no patch digit)",
      "runtimeRequiredForCategory": "runtime is required when category is '{{category}}'",
      "runtimeForbiddenForCategory": "runtime must not be provided when category is '{{category}}'",
      "toolListRequiredForCategory": "tool-list is required when category is '{{category}}'",
      "toolListForbiddenForCategory": "tool-list must not be provided when category is '{{category}}'",
      "outputTypeRequiredForCategory": "output-type is required when category is '{{category}}'",
      "outputTypeForbiddenForCategory": "output-type must not be provided when category is '{{category}}'",
      "runtimeDependencyForbiddenForCategory": "runtime-dependency must not be provided when category is '{{category}}'",
      "runtimeEnvVarForbiddenForCategory": "runtime-env-var must not be provided when category is '{{category}}'"
    }
  }
}
