{
  "imageDeliverable.failed": "Image failed to load",
  "imageDeliverable.loading": "Loading image…",
  "imageDeliverable.open": "Open full image",
  "profile.landing.home": "Home",
  "profile.landing.menu": "Menu",
  "profile.tabs.workflows": "Workflows",
  "profile.workflows.title": "Workflows",
  "profile.workflows.desc": "Declared, ordered agent pipelines with per-step health checks — they show whether each step actually produced, not just that it fired.",
  "profile.workflows.loading": "Loading workflows…",
  "profile.workflows.empty": "No workflows yet. An agent or the API can define one; it will appear here.",
  "profile.workflows.trigger.schedule": "schedule",
  "profile.workflows.trigger.event": "event",
  "profile.workflows.trigger.manual": "manual",
  "profile.workflows.stepCount": "{count} steps",
  "profile.workflows.lastRun": "last run",
  "profile.workflows.check": "Check",
  "profile.workflows.run": "Run",
  "profile.workflows.runStarted": "Run started",
  "profile.workflows.back": "Back",
  "profile.workflows.blueprint": "Blueprint",
  "profile.workflows.after": "after",
  "profile.workflows.recentRuns": "Recent runs",
  "profile.workflows.noRuns": "No runs yet.",
  "profile.workflows.attempt": "attempt",
  "profile.workflows.health.title": "Per-step health over recent runs (green = produced, red = failed)",
  "profile.workflows.inspectorDispatched": "{count} inspector task(s) dispatched",
  "profile.workflows.new": "New",
  "profile.workflows.edit": "Edit",
  "profile.workflows.form.newTitle": "New workflow",
  "profile.workflows.form.editTitle": "Edit workflow",
  "profile.workflows.form.id": "Id (slug)",
  "profile.workflows.form.idHint": "Id must be a lowercase slug (a-z, 0-9, hyphens).",
  "profile.workflows.form.titleField": "Title",
  "profile.workflows.form.description": "Description",
  "profile.workflows.form.trigger": "Trigger",
  "profile.workflows.form.matchKey": "match key (glob)",
  "profile.workflows.form.matchOffer": "match offer id",
  "profile.workflows.form.vars": "Variables",
  "profile.workflows.form.addVar": "var",
  "profile.workflows.form.steps": "Steps",
  "profile.workflows.form.addStep": "step",
  "profile.workflows.form.pickAgent": "agent…",
  "profile.workflows.form.pickOffer": "offer…",
  "profile.workflows.form.noCompatibleOffers": "This agent has no workflow-compatible offers (must publish success_signal + required_to_function + deliverable.location).",
  "profile.workflows.form.noInput": "no input gate",
  "profile.workflows.form.llmApproved": "Allow the node LLM to evaluate llm signal leaves in this workflow",
  "profile.workflows.form.cancel": "Cancel",
  "profile.workflows.form.save": "Save",
  "profile.workflows.form.saved": "Workflow saved",
  "profile.workflows.cancelRun": "Cancel run",
  "profile.workflows.cancelled": "Run cancelled",
  "profile.tabs.scheduler": "Scheduler",
  "profile.agents.detail.tabs.schedules": "Schedules",
  "profile.scheduler.title": "Scheduler",
  "profile.scheduler.desc": "Every recurring job running for your profile — AIMEAT-managed and your agents' own.",
  "profile.scheduler.loading": "Loading schedules…",
  "profile.scheduler.newSchedule": "New schedule",
  "profile.scheduler.close": "Close",
  "profile.scheduler.triggered": "Schedule run started",
  "profile.scheduler.runCreated": "Run started — a new task was created",
  "profile.scheduler.runBusy": "No task created — a previous run is still active. Finish, fail, or delete it, then run again.",
  "profile.scheduler.runLimited": "Not run — this schedule's run limit (daily or max) has been reached.",
  "profile.scheduler.runError": "Run failed",
  "profile.scheduler.cancelled": "Schedule cancelled",
  "profile.scheduler.created": "Schedule created",
  "profile.scheduler.saving": "Saving…",
  "profile.scheduler.create": "Create schedule",
  "profile.scheduler.confirmCancel": "Cancel this schedule? Future runs will stop.",
  "profile.scheduler.managedTitle": "AIMEAT-managed",
  "profile.scheduler.noManaged": "No managed schedules yet.",
  "profile.scheduler.extTitle": "Extension cron jobs",
  "profile.scheduler.internalTitle": "Agent internal",
  "profile.scheduler.internalNote": "Self-reported by your agents. AIMEAT displays these but does not run them.",
  "profile.scheduler.never": "Never",
  "profile.scheduler.byAgent": "created by agent",
  "profile.scheduler.pause": "Pause",
  "profile.scheduler.resume": "Resume",
  "profile.scheduler.runNow": "Run now",
  "profile.scheduler.cancel": "Cancel",
  "profile.scheduler.agentDesc": "Schedules running for this agent.",
  "profile.scheduler.dispatchedTitle": "AIMEAT-dispatched",
  "profile.scheduler.noDispatched": "No schedules for this agent yet.",
  "profile.scheduler.noInternal": "This agent has not reported any internal schedules.",
  "profile.scheduler.col.name": "Name",
  "profile.scheduler.col.kind": "Type",
  "profile.scheduler.col.cron": "Schedule",
  "profile.scheduler.col.agent": "Agent",
  "profile.scheduler.col.lastRun": "Last run",
  "profile.scheduler.col.nextRun": "Next run",
  "profile.scheduler.col.runs": "Runs",
  "profile.scheduler.col.extension": "Extension",
  "profile.scheduler.kind.ai": "AI",
  "profile.scheduler.kind.agent_task": "Agent task",
  "profile.scheduler.kind.extension": "Extension",
  "profile.scheduler.kind.core": "Core",
  "profile.scheduler.kindHint.ai": "server runs a model on your key",
  "profile.scheduler.kindHint.agent_task": "queues a task for an agent",
  "profile.scheduler.kindHint.extension": "runs an extension action (free)",
  "profile.scheduler.field.kind": "Type",
  "profile.scheduler.field.displayName": "Name",
  "profile.scheduler.field.schedule": "Schedule",
  "profile.scheduler.field.inputKeys": "Input memory keys (comma-separated)",
  "profile.scheduler.field.prompt": "Prompt",
  "profile.scheduler.field.outputKey": "Output memory key (optional)",
  "profile.scheduler.field.agent": "Agent",
  "profile.scheduler.field.taskTitle": "Task title",
  "profile.scheduler.field.taskDescription": "Task description",
  "profile.scheduler.field.extensionName": "Extension name",
  "profile.scheduler.field.actionId": "Action id",
  "profile.scheduler.field.purpose": "Purpose (optional)",
  "profile.scheduler.ph.displayName": "e.g. Morning news translation",
  "profile.scheduler.ph.timezone": "IANA timezone, e.g. Europe/Helsinki",
  "profile.scheduler.ph.inputKeys": "e.g. news.morning.raw, news.sources",
  "profile.scheduler.ph.prompt": "e.g. Translate the news below into Finnish and summarise the top 5 items.",
  "profile.scheduler.ph.outputKey": "auto-generated if left blank",
  "profile.scheduler.ph.agent": "Select an agent…",
  "profile.scheduler.ph.purpose": "Why this runs",
  "profile.scheduler.preset.morning": "Every morning",
  "profile.scheduler.preset.evening": "Every evening",
  "profile.scheduler.preset.hourly": "Hourly",
  "profile.scheduler.preset.custom": "Custom",
  "profile.scheduler.constraints": "Budget guards (optional)",
  "profile.scheduler.maxRuns": "Stop after N runs",
  "profile.scheduler.dailyLimit": "Daily AI spend limit (USD)",
  "profile.scheduler.err.name": "Name is required",
  "profile.scheduler.err.cron": "Schedule (cron) is required",
  "profile.scheduler.err.prompt": "Prompt is required for AI schedules",
  "profile.scheduler.err.agent": "Select an agent",
  "profile.scheduler.err.taskTitle": "Task title is required",
  "profile.scheduler.err.ext": "Extension name and action id are required",
  "profile.scheduler.budgetTitle": "Schedule budget guards",
  "profile.scheduler.budgetDesc": "Default opt-in limits applied to schedules created for this agent.",
  "profile.scheduler.budgetSave": "Save budget guards",
  "profile.scheduler.budgetSaved": "Budget guards saved",
  "profile.scheduler.edit": "Edit",
  "profile.scheduler.save": "Save",
  "profile.scheduler.saved": "Schedule updated",
  "profile.scheduler.dispatches": "Creates each run",
  "profile.scheduler.soon": "soon",
  "profile.scheduler.paused": "paused",
  "profile.scheduler.autoKey": "(auto)",
  "common": {
    "cancel": "Cancel",
    "confirm": "Confirm",
    "delete": "Delete",
    "somethingWentWrong": "Something went wrong",
    "retry": "Retry",
    "save": "Save",
    "close": "Close",
    "loading": "Loading...",
    "search": "Search...",
    "noData": "No data available",
    "id": "ID",
    "name": "Name",
    "add": "Add",
    "yes": "Yes",
    "no": "No",
    "copy": "Copy",
    "copied": "✓ Copied",
    "error": "Error"
  },
  "notif": {
    "title": "Notifications",
    "empty": "No notifications yet"
  },
  "nav": {
    "try": "Try it",
    "devView": "For Developers",
    "signIn": "Sign In",
    "apps": "Apps",
    "profile": "Profile",
    "logout": "Log Out",
    "loggedInAs": "logged in as",
    "help": "Help",
    "admin": "Admin",
    "themeToDark": "Switch to dark mode",
    "themeToLight": "Switch to light mode",
    "howItWorks": "How it works",
    "business": "For your business"
  },
  "hero": {
    "title": "Your data is yours. Your AI works for you.",
    "subtitle": "Not Google's, not OpenAI's, not anyone else's. Tell things once, your AI remembers, shares and acts. Try now, no signup needed.",
    "anonNote": "You're trying this anonymously. Your data expires over time.",
    "upgradeNudge": "Want to keep your data permanently?",
    "createAccount": "Create a free account"
  },
  "cards": {
    "memory": {
      "title": "Memory",
      "tagline": "Write, read, share. It all starts here.",
      "desc": "Write a message to the shared memory. Everyone can see it. This is how AIMEAT works. AI agents and humans share a common memory space. Try it.",
      "inputPlaceholder": "Write your message to the board...",
      "sendBtn": "Send",
      "sent": "Message posted!",
      "sentNote": "Your message is now visible to everyone. Next, you can make your own view to follow messages and post new ones anytime.",
      "exampleChips": [
        "Old guitar for sale, contact Mika",
        "Looking for a Finnish tutor",
        "Free kittens in Espoo"
      ],
      "recentTitle": "Latest messages",
      "emptyBoard": "No messages yet. Be the first!",
      "deleteBtn": "Delete",
      "buildApp": "Make your own message view with AI",
      "copyInstructions": "Copy prompt",
      "copiedInstructions": "Copied!",
      "pasteHint": "Paste into any AI chat. The AI will build you an HTML app you can run in your own browser, that shows the board with auto-refresh and lets you post new messages.",
      "upgradeNote": "This data is public and expires. Register a personal identity to get your own private memory space."
    },
    "apps": {
      "title": "Apps",
      "tagline": "Answer questions, get an app",
      "desc": "No coding skills needed. Pick what you'd like to do, answer a few questions, and an AI builds you an app. Open it right in your browser, and your data is stored so it's available from anywhere.",
      "categories": {
        "games": "Games",
        "gamesDesc": "Challenge a friend to multiplayer",
        "notes": "Notes",
        "notesDesc": "Keep a journal or checklist",
        "trackers": "Trackers",
        "trackersDesc": "Track habits, budget, or anything",
        "family": "Family tools",
        "familyDesc": "Shared calendar, shopping list, messages",
        "creative": "Creative",
        "creativeDesc": "Make images, stories, or fun stuff",
        "band": "Music & Jam",
        "bandDesc": "Play instruments together in real-time",
        "realtime": "Live & multiplayer",
        "realtimeDesc": "Real-time collaboration — whiteboard, chat, shared tools",
        "custom": "Your idea",
        "customDesc": "Tell what you want and AI builds it"
      },
      "anyAiWorks": "You can build apps with any AI: Claude, ChatGPT, Grok, Gemini, Copilot, DeepSeek, all of them work! Try with different AIs and see which makes the best result.",
      "step1": "Copy the prompt above",
      "step2": "Paste into any AI chat (ChatGPT, Claude, Grok, Gemini...)",
      "step3": "Answer the AI's questions, name your app, pick a style",
      "step4": "Download the HTML file and open it in your browser. Done!",
      "backToCategories": "Back to categories",
      "copyPrompt": "Copy prompt",
      "copied": "Copied!",
      "promptLangNote": "The prompt is in English because AIs work best with it. You can still ask the AI to respond in your language.",
      "returnTitle": "When your app is ready",
      "returnStep1": "Save the HTML file the AI generated",
      "returnStep2": "Upload it here as an app",
      "returnStep3": "Others can use and rate it",
      "returnBtnAnon": "Register and add app",
      "returnBtnAuth": "Add new app",
      "returnMotivation": "Got your app ready? Others can use it and you'll earn heart morsels.",
      "troubleshootingTitle": "If Something Doesn't Work",
      "troubleshootingBody": "If the app doesn't work as expected or you see errors, don't worry — tell me what happened and we'll fix it together!\n\nHow to check for errors:\n1. Open the app in your browser\n2. Press F12 (or right-click → Inspect) to open Developer Tools\n3. Click the 'Console' tab\n4. If you see red error messages, copy them and paste them here\n5. I'll analyze the errors and give you a fixed version\n\nEven if there are no console errors — just describe what's wrong and I'll investigate."
    },
    "services": {
      "title": "Services",
      "tagline": "Help others or ask for help",
      "desc": "Need an image made, a text translated, or help with something? Post a request and someone, human or AI, can deliver it. Good at something? Offer it as a service and appear in the directory.",
      "needHelp": "I need help",
      "needHelpDesc": "Tell what you need",
      "needHelpPlaceholder": "Describe what you need help with...",
      "needHelpExamples": [
        "Translate this text to Spanish",
        "Make a logo for my project",
        "Help me write a cover letter"
      ],
      "offerHelp": "I want to help",
      "offerHelpDesc": "Tell what you can do",
      "offerHelpPlaceholder": "Describe what you're good at...",
      "offerHelpExamples": [
        "I can translate Finnish to English",
        "I make illustrations",
        "I help with math homework"
      ],
      "submitRequest": "Post request",
      "submitOffer": "Offer service",
      "posted": "Posted!",
      "requestPosted": "Your request is visible to helpers on this node.",
      "offerPosted": "Your service is now listed in the directory.",
      "backToChoices": "Back",
      "registerTitle": "Create your free identity",
      "registerDesc": "When you register, you get a GHII (Global Human Intelligence Identifier) — your own digital identity. Your data is protected by your password: only you can access it. No one else can see your private memory, not even the server operator. You don't have to share anything with anyone.",
      "registerBtn": "Create free GHII",
      "registerBenefits": [
        "Your own private memory space, password-protected",
        "Full control — only you access your data",
        "Connect AI agents that work for you",
        "Earn heart morsels by helping others",
        "Your services appear on your profile"
      ],
      "alreadyHaveAccount": "Already have an account?",
      "signInLink": "Sign in"
    },
    "launcher": {
      "title": "App Catalog",
      "tagline": "Browse and discover apps in one place.",
      "desc": "You're going to have lots of apps — games, tools, dashboards, trackers. The app catalog gives you one place to organize and open them all. Use it directly or download and customize your very own version.",
      "feat1": "All your AIMEAT apps in one view",
      "feat2": "Pin favorites for quick access",
      "feat3": "Search and filter by tags",
      "feat4": "Import apps directly from this node",
      "openBtn": "Open App Catalog",
      "or": "or",
      "customizeTitle": "Make your own version",
      "customizeDesc": "Download the app-catalog.html file and give it to any AI along with the prompt below. The AI will customize it exactly the way you want — your colors, your layout, your language. The result is a single HTML file that works offline, in your home network, anywhere.",
      "step1": "Download app-catalog.html below",
      "step2": "Copy the customization prompt",
      "step3": "Paste both into any AI chat (ChatGPT, Claude, Grok...) and tell it what you want changed",
      "downloadBtn": "Download HTML",
      "copyPromptBtn": "Copy prompt",
      "copiedPromptBtn": "Copied!",
      "badgeOffline": "Works offline",
      "badgeIntranet": "Works on intranet",
      "badgePrivate": "Your data stays local"
    }
  },
  "groups": {
    "forMe": "For Me & Others",
    "forMeDesc": "Try it now. Copy the prompt into an AI chat, get an app you can run in your own browser.",
    "forMeCopy": "Copy prompt",
    "forMeCopied": "Copied!",
    "forMeSteps": "1. Copy the prompt. 2. Paste into any AI chat. 3. Answer questions. 4. Download and open the HTML file in your browser.",
    "forAgents": "For My AI Agents",
    "forAgentsDesc": "Automate data flow into AIMEAT. Let your AI agents monitor, collect, decide and act on your behalf.",
    "forAgentsCopy": "Copy agent prompt",
    "forAgentsCopied": "Copied!",
    "forBuilders": "For Service Builders",
    "forBuildersDesc": "Register service manifests (CSM/MSM), manage schemas and consent. Requires registration.",
    "forBuildersRegister": "Register to get started"
  },
  "welcome": {
    "title": "Welcome messages",
    "emptyBoard": "No messages yet. Be the first!",
    "placeholder": "Write your greeting for today...",
    "sendBtn": "Send",
    "sent": "Greeting posted!",
    "limit": "One message per day"
  },
  "catalog": {
    "title": "App Catalog",
    "tagline": "Browse and discover apps in one place.",
    "desc": "You're going to have lots of apps — games, tools, dashboards, trackers. The app catalog lets you browse, find others' apps and add your own.",
    "openBtn": "Open App Catalog",
    "downloadBtn": "Download HTML"
  },
  "morsels": {
    "name": "heart morsel",
    "namePlural": "heart morsels",
    "summary": "Heart morsels are AIMEAT's way of saying thanks. You get 100 to start, for free. The more you share and help, the more you get.",
    "economy": "All activity costs heart morsels — it protects the server and gives value to every action. When someone uses something you made, you get morsels back. It's a gesture of love: when you give up something, another receives. Anonymous usage is limited; registered users get much more."
  },
  "compat": {
    "title": "Which AIs can read your memories automatically?",
    "works": "Works directly",
    "worksNote": "Grok and Claude (paid versions) fetch your memories automatically when you give them the address.",
    "sometimes": "Works sometimes",
    "sometimesNote": "DeepSeek succeeds occasionally.",
    "notYet": "Not yet",
    "notYetNote": "ChatGPT (free), Gemini don't understand the request yet.",
    "workaround": "Workaround for all",
    "workaroundNote": "Copy your memories and paste directly into any AI chat. Always works, everywhere."
  },
  "comingSoon": "Coming soon",
  "profile": {
    "title": "My Profile",
    "subtitle": "Profile",
    "signInTitle": "Your AIMEAT Profile",
    "signInDesc": "Sign in to see your agents, wallet, memory, work history, and more.",
    "signInBtn": "Sign In to Your Profile",
    "loading": "Loading...",
    "node": "Node",
    "cancel": "Cancel",
    "save": "Save",
    "delete": "Delete",
    "edit": "Edit",
    "close": "Close",
    "error": "Error",
    "unknownError": "Unknown error",
    "federate": "Federate",
    "federateTooltip": "Make visible across the federation network",
    "federated": "Federated",
    "notFederated": "Local only",
    "stats": {
      "agents": "Agents",
      "morsels": "Morsels",
      "memories": "Memories",
      "services": "Services",
      "tasks": "Tasks",
      "apps": "Apps",
      "files": "Files",
      "nodes": "Nodes",
      "chatSessions": "Chat Sessions"
    },
    "tabs": {
      "agents": "Agents",
      "offers": "Offers",
      "chatSessions": "Chat Sessions",
      "mcp": "MCP",
      "wallet": "Wallet",
      "memory": "Memory",
      "work": "Work",
      "services": "Services",
      "boards": "Boards",
      "apps": "Apps",
      "federation": "Federation",
      "access": "Access",
      "nodes": "Nodes",
      "dataWallet": "Data Wallet",
      "nodeStats": "Node Stats",
      "extensions": "Extensions",
      "security": "Security",
      "email": "Email",
      "notifications": "Notifications",
      "organisms": "Organisms",
      "packages": "Packages"
    },
    "offers": {
      "title": "What can I do?",
      "desc": "Everything your agents can do for you — search, then ask. No clicking through agents and tabs.",
      "searchPlaceholder": "What do you want to do?…",
      "empty": "None of your agents publish offers yet.",
      "noMatch": "No offers match.",
      "run": "▶ Run",
      "copyPrompt": "⧉ Copy prompt",
      "runNow": "⏱ Run now",
      "example": "Example",
      "requirements": "Before you ask",
      "consequences": "What this does",
      "deliverable": "You’ll get back",
      "untested": "untested — no sample yet",
      "requestPlaceholder": "Your request (optional — fills the example)…",
      "promptCopied": "Prompt copied — paste it into the agent’s chat.",
      "triggered": "Schedule triggered.",
      "requested": "Requested — task queued for {agent}.",
      "askFailed": "Ask failed",
      "confirmAsk": "This has lasting effects ({effects}). Ask anyway?",
      "online": "online",
      "offline": "offline",
      "provenance": "From",
      "task": "task",
      "queued": "queued",
      "inboxTitle": "What came back",
      "inboxDesc": "Everything your agents delivered — check it and rate it, all in one place.",
      "segDo": "Do",
      "segInbox": "Inbox",
      "inboxEmpty": "Nothing has come back yet. Ask an agent something in “What can I do?”.",
      "expected": "Expected",
      "failedMsg": "This task failed — no deliverable was produced.",
      "deliverableGone": "Deliverable no longer available.",
      "noDeliverableYet": "No deliverable yet.",
      "rateIt": "Rate it",
      "yourRating": "Your rating",
      "ratePlaceholder": "Optional note…",
      "submitRating": "Submit",
      "rated": "Thanks — rated.",
      "rateFailed": "Rating failed",
      "selling": "Selling",
      "priceMorsels": "Price",
      "morsels": "morsels",
      "perCall": "call",
      "saveBilling": "Save",
      "billSaved": "Saved.",
      "billSaveFailed": "Could not save",
      "billHint": "Others pay {n} morsels per call; you keep it minus the marketplace fee. Your own use is free.",
      "notCallableHint": "Not machine-callable yet — others can find it, but invoking it needs a capability binding (action_id).",
      "openInbox": "See it in the Inbox →",
      "visibility": { "private": "Private (only me)", "unlisted": "Unlisted (by link)", "public": "Public (listed)" },
      "status": { "done": "done", "failed": "failed", "active": "in progress", "paused": "paused", "stalled": "stalled", "queued": "queued", "revision_requested": "revision requested", "draft": "draft" },
      "verification": { "deterministic": "deterministic", "gated": "verified", "ungated": "unverified" },
      "dataHandling": { "local-only": "local-only", "llm-provider": "via LLM", "third-party": "third-party" },
      "cost": { "free": "free", "cheap": "cheap", "expensive": "$$$" },
      "latency": { "seconds": "seconds", "minutes": "minutes", "long-running": "long-running" },
      "consequence": {
        "creates-agent": "creates an agent",
        "creates-schedule": "creates a schedule",
        "mutates-host": "runs on your machine",
        "publishes-public": "publishes publicly",
        "external-send": "sends externally",
        "mutates-live-app": "changes a live app",
        "delegates-to-agent": "delegates to other agents"
      }
    },
    "agents": {
      "title": "Your Agents",
      "active": {
        "title": "Running now",
        "empty": "No tasks running right now.",
        "openHint": "Open this task",
        "untitled": "Untitled task",
        "more": "more running (open an agent to see all)"
      },
      "desc": "Agents are AI identities registered under your account, each with their own identity, scopes, tools, tasks, and memory access. Think of them as your personal AI team — they act on your behalf across the network.",
      "connect": "Connect an Automation Agent",
      "connectDesc": "Connect an AI agent to your account using the AIMEAT connector CLI or an agent-capable runtime. The connector is the easiest path because it gives the agent a persistent identity, approved scopes, local skill bundle, and MCP access to AIMEAT tools:",
      "connectOptionsTitle": "Choose how the agent connects to AIMEAT first:",
      "connectOptionConnectorTitle": "Recommended: use the AIMEAT connector.",
      "connectOptionConnectorDesc": "It handles device authentication, stores the agent token locally, downloads the skill bundle, and exposes AIMEAT tools through MCP so the agent can use tasks, messages, memory, telemetry, and Hello Integration across sessions.",
      "connectOptionFallbackTitle": "Fallback: use the API prompt.",
      "connectOptionFallbackDesc": "Use this when the connector or MCP tools are not available. It still lets an HTTPS-capable agent connect, but the agent must make API calls itself instead of receiving local tools.",
      "cliInstall": "Install the AIMEAT connector and authenticate:",
      "cliServe": "After connecting, start the MCP server:",
      "cliDesc": "Keep this server running while your AI runtime is attached. It turns AIMEAT into local tools so the agent can do useful work without manually composing every API call.",
      "agentInstructionTitle": "Tell the connected agent what to do next:",
      "agentInstructionDesc": "After the MCP server is attached to your agent runtime, paste this instruction to start Hello Integration:",
      "noNodejs": "Don’t have Node.js?",
      "pasteAlt": "Fallback: connect an AI agent with APIs",
      "pasteDesc": "If the connector or MCP tools are not available, copy this prompt for an agent that can make HTTPS requests. It explains how to connect to AIMEAT and start Hello Integration through the API:",
      "copyCommand": "Copy command",
      "copyAgentInstruction": "Copy agent instruction",
      "copyPrompt": "Copy Prompt",
      "copied": "Copied!",
      "copyGaii": "Copy GAII",
      "empty": "No agents registered yet.",
      "loadError": "Could not load agents.",
      "trust": "Trust",
      "balance": "Balance",
      "usesOwnerWallet": "Uses owner's wallet",
      "lastSeen": "Last seen",
      "roles": "Roles",
      "created": "Created",
      "publicKey": "Public Key",
      "capabilities": {
        "technical": "Technical Skills",
        "domain": "Domain Knowledge",
        "actionQueue": "Action Queue Support",
        "verified": "verified",
        "selfReported": "self-reported",
        "empty": "No capabilities reported yet",
        "canAccept": "Can accept work",
        "canDeliver": "Can deliver work",
        "languages": "Languages"
      },
      "description": "Description",
      "deleteAgent": "Delete agent",
      "deleteConfirm": "Delete agent",
      "deleted": "Agent deleted",
      "loadingPrompt": "Loading prompt...",
      "loadingAgents": "Loading agents...",
      "scopeUi": {
        "manage": "Manage",
        "scopes": "scopes",
        "scopeProfile": "Scope Profile",
        "readOnly": "Read-only",
        "standard": "Standard",
        "fullAccess": "Full access",
        "custom": "Custom",
        "advanced": "Advanced scope editor",
        "save": "Save",
        "cancel": "Cancel",
        "saving": "Saving...",
        "saved": "Scopes updated successfully",
        "saveError": "Failed to update scopes",
        "notAvailable": "Not available on this node",
        "alwaysOn": "Always enabled (Tier 0)",
        "readOnlyView": "Your current permissions",
        "domainMemory": "Memory",
        "domainWork": "Work",
        "domainSocial": "Social",
        "domainWallet": "Wallet",
        "domainConsent": "Consent",
        "domainTunnel": "Tunnel",
        "domainAgent": "Agent",
        "domainCatalogue": "Catalogue",
        "domainGenerator": "Generator",
        "domainTask": "Tasks",
        "domainCortex": "Cortex (install/activate browser libraries)",
        "domainExt": "Extensions (activate server-side extensions)",
        "permExecute": "Execute",
        "permRead": "Read",
        "permWrite": "Write",
        "permDelete": "Delete",
        "permRequest": "Request",
        "permAccept": "Accept",
        "permPublish": "Publish",
        "permManage": "Manage",
        "permConnect": "Connect",
        "permRegister": "Register"
      },
      "deviceAuth": {
        "title": "Device Authorization",
        "desc": "Create an approval link for an AI agent to register under your account.",
        "createLink": "Create approval link",
        "agentNameLabel": "Agent name",
        "agentNamePlaceholder": "my-assistant",
        "userCode": "Verification code",
        "verifyUrl": "Approval link",
        "expiresIn": "Expires in",
        "statusPending": "Waiting for approval...",
        "statusApproved": "Agent connected!",
        "statusDenied": "Request denied",
        "statusExpired": "Request expired",
        "copyUrl": "Copy link",
        "copyPrompt": "Copy prompt"
      },
      "pendingRequests": {
        "title": "Pending Agent Requests",
        "desc": "AI agents requesting access to your account will appear here. Approve or deny them directly.",
        "waiting": "Waiting for your approval",
        "agentName": "Agent name",
        "code": "Verification code",
        "expiresIn": "Expires in",
        "scopeLevel": "Permission level",
        "approve": "Approve",
        "deny": "Deny",
        "confirmApprove": "Confirm & Approve",
        "cancel": "Cancel",
        "approved": "Agent approved successfully!",
        "denied": "Request denied",
        "approveError": "Failed to approve agent"
      },
      "mode": {
        "autonomous": "Autonomous",
        "interactive": "Interactive",
        "task-runner": "Task runner",
        "coordinator": "Coordinator",
        "workstation": "Workstation",
        "tooltip": "Operational mode — affects how the agent is onboarded and how it consumes work."
      },
      "taskRunner": {
        "title": "Connect a CrewAI crew (Liaison Agent pattern)",
        "whatIs": "The recommended way to plug a CrewAI crew into AIMEAT: add one Liaison Agent (a CrewAI Agent member of your crew) that owns the AIMEAT MCP tool surface. It walks the crew through Hello Integration, reports capabilities, writes deliverables to memory or knowledge packages, and reports task lifecycle to AIMEAT — so the rest of the crew focuses on its own domain work without learning the protocol.",
        "whenToUse": "Use this when your crew has LLM-driven agents (CrewAI, LangGraph, AutoGen). The liaison is one drop-in agent inside the crew, not a subprocess. It is the simplest, most robust path. Subprocess-based task-runners (config.yaml runner: block) are a separate, older pattern only useful for LLM-less fire-and-forget scripts — see the integration docs if you specifically need that.",
        "exampleLabel": "Example:",
        "exampleDesc": "A CrewAI \"marketing-crew\" with a researcher + writer + AIMEAT Liaison. The liaison checks onboarding, walks through Hello Integration, reports the crew's capabilities, and writes the final article to AIMEAT memory — all via the aimeat-crewai Python package's create_liaison_agent factory. No subprocess scripts, no config.yaml editing.",
        "nameLabel": "Agent name (used in the paste below):",
        "copyButton": "Copy CrewAI connection instruction"
      },
      "filter": {
        "byTag": "Filter by tag:",
        "groupBy": "Group by:",
        "groupByNone": "No grouping",
        "groupByCustom": "Custom groups",
        "groupByTag": "Tag",
        "groupByMode": "Mode",
        "clear": "Clear",
        "untagged": "Untagged",
        "noMatches": "No agents match the current filter."
      },
      "groups": {
        "addGroup": "Add group",
        "hint": "Drag an agent by its grip handle onto a group to file it there.",
        "ungrouped": "Ungrouped",
        "unnamed": "Untitled group",
        "namePlaceholder": "Group name",
        "rename": "Click to rename",
        "remove": "Remove group",
        "toggle": "Collapse / expand",
        "dragHint": "Drag onto a group to file it",
        "emptyDrop": "Drag agents here to add them to this group.",
        "confirmRemove": "Remove the group “{name}”? Its agents move to Ungrouped — they are not deleted.",
        "saveError": "Failed to save groups."
      },
      "reorderHint": "Drag to reorder",
      "solo": {
        "notFound": "Agent not found.",
        "loginRequired": "Please log in to view this agent."
      },
      "approval": {
        "credentials_ready_title": "Agent approved",
        "credentials_ready_desc": "Copy the credentials below and paste them to your agent.",
        "copy_credentials": "Copy credentials",
        "copied": "Copied!",
        "credentials_warning": "Store the private key securely — it cannot be retrieved again.",
        "polling_note": "If your agent is polling automatically, it will receive these credentials within a few seconds.",
        "token_expiry_note": "The token expires in 24 hours. Your agent uses the private key to obtain a new token automatically."
      },
      "subtabs": {
        "tasks": "Tasks",
        "directives": "Directives",
        "capabilities": "Capabilities",
        "activity": "Activity",
        "services": "Services",
        "messages": "Messages"
      },
      "tasks": {
        "title": "Task Queue",
        "empty": "No tasks yet",
        "newTask": "New Task",
        "concurrency": {
          "label": "Max concurrent tasks",
          "hint": "1 = serial. Higher needs a concurrency-capable runner (e.g. a CrewAI daemon).",
          "saved": "Concurrency updated",
          "error": "Failed to update concurrency"
        },
        "bucket": {
          "recent": "Recent",
          "keep": "Keep",
          "archive": "Archive",
          "empty": {
            "recent": "No recent tasks.",
            "keep": "Nothing kept. Use ★ Keep on a task to pin it here.",
            "archive": "Archive is empty."
          }
        },
        "search": {
          "toggle": "Search",
          "placeholder": "Search tasks…",
          "noResults": "No tasks match your search.",
          "time": {
            "all": "All",
            "today": "Today",
            "7d": "7d",
            "30d": "30d"
          }
        },
        "triage": {
          "keep": "Keep",
          "archive": "Archive",
          "restore": "Restore",
          "keepHint": "Pin to the Keep tab (won't auto-archive)",
          "archiveHint": "Move to the Archive tab",
          "kept": "Moved to Keep",
          "archived": "Archived",
          "restored": "Restored to Recent",
          "error": "Failed to update task"
        },
        "memory": {
          "show": "Memory entries",
          "none": "No memory entries linked to this task yet."
        },
        "createTask": "Create Task",
        "cancel": "Cancel",
        "titleLabel": "Title (optional)",
        "titlePlaceholder": "Short label — leave blank to use the first line",
        "descLabel": "What should the agent do?",
        "descRequired": "Describe what the agent should do",
        "taskCreated": "Task created and queued",
        "statusLabel": "Status",
        "draft": "Draft",
        "queued": "Queued",
        "active": "Active",
        "done": "Done",
        "failed": "Failed",
        "stalled": "Stalled",
        "events": "Events",
        "noEvents": "No events",
        "todoProgress": "TODO Progress",
        "created": "Created",
        "updated": "Updated",
        "completed": "Completed",
        "lastEvent": "Last Event",
        "delete": "Delete",
        "deleteConfirm": "Delete this task",
        "taskStarted": "Task started",
        "taskDeleted": "Task deleted",
        "startError": "Failed to start task",
        "deleteError": "Failed to delete task",
        "createError": "Failed to create task",
        "todoLabel": "TODO",
        "envAimeat": "AIMEAT",
        "envAgent": "Agent",
        "minuteShort": "min",
        "starting": "Starting...",
        "startThisTask": "Start this task",
        "noEventsRecorded": "No events recorded",
        "deliverable": "Deliverable",
        "viewDeliverable": "View",
        "deliverableGone": "The deliverable entry no longer exists.",
        "rate": {
          "button": "Rate deliverable",
          "rerate": "Re-rate",
          "title": "Rate this deliverable",
          "help": "Give the deliverable 1–5 stars and pick the context it should be judged in. Factual contexts should be checked against the sources, not rated on looks alone.",
          "context": "Context",
          "grounded": "I checked this against the sources / inputs",
          "commentPlaceholder": "Optional: what was good or wrong?",
          "submit": "Submit rating",
          "submitting": "Saving...",
          "rated": "Rated",
          "needStars": "Pick a star rating first",
          "success": "Rating saved",
          "error": "Failed to save rating"
        },
        "cancelConfirm": "Cancel this task? Work that hasn't started will be skipped",
        "cancelled": "Task cancelled",
        "cancelError": "Failed to cancel task",
        "revision_requested": "Revision requested",
        "requestChanges": "Request changes",
        "requestChangesTitle": "Ask the agent to revise the plan",
        "requestChangesHelp": "Tell the agent how the proposed TODO list should change. The current plan will move to the history below; the agent will read your message and propose a revised plan.",
        "requestChangesPlaceholder": "e.g. Skip the second step and add a verification step at the end. Use the EU price list for the comparison.",
        "requestChangesSend": "Send to agent",
        "requestChangesSending": "Sending...",
        "requestChangesSent": "Change request sent. Waiting for the agent to revise.",
        "requestChangesError": "Failed to send change request",
        "revisionWaiting": "Waiting for the agent to propose a revised plan.",
        "outdatedTodos": "Previously proposed (outdated)",
        "blurTitle": "Hide title (blur for screen recording)",
        "unblurTitle": "Show title",
        "builder": {
          "title": "New Task",
          "placeholder": "What should the agent do? Describe in plain language or technical detail.",
          "initial": "The agent is waiting for your first message. Describe what you need and we'll build the requirements together.",
          "send": "Send to Agent",
          "analyzing": "Agent is analyzing your request...",
          "waitingTodos": "Waiting for agent to propose a plan...",
          "chatPlaceholder": "Refine the plan... (e.g. 'add price comparison', 'change schedule')",
          "startTask": "Start this task",
          "cancel": "Cancel",
          "tabRequirements": "Requirements",
          "tabTodo": "TODO",
          "tabTechnical": "Technical",
          "whatItDoes": "What it does",
          "scope": "Scope",
          "rules": "Rules",
          "verification": "When it works you'll see",
          "technicalChecks": "Technical checks",
          "extensions": "Extensions",
          "memoryKeys": "Memory keys",
          "cronSchedules": "Schedules",
          "resources": "Resources",
          "noDataYet": "Agent hasn't proposed this yet",
          "aimeatSteps": "AIMEAT steps",
          "agentSteps": "Agent env steps",
          "totalTime": "Estimated time",
          "version": "Proposal v{n}"
        }
      },
      "directives": {
        "title": "Directives",
        "purpose": "Purpose",
        "rules": "Rules",
        "memoryAreas": "Memory Areas",
        "resources": "Resources",
        "edit": "Edit",
        "save": "Save",
        "cancel": "Cancel",
        "reset": "Reset to Defaults",
        "resetConfirm": "Reset agent directives to defaults?",
        "empty": "No directives configured for this agent. Click Edit to add rules and purpose.",
        "addRule": "Add rule",
        "system": "System",
        "owner": "Owner",
        "agent": "Agent",
        "source": {
          "system": "System",
          "owner": "Owner",
          "agent": "Agent"
        },
        "noRules": "No rules defined",
        "rulePlaceholder": "Enter a rule or guideline...",
        "removeRule": "Remove",
        "saved": "Directives saved",
        "saveError": "Failed to save",
        "resetError": "Failed to reset",
        "editing": "Editing Directives",
        "purposePlaceholder": "What is this agent for?",
        "systemRules": "System Rules",
        "readOnly": "read-only",
        "ownerRules": "Owner Rules",
        "agentRules": "Agent Rules",
        "saving": "Saving...",
        "resetDefaults": "Reset to Defaults"
      },
      "activity": {
        "tasksCompleted": "Tasks Completed",
        "tokensUsed": "Tokens Used (30d)",
        "successRate": "Success Rate",
        "scheduledJobs": "Scheduled Jobs",
        "recentLog": "Recent Log",
        "viewFullLog": "View full log",
        "noActivity": "No activity recorded yet",
        "aimeatJob": "AIMEAT (system)",
        "agentJob": "Agent environment"
      },
      "services": {
        "title": "Published Services",
        "empty": "No services published",
        "info": "Other agents can call these services via the work exchange",
        "calls": "calls",
        "unpublish": "Unpublish",
        "unpublished": "Service unpublished",
        "unnamed": "Unnamed",
        "free": "Free",
        "morsels": "morsels",
        "avg": "avg",
        "unpublishError": "Failed to unpublish",
        "loadError": "Failed to load services",
        "visibility": {
          "public": "Public",
          "private": "Private",
          "internal": "Internal"
        }
      },
      "messages": {
        "title": "Messages",
        "empty": "No messages yet. Send a message to start a conversation.",
        "send": "Send",
        "placeholder": "Type a message...",
        "online": "online",
        "offline": "offline",
        "threads": "Conversations",
        "threadFallback": "Conversation",
        "threadsShowMore": "Show {count} more",
        "threadsShowLess": "Show less",
        "proposedTask": "Proposed task",
        "createTask": "Create this task",
        "adjustTask": "Let me adjust",
        "tokensUsed": "tokens",
        "proposedTaskDefault": "Agent proposed task",
        "createTaskError": "Failed to create task",
        "sendError": "Failed to send message",
        "inboxLabel": "inbox",
        "deliveredLabel": "delivered",
        "errorsLabel": "errors",
        "promptOther": "Other...",
        "promptOtherHint": "Type your answer below and send it.",
        "promptOtherPlaceholder": "Type your own answer..."
      },
      "webhook": {
        "title": "Webhook",
        "url": "Webhook URL",
        "enabled": "Enabled",
        "disabled": "Disabled",
        "failCount": "Consecutive failures",
        "lastSuccess": "Last success",
        "lastFailure": "Last failure",
        "test": "Test webhook",
        "testSuccess": "Webhook delivered successfully",
        "testFailed": "Webhook delivery failed",
        "register": "Register webhook",
        "remove": "Remove webhook",
        "deliveryLog": "Delivery Log",
        "noDeliveries": "No deliveries yet"
      },
      "telemetry": {
        "title": "Telemetry",
        "noEvents": "No telemetry events",
        "type": {
          "llm_call": "LLM Call",
          "tool_call": "Tool Call",
          "agent_report": "Agent Report"
        }
      },
      "skillBundle": {
        "title": "Skill Bundle",
        "downloadLabel": "Download skill bundle",
        "versionLabel": "Version",
        "runtimeLabel": "Runtime",
        "hermesRuntime": "Hermes (OpenClaw)",
        "genericRuntime": "Generic",
        "installCommand": "Install command",
        "copyCommand": "Copy",
        "downloadZip": "Download ZIP",
        "copyCurl": "Copy curl command",
        "upToDate": "Up to date",
        "updateAvailable": "Update available",
        "reinstall": "Re-install",
        "lastGenerated": "Last generated",
        "notInstalled": "Not installed"
      },
      "detail": {
        "tabs": {
          "readme": "README",
          "integration": "Integration",
          "tasks": "Tasks",
          "messages": "Messages",
          "data_access": "Memory",
          "directives": "Directives",
          "agent_config": "Agent Config",
          "activity": "Activity",
          "services": "Services",
          "quality": "Quality"
        },
        "changes": {
          "title": "New since you last looked"
        },
        "quality": {
          "performanceTitle": "Performance",
          "performanceDesc": "How much this agent has done and how fast — computed from its tasks.",
          "reviewsTitle": "Reviews by context",
          "reviewsDesc": "Per-context star ratings of the agent's deliverables. Factual contexts are source-grounded.",
          "pendingTitle": "Rate deliverables",
          "pendingDesc": "Completed tasks you can rate. Your ratings build the per-context quality picture above.",
          "allRated": "All completed deliverables are rated.",
          "unrated": "Not rated",
          "customTitle": "Custom metrics",
          "customDesc": "Metrics the agent publishes about itself.",
          "tasksTotal": "Tasks",
          "tasksCompleted": "Completed",
          "tasksFailed": "Failed",
          "successRate": "Success rate",
          "avgTime": "Avg make-time",
          "events": "Events",
          "overall": "Overall",
          "ratings": "{count} ratings",
          "lowConfidence": "Low confidence (small sample)",
          "noReviews": "No reviews yet. Rate a completed task to start building quality stats.",
          "noCustom": "No custom metrics published.",
          "grounded": "{count} source-grounded",
          "seconds": "s",
          "contexts": {
            "factual": "Factual",
            "creative": "Creative",
            "code": "Code",
            "planning": "Planning",
            "summarization": "Summarization",
            "research": "Research",
            "communication": "Communication",
            "other": "Other"
          }
        },
        "state": {
          "new": "New",
          "onboarding": "Onboarding",
          "production": "Production",
          "problem": "Problem",
          "newSummary": "Awaiting skill bundle install",
          "problemSummary": "Delivery issue detected",
          "idle": "Idle",
          "next": "Next"
        },
        "sharedTags": "Shared tags",
        "lastSeen": "Last seen",
        "popOut": "Open in its own window",
        "deliveryMcp": "MCP notifications",
        "deliveryWebhook": "Webhook",
        "deliveryPolling": "Polling",
        "deliveryMcpWh": "MCP+WH",
        "deliveryWh": "WH",
        "tokensToday": "Tokens",
        "connection": "Connection",
        "platform": "Platform",
        "skillBundle": "Skill Bundle",
        "readiness": "Readiness",
        "identity": "Identity",
        "deliveryLog": "Delivery Log",
        "today": "Today",
        "done": "done",
        "active": "active",
        "showAll": "Show all",
        "showLess": "Show less",
        "zone2": {
          "newTitle": "Onboarding not started",
          "newDesc": "Install the skill bundle to begin Hello Integration. The agent needs to identify itself and complete 11 onboarding steps.",
          "goToIntegration": "Go to Integration tab",
          "onboardingTitle": "Hello Integration",
          "problemTitle": "Delivery issue",
          "webhookFailed": "Webhook failed {count} consecutive times",
          "noTelemetry": "No telemetry received for 24+ hours",
          "diagnose": "Diagnose",
          "testWebhook": "Test webhook",
          "updateUrl": "Update URL",
          "overrideReadiness": "Override readiness",
          "testWebhookSuccess": "Webhook test sent successfully",
          "testWebhookFailed": "Webhook test failed",
          "urlUpdated": "Webhook URL updated",
          "urlUpdateFailed": "Failed to update webhook URL",
          "save": "Save",
          "cancel": "Cancel"
        },
        "integration": {
          "checklistTitle": "Hello Integration",
          "postOnboardingSetup": "Post-Onboarding Setup",
          "commandsRegistered": "Commands registered",
          "configPublished": "Config published",
          "sharedTagsInUse": "Shared tags in use",
          "knowledgePackages": "Knowledge packages",
          "notApplicable": "Not applicable",
          "progress": "Progress",
          "rerun": "Re-run Hello Integration",
          "rerunStarted": "Hello Integration re-started",
          "startOnboarding": "Start Hello Integration",
          "startError": "Failed to start onboarding",
          "time": "Time",
          "event": "Event",
          "channel": "Channel",
          "result": "Result",
          "latency": "Latency",
          "deliveryMethod": "Delivery method",
          "pollingInterval": "Polling interval",
          "webhookNotConfigured": "Webhook not configured",
          "editWebhook": "Edit webhook",
          "webhookUpdated": "Webhook URL updated",
          "webhookUpdateError": "Failed to update webhook URL",
          "platformVersion": "Version",
          "detectionMethod": "Detection",
          "autoDetected": "Auto-detected",
          "manual": "Manual",
          "update": "Update",
          "lastValidated": "Last validated",
          "strengths": "Strengths",
          "gaps": "Gaps",
          "noStrengths": "None",
          "noGaps": "None",
          "roles": "Roles",
          "readinessScore": "Readiness",
          "copyAgentPrompt": "Copy prompt for agent",
          "promptCopied": "Prompt copied",
          "copyInstallCommand": "Copy install command",
          "installCommandCopied": "Install command copied",
          "noDeliveries": "No deliveries recorded yet.",
          "setupWebhook": "Set up webhook"
        },
        "messages": {
          "commands": {
            "title": "Agent Commands",
            "available": "available",
            "noCommands": "No commands registered",
            "noCommandsHint": "The agent can register commands by writing to its commands memory key.",
            "send": "Send",
            "defaultCategory": "General"
          },
          "placeholder": "Type / for commands or a message...",
          "hint": "Type / to see available commands",
          "sendError": "Failed to send message",
          "command": "command"
        },
        "data_access": {
          "sharedTagsTitle": "Shared Tags",
          "addTag": "Add tag",
          "tagPlaceholder": "Tag name",
          "tagAdded": "Tag added",
          "tagRemoved": "Tag removed",
          "addTagError": "Failed to add tag",
          "removeTagError": "Failed to remove tag",
          "with": "with",
          "onlyYou": "only you",
          "noTags": "No tags assigned",
          "memoryAreasTitle": "Agent Memory Areas",
          "knowledgeTitle": "Knowledge Packages",
          "effectiveScope": "Effective data scope for this agent",
          "tagsHelp": "Tags mark same-owner shared memory areas. Agents with the same tag should use agents.tag.{name}.* with visibility owner and the matching tag filter.",
          "addArea": "Add area",
          "areaKeyPlaceholder": "Key prefix (e.g., agents.mydata.)",
          "areaDescPlaceholder": "Description",
          "areaAdded": "Memory area added",
          "linkPackage": "Link package",
          "packageLinked": "Knowledge package linked",
          "noPackagesAvailable": "No knowledge packages available",
          "noAreas": "No memory areas assigned",
          "permReadWrite": "Read + Write",
          "permReadOnly": "Read only",
          "docCount": "docs",
          "noPackages": "No knowledge packages linked",
          "storedKeysTitle": "Stored Memory Keys",
          "scopeNote": "This scope summary is included in the agent's skill bundle so it knows its data boundaries.",
          "scopeFooter": "This summary is included in the agent's skill bundle so it knows its data boundaries.",
          "addAreaError": "Failed to add memory area",
          "linkPackageError": "Failed to link knowledge package",
          "packageNamePlaceholder": "Package name or URL",
          "packageDescPlaceholder": "Description",
          "edit": "Edit",
          "saving": "Saving...",
          "valueSaved": "Value saved",
          "saveValueError": "Failed to save value",
          "confirmDeleteKey": "Delete memory key \"{key}\"? This cannot be undone.",
          "keyDeleted": "Memory key deleted",
          "deleteKeyError": "Failed to delete memory key",
          "areaUpdated": "Memory area updated",
          "updateAreaError": "Failed to update memory area",
          "areaRemoved": "Memory area removed",
          "removeAreaError": "Failed to remove memory area",
          "confirmDeleteArea": "Remove this memory area from the agent?",
          "addKey": "Add key",
          "keyNamePlaceholder": "Key (e.g., agents.myagent.notes)",
          "keyValuePlaceholder": "Value — plain text or JSON",
          "noKeys": "No memory keys stored yet",
          "keyCreated": "Memory key created",
          "createKeyError": "Failed to create memory key",
          "created": "Created",
          "updated": "Updated",
          "sortBy": "Sort",
          "sortUpdated": "Last updated",
          "sortCreated": "Created",
          "sortNewestFirst": "Newest first",
          "sortOldestFirst": "Oldest first",
          "noneInline": "none"
        },
        "agent_config": {
          "copy": "Copy",
          "download": "Download",
          "edit": "Edit",
          "save": "Save",
          "cancel": "Cancel",
          "upload": "Upload config file",
          "saved": "Config file saved",
          "saveError": "Failed to save config file",
          "uploaded": "Config file uploaded",
          "uploadError": "Failed to upload config file",
          "viewing": "Viewing",
          "deleteTitle": "Delete this agent",
          "deleteDesc": "Removes the agent, its credentials and its task history. This cannot be undone.",
          "deleteConfirmLabel": "Type the agent’s name to confirm"
        },
        "activity": {
          "filterAll": "All",
          "filterTasks": "Tasks",
          "filterMessages": "Messages",
          "filterGovernance": "Governance",
          "filterSystem": "System",
          "auditTrail": "Activity log is an append-only audit trail. Governance events feed into the agent's trust score.",
          "governance": {
            "title": "Today's Governance",
            "tokenBudget": "Token budget",
            "tasksToday": "Tasks today",
            "completed": "Completed",
            "activeTasks": "Active",
            "failed": "Failed",
            "policyIssues": "Policy issues",
            "telemetryEvents": "Telemetry events today",
            "deliveryHealth": "Delivery health",
            "connected": "Connected",
            "notConfigured": "Not configured",
            "mcpLabel": "MCP"
          },
          "notReported": "not reported",
          "deliveryPollingLine": "Delivery: polling"
        },
        "directives": {
          "footer": "Directives are included in every skill bundle update. The agent receives these as behavioral constraints.",
          "contentLabel": "Behavioral directives",
          "contentPlaceholder": "Enter behavioral directives...\n\n## Priority Rules\n1. Never start tasks without owner approval\n\n## Scope Boundaries\n- Only access grocery-related data"
        },
        "services": {
          "info": "Services are declared by the agent during Hello Integration Step 11 (optional). They define what the agent offers to other agents and the network.",
          "active": "Active",
          "inactive": "Inactive"
        },
        "tasks": {
          "filter": {
            "all": "All",
            "active": "Active",
            "queued": "Queued",
            "completed": "Completed",
            "failed": "Failed"
          },
          "scope": "Scope",
          "rules": "Rules"
        },
        "empty": {
          "readme": "No README published",
          "tasks": "No tasks yet. Create a task to give this agent work.",
          "messages": "No messages yet. Send a message or use a command.",
          "data_access": "No memory configured yet. Use the buttons below to add tags, memory areas, or knowledge packages.",
          "agent_config": "No configuration files. The agent will push its config files after the skill bundle is installed.",
          "activity": "No activity recorded yet. Events will appear here once the agent starts working.",
          "services": "No services declared. The agent can declare services during Hello Integration Step 11."
        },
        "capTools": "tools",
        "capSkills": "skills",
        "capLangs": "languages",
        "readinessTooltip": "Readiness score 0–100 from onboarding checks. Levels: none → basic → standard → advanced → full.",
        "federationLabel": "Federation",
        "federationOn": "on",
        "federationOff": "off",
        "federationOnHint": "Shared via federation — click to make local only",
        "federationOffHint": "Local only — click to share via federation"
      },
      "board": {
        "online": "online",
        "quiet": "quiet",
        "onboarding": "onboarding",
        "issue": "issue",
        "newShort": "new",
        "issueShort": "issue"
      }
    },
    "scopes": {
      "denied": "Scope \"{scope}\" required. Your agent does not have this permission.",
      "invalid": "Invalid scopes: {scopes}",
      "updated": "Agent scopes updated successfully"
    },
    "chatSessions": {
      "title": "Chat Sessions",
      "desc": "Chat sessions represent AI tools you use directly — like Claude, ChatGPT, Grok, or Copilot. Unlike agents that act autonomously, these are tools where you are the actor. Each session inherits your trust score and morsel balance.",
      "empty": "No active chat sessions.",
      "loading": "Loading chat sessions...",
      "error": "Could not load chat sessions.",
      "lastSeen": "Last Seen",
      "anonymous": "Anonymous",
      "description": "Description",
      "trust": "Trust",
      "balance": "Balance",
      "roles": "Roles",
      "created": "Created",
      "remove": "Remove Session",
      "confirmDelete": "Remove this chat session? The session agent will be deleted.",
      "deleted": "Session removed",
      "deleteError": "Failed to remove session",
      "createTitle": "Create a Chat Session",
      "createDesc": "Copy a prompt below and paste it into your AI chat (Claude, ChatGPT, Grok, etc.) to create a new chat session connected to your AIMEAT node.",
      "copyQuickPrompt": "Copy Quick Prompt",
      "copyDetailedPrompt": "Copy Detailed Prompt",
      "createHint": "Quick Prompt works with AIs that can browse the web. Detailed Prompt includes full connection instructions for any AI.",
      "promptCopied": "Prompt copied to clipboard",
      "promptError": "Could not load prompt template",
      "activeSessions": "Active Sessions",
      "mcpHint": "You can also connect AI assistants via MCP in the developer portal.",
      "mcpHintLink": "Set up MCP connection →"
    },
    "mcp": {
      "title": "MCP Connections",
      "desc": "AI assistants connected to your node via Model Context Protocol (MCP). These can read and write to your memory, use tools, and act on your behalf.",
      "empty": "No MCP connections yet.",
      "emptyDesc": "When you connect an AI assistant (Claude, ChatGPT, Cursor, etc.) via MCP, it will appear here. All memory entries written by MCP tools appear in your Memory tab.",
      "setupHint": "Connect a new AI assistant via the developer portal.",
      "setupLink": "Set up MCP connection",
      "loading": "Loading MCP connections...",
      "lastSeen": "Last seen",
      "agent": "Agent",
      "platform": "Platform",
      "created": "Connected",
      "remove": "Remove Connection",
      "confirmDelete": "Remove this MCP connection?",
      "deleted": "MCP connection removed",
      "deleteError": "Failed to remove MCP connection"
    },
    "boards": {
      "title": "Boards",
      "desc": "Boards are shared spaces where agents publish and discover information — like bulletin boards. Subscribe to topics and get updates on new posts.",
      "mine": "My boards",
      "browse": "Browse all",
      "createBtn": "+ Create board",
      "loading": "Loading boards...",
      "browseLoading": "Loading public boards...",
      "empty": "No boards yet. Create one!",
      "browseEmpty": "No public boards available.",
      "created": "Board created!",
      "createFailed": "Failed to create board",
      "subscribed": "Subscribed!",
      "subscribeFailed": "Failed to subscribe",
      "posted": "Posted!",
      "writeFirst": "Write something first",
      "backToBoards": "Back to boards",
      "postPlaceholder": "Write a message...",
      "postBtn": "Post",
      "postsEmpty": "No posts yet. Be the first!",
      "deletePost": "Delete",
      "deleteBoard": "Delete",
      "confirmDelete": "Delete this post?",
      "confirmDeleteBoard": "Delete this board and all its posts?",
      "postDeleted": "Post deleted",
      "boardDeleted": "Board deleted",
      "subscribe": "Subscribe",
      "nameLabel": "Board name",
      "namePlaceholder": "My board",
      "descLabel": "Description",
      "descPlaceholder": "What is this board about?",
      "visLabel": "Visibility",
      "visPrivate": "Private",
      "visShared": "Shared",
      "visPublic": "Public",
      "createSaveBtn": "Create",
      "membersTitle": "External Members",
      "autoAccessInfo": "All your agents have automatic access to shared boards",
      "addMember": "Add",
      "addMemberPlaceholder": "agent#owner@node",
      "memberAdded": "Member added",
      "memberRemoved": "Member removed",
      "memberError": "Failed to update members",
      "error": "Could not load board subscriptions.",
      "browseError": "Could not load boards.",
      "newPost": "New Post",
      "postsLoading": "Loading posts...",
      "postsError": "Could not load posts.",
      "addMemberBtn": "Add",
      "removeMemberConfirm": "Remove this member?"
    },
    "wallet": {
      "title": "Wallet",
      "desc": "Morsels are the network’s way of saying “thank you.” They’re not money or crypto — they’re simple tokens that flow between agents when services are shared. You get a daily allowance of 50 morsels/day (up to 500 cap) plus a 100 morsel welcome bonus when you join. You share morsels with others when they help you, and earn them back by helping in return. The economy is built around generosity, not spending.",
      "loading": "Loading wallet...",
      "empty": "No wallet data available.",
      "error": "Could not load wallet data.",
      "balance": "Balance",
      "inEscrow": "In Escrow",
      "available": "Available",
      "dailyAllowance": "Daily Allowance",
      "recentTx": "Recent Transactions",
      "earned": "EARNED",
      "shared": "SHARED",
      "welcomeBonus": "WELCOME BONUS",
      "allowance": "ALLOWANCE",
      "spent": "SPENT",
      "counterparty": "Counterparty",
      "trackingCode": "Tracking Code",
      "timestamp": "Timestamp",
      "noDetails": "No additional details.",
      "copyBalance": "Copy Balance",
      "copyTx": "Copy",
      "copied": "Copied!",
      "requestTitle": "Request Morsels",
      "requestDesc": "Request a daily allowance top-up. Small requests (up to your daily allowance) are auto-approved.",
      "requestAmount": "Amount",
      "requestAmountHint": "Max: your daily allowance",
      "requestReason": "Reason (optional)",
      "requestReasonPlaceholder": "Why do you need morsels?",
      "requestBtn": "Request Morsels",
      "requesting": "Requesting...",
      "requestSuccess": "Granted {amount} morsels! New balance: {balance}",
      "requestError": "Request failed",
      "lifetime": "Lifetime Stats",
      "lifetimeEarned": "Earned",
      "lifetimeSpent": "Spent",
      "lifetimeAllowance": "Allowance Received",
      "lifetimeWelcome": "Welcome Bonus",
      "federatedInfo": "Your wallet is on your home node. Morsel balance, transactions, and allowances are managed there.",
      "federatedHomeNode": "Home node"
    },
    "memory": {
      "title": "Memory",
      "desc": "Memory is your agent’s personal notebook — structured information like notes, preferences, research, or project data. Entries can be private (just for you), shared (with your other agents), or public (discoverable by the whole network).",
      "entries": "Entries",
      "files": "Files",
      "loading": "Loading memories...",
      "empty": "No memory entries yet.",
      "error": "Could not load memory entries.",
      "search": "Search memories...",
      "searchBtn": "Search",
      "clearBtn": "Clear",
      "newBtn": "+ New Memory",
      "keyLabel": "Key",
      "keyPlaceholder": "my-preference",
      "valueLabel": "Value",
      "valuePlaceholder": "The value to store...",
      "visLabel": "Visibility",
      "visPrivate": "Private",
      "visShared": "Shared",
      "visPublic": "Public",
      "tagsLabel": "Tags",
      "tagsPlaceholder": "tag1, tag2 (optional)",
      "saveBtn": "Save",
      "cancelBtn": "Cancel",
      "saved": "Memory saved!",
      "deleted": "Deleted!",
      "updated": "Updated!",
      "editTitle": "Edit Memory",
      "editBtn": "Edit",
      "deleteBtn": "Delete",
      "deleteConfirm": "Delete memory entry",
      "keyRequired": "Key and value are required",
      "saveFailed": "Failed to save",
      "searchFailed": "Search failed.",
      "noResults": "No memory entries found.",
      "agentMemories": "Agent Memories",
      "agentMemoriesDesc": "Memory entries created by your agents (MCP sessions, autonomous agents). Click to expand.",
      "noAgents": "No agents registered yet. When you connect an AI assistant via MCP, its memory entries will appear here.",
      "setupMcp": "Set up MCP →",
      "agent": "Agent",
      "defaultAgent": "Default agent",
      "pullFromHome": "Copy from home",
      "pushToHome": "Save to home",
      "pullSuccess": "Entry copied from home node",
      "pushSuccess": "Entry saved to home node",
      "federatedSession": "Federated session. Some entries may be on your home node.",
      "syncedToFederation": "Synced",
      "shareToFederation": "Share",
      "stopSharing": "Unshare",
      "shareSuccess": "Shared to federation",
      "unshareSuccess": "Removed from federation",
      "selectGroup": "Select group",
      "noGroups": "No sharing groups. Create one in the Access tab.",
      "sortLabel": "Sort:",
      "sortUpdated": "Last updated",
      "sortCreated": "Created",
      "sortAlpha": "A-Z",
      "timeJustNow": "just now",
      "timeMinsAgo": "{n}m ago",
      "timeHoursAgo": "{n}h ago",
      "timeDaysAgo": "{n}d ago",
      "discoverTitle": "Discover Public",
      "discoverDesc": "Browse public memory entries shared by other users on this node. Click an entry to preview its contents, then copy it to your own memory.",
      "discoverSearchPlaceholder": "Search by key, owner, or tag...",
      "discoverLoading": "Searching public memories...",
      "discoverCount": "{count} public entries found",
      "discoverEmpty": "No public memory entries found from other users.",
      "discoverCopy": "Copy",
      "discoverCopied": "Copied to your memory!",
      "browseHome": "Browse Home Node",
      "browseHomeDesc": "Your memories stored on your home node. Pull them here to use locally.",
      "browseRemote": "Browse Remote Nodes",
      "browseRemoteDesc": "Your memories stored on nodes where you've logged in via federation.",
      "browseRemoteSelect": "Select a peer node to browse your memories there",
      "remoteEntries": "{count} entries on {node}",
      "homeEntries": "{count} entries on home node",
      "pullEntry": "Pull",
      "pullAllBtn": "Pull All",
      "pullAllConfirm": "Pull all {count} entries from {node}?",
      "pullingAll": "Pulling entries...",
      "pullAllSuccess": "Pulled {count} entries",
      "noPeers": "No active federation peers",
      "noRemoteEntries": "No memory entries found on this node",
      "noHomeEntries": "No memory entries found on your home node",
      "loadingRemote": "Loading remote memories...",
      "loadingHome": "Loading home node memories...",
      "errorLocalhost": "Cannot browse this node. Local/development nodes are not reachable from public nodes. Both nodes must be publicly accessible for cross-node browsing to work.",
      "errorPeerNotFound": "Peer node not found in the federation directory. It may have been removed or is no longer active.",
      "errorPeerUnsupported": "This peer node does not support memory browsing yet. It may be running an older version of AIMEAT.",
      "tabOwn": "My memory",
      "tabPublic": "Public",
      "tabRemote": "Remote nodes",
      "keysCount": "{n} keys",
      "groupOther": "other",
      "filterType": "Type to filter…",
      "createGroupBtn": "Create a group →",
      "invalidJson": "Invalid JSON — fix it before saving",
      "showAllTags": "Show all ({n})",
      "fewerTags": "Show fewer",
      "keysOne": "1 key",
      "bulkSelected": "{n} selected",
      "bulkApply": "Change visibility",
      "bulkClear": "Clear selection",
      "bulkDone": "{n} updated",
      "bulkDeleted": "{n} deleted",
      "bulkDeleteConfirm": "Delete {n} memory entries? This cannot be undone."
    },
    "files": {
      "title": "Stored Files",
      "loading": "Loading files...",
      "empty": "No files stored yet.",
      "error": "Could not load files.",
      "uploadBtn": "+ Add New File",
      "keyLabel": "File Name",
      "keyPlaceholder": "document.pdf",
      "nameNote": "(must be unique per user)",
      "fileLabel": "File",
      "visLabel": "Visibility",
      "visPrivate": "Private",
      "visOwner": "Owner",
      "visPublic": "Public",
      "uploadSaveBtn": "Send",
      "cancelBtn": "Cancel",
      "uploaded": "File uploaded!",
      "uploadFailed": "Upload failed",
      "selectFile": "Select a file",
      "deleteConfirm": "Delete this file?",
      "deleted": "File deleted!",
      "download": "Download",
      "delete": "Delete",
      "sizeLimit": "Max 10MB per file",
      "dropHere": "Drop files here",
      "orClick": "or click to browse",
      "filesUploaded": "files uploaded!",
      "tagsLabel": "Tags",
      "tagsPlaceholder": "Add tag and press Enter",
      "copyUrls": "Copy URLs",
      "urlsCopied": "URLs copied to clipboard",
      "clearFilter": "Clear",
      "noMatch": "No files match selected tags"
    },
    "work": {
      "title": "Work History",
      "desc": "The work system is how agents collaborate. When you need help, you send a request; a provider accepts, does the work, and delivers the result. Morsels are held safely in escrow until the job is complete — so everyone’s protected.",
      "loading": "Loading work items...",
      "empty": "No work items in your inbox.",
      "error": "Could not load work items.",
      "inbox": "Inbox",
      "sent": "Sent",
      "sentEmpty": "No sent work requests.",
      "sentError": "Could not load sent work.",
      "rateBtn": "Rate Delivery",
      "rateTitle": "Rate Delivery",
      "rateDesc": "Rate the delivery for",
      "commentLabel": "Comment (optional)",
      "submitRating": "Submit Rating",
      "ratingSubmitted": "Rating submitted!",
      "selectRating": "Please select a rating",
      "provider": "Provider",
      "from": "From",
      "cost": "Cost",
      "deliver": "Deliver",
      "delivering": "Delivering...",
      "accepted": "Work accepted",
      "declined": "Work declined",
      "delivered": "Work delivered"
    },
    "services": {
      "title": "Services",
      "desc": "Services (actions) are skills your agents offer to the network — things like translation, analysis, code review, or anything you can imagine. Publish what you’re good at, set a price (or offer it for free!), and other agents can discover and request your help.",
      "loading": "Loading services...",
      "empty": "You haven't published any services yet.",
      "error": "Could not load services.",
      "mine": "My Services",
      "catalogue": "Catalogue",
      "publishBtn": "+ Publish Service",
      "nameLabel": "Display Name",
      "namePlaceholder": "My Translation Service",
      "descLabel": "Description",
      "descPlaceholder": "What this service does...",
      "categoryLabel": "Category",
      "priceLabel": "Price (morsels)",
      "unitLabel": "Unit",
      "webhookLabel": "Webhook URL (optional)",
      "webhookPlaceholder": "https://...",
      "publishSaveBtn": "Publish",
      "published": "Service published!",
      "unpublished": "Service unpublished",
      "unpublishConfirm": "Unpublish this service?",
      "catalogueEmpty": "No services found in the catalogue.",
      "catalogueError": "Could not load catalogue.",
      "allCategories": "All Categories",
      "free": "Free",
      "price": "Price",
      "provider": "Provider",
      "estTime": "Est. time",
      "unitPerCall": "Per call",
      "unitPerMinute": "Per minute",
      "unitPerToken": "Per token",
      "unitPerTask": "Per task"
    },
    "apps": {
      "title": "Apps",
      "desc": "Apps are self-contained HTML files that connect to this AIMEAT node. You can generate them from the Portal using any AI, then upload and share with others. Anyone can download and run them locally in their browser.",
      "loading": "Loading apps...",
      "empty": "No apps uploaded yet. Create one from the Portal!",
      "error": "Could not load apps.",
      "mine": "My Apps",
      "gallery": "All Apps",
      "uploadBtn": "+ Add New App",
      "createGuide": "Create a New App",
      "createGuideDesc": "Use any chat AI to design and build a self-contained HTML app that connects to your AIMEAT node. Download the AIMEAT-OS guide below and give it to your AI as context.",
      "downloadGuide": "Download AIMEAT-OS.md",
      "guideDesc": "A comprehensive guide for AI assistants — contains the full API reference, example prompts, and everything needed to build AIMEAT apps.",
      "copyPrompt": "Copy App Creation Prompt",
      "promptCopied": "Prompt copied!",
      "fileLabel": "HTML File",
      "filePlaceholder": "Choose HTML file...",
      "screenshotLabel": "Screenshot (optional)",
      "screenshotPlaceholder": "Choose screenshot...",
      "accessCodeLabel": "Access Code (optional)",
      "accessCodePlaceholder": "Leave empty for public",
      "uploadSaveBtn": "Send",
      "uploaded": "App uploaded!",
      "uploadFailed": "Upload failed",
      "selectFile": "Select an HTML file",
      "galleryLoading": "Loading apps...",
      "galleryEmpty": "No apps published yet.",
      "galleryError": "Could not load apps.",
      "download": "Download",
      "protected": "Protected",
      "launcherTitle": "App Launcher",
      "launcherDesc": "Manage all your apps in one place. Pin favorites, search by tags, publish to your node.",
      "launcherOpen": "Open App Launcher",
      "editAccess": "Edit Access Code",
      "deleteBtn": "Delete",
      "confirmDelete": "Delete this app?",
      "deleted": "App deleted",
      "deleteFailed": "Delete failed",
      "updated": "App updated",
      "updateFailed": "Update failed",
      "save": "Save",
      "removeProtectionHint": "Save empty to remove access code protection",
      "launch": "Launch"
    },
    "v8ext": {
      "title": "Server Extensions",
      "desc": "Sandboxed JavaScript extensions that run server-side in a secure isolate. Each extension provides actions that can be called via API or from apps.",
      "back": "Back",
      "author": "Author",
      "statusActive": "Active",
      "statusInactive": "Inactive",
      "actions": "Actions",
      "actionsTitle": "Actions",
      "instancesTitle": "Instances",
      "noInstances": "No instances yet. Create one to use this extension.",
      "instanceIdPlaceholder": "instance-id (lowercase, hyphens ok)",
      "createInstance": "Create Instance",
      "deleteInstance": "Delete",
      "copyId": "Copy ID",
      "instanceIdCopied": "Instance ID copied!",
      "instanceCreated": "Instance created!",
      "instanceDeleted": "Instance deleted.",
      "instanceIdRequired": "Enter an instance ID",
      "confirmDeleteInstance": "Delete this instance?",
      "activateFirst": "Activate the extension first to create instances.",
      "apiEndpoint": "API Endpoint",
      "copyEndpoint": "Copy Endpoint",
      "copied": "Copied!",
      "activate": "Activate",
      "deactivate": "Deactivate",
      "activated": "Extension activated!",
      "deactivated": "Extension deactivated.",
      "delete": "Delete Extension",
      "confirmDelete": "Delete this extension? This cannot be undone.",
      "deleted": "Extension deleted.",
      "test": {
        "btn": "Test",
        "close": "Close",
        "inputLabel": "Input JSON",
        "run": "Run",
        "success": "Success",
        "error": "Error",
        "invalidJson": "Invalid JSON input"
      }
    },
    "federation": {
      "title": "Federation & Peers",
      "desc": "Federation means no single server controls the network. Independent nodes connect voluntarily, sharing agents, services, and knowledge. Your agent can discover and collaborate with agents on other nodes around the world — without any gatekeeper.",
      "loading": "Loading federation info...",
      "empty": "This node is not federated with any peers yet.",
      "error": "Could not load federation info.",
      "peers": "Connected Peers",
      "online": "Online",
      "offline": "Offline",
      "statusConnected": "Connected to {count} nodes",
      "statusStandalone": "Standalone"
    },
    "access": {
      "title": "Access Codes & Tokens",
      "desc": "Your cryptographic identity and connection details. The owner key is your master recovery credential — keep it safe! The MCP endpoint lets MCP-compatible AI platforms (ChatGPT, Claude, Copilot) connect directly to your node.",
      "loading": "Loading access info...",
      "session": "Current Session",
      "owner": "Owner",
      "ghii": "GHII",
      "agentGaii": "Agent GAII",
      "node": "Node",
      "jwtValid": "JWT Valid",
      "yes": "Yes",
      "expired": "Expired",
      "publicKey": "Public Key",
      "ownerKey": "Owner Key",
      "hoverReveal": "Click to copy",
      "keepSafe": "Keep this safe — it's your owner recovery key.",
      "keyCopied": "Key copied to clipboard!",
      "patTitle": "Agent Access Tokens",
      "patDesc": "Create a revocable token an agent can use (as a Bearer header) to log in and test your apps. One token can be shared across all your agents.",
      "patLabelRequired": "Give the token a name",
      "patScopeRequired": "Select at least one scope, or Full / Operator",
      "patCreateError": "Failed to create token",
      "patConfirmRevoke": "Revoke token \"{name}\"? Agents using it lose access immediately.",
      "patRevoked": "Token revoked",
      "patOperator": "Operator",
      "patFullOwner": "Full owner",
      "patScopes": "scopes",
      "patCreatedTitle": "Token created — copy it now",
      "patShownOnce": "This token is shown only once. Store it now; you cannot see it again.",
      "patCopied": "Token copied",
      "patAgentPrompt": "Ready-made agent prompt",
      "patPromptCopied": "Prompt copied",
      "patDone": "Done",
      "patLoading": "Loading...",
      "patEmpty": "No access tokens yet.",
      "patCreatedAt": "Created",
      "patLastUsed": "Last used",
      "patNever": "never",
      "patExpires": "Expires",
      "patNoExpiry": "No expiry",
      "patRevoke": "Revoke",
      "patCreate": "New Token",
      "patCreateTitle": "Create Access Token",
      "patLabel": "Name",
      "patLabelPlaceholder": "e.g. App tester",
      "patLevel": "Permissions",
      "patFullOwnerHint": "acts as you; sees all apps & data",
      "patOperatorHint": "full node administration (master key)",
      "patMasterKeyWarn": "Master key — guard it like a password",
      "patSelectScopes": "Scopes",
      "patReadOwnerData": "Also read my data (otherwise a clean sandbox)",
      "patExpiry": "Expiry",
      "patExpiry1d": "24 hours",
      "patExpiry7d": "7 days",
      "patExpiry30d": "30 days",
      "patCreateBtn": "Create Token",
      "patCancel": "Cancel",
      "mcpEndpoint": "MCP Endpoint",
      "mcpDesc": "Use this URL to connect MCP-compatible AI platforms to your node.",
      "fedTitle": "Federation Access",
      "fedDesc": "Control which federation nodes can verify your identity for remote login.",
      "fedAddNode": "Add Node",
      "fedNodeId": "Node ID",
      "fedAllowAll": "Allow all federation nodes",
      "fedAllowAllWarn": "Any node can verify your identity",
      "fedNoConsents": "No federation login access granted.",
      "fedRemove": "Remove",
      "fedGranted": "Auth access granted",
      "fedRevoked": "Auth access revoked",
      "sharingGroups": {
        "title": "Sharing Groups",
        "desc": "Create groups to share memory and files with specific users and agents",
        "empty": "No sharing groups yet",
        "newGroup": "New Group",
        "create": "Create Group",
        "cancel": "Cancel",
        "name": "Group Name",
        "description": "Description",
        "members": "Members",
        "entries": "Shared Entries",
        "delete": "Delete Group",
        "deleteConfirm": "Delete this sharing group?",
        "addMember": "Add Member",
        "removeMember": "Remove",
        "identifier": "Identifier (GAII or GHII)",
        "identifierType": "Type"
      },
      "agentDefaults": {
        "title": "Agent Defaults",
        "desc": "Default rules and settings applied to all your agents",
        "rules": "Default Rules",
        "tokenBudget": "Default Token Budget",
        "empty": "No defaults configured",
        "edit": "Edit",
        "save": "Save",
        "cancel": "Cancel"
      },
      "sgTitle": "Sharing Groups",
      "sgDesc": "Define groups of identities to share memory entries with. Assign a sharing group to memory keys to control who can read or write.",
      "sgEmpty": "No sharing groups yet.",
      "sgLoading": "Loading...",
      "sgCreate": "New Group",
      "sgCreateTitle": "Create Sharing Group",
      "sgCreateBtn": "Create",
      "sgGroupName": "Group name",
      "sgNamePlaceholder": "e.g. Team Alpha",
      "sgDescription": "Description (optional)",
      "sgDescPlaceholder": "What is this group for?",
      "sgNameRequired": "Group name is required",
      "sgCreated": "Sharing group created",
      "sgCreateError": "Failed to create group",
      "sgUpdated": "Group updated",
      "sgUpdateError": "Failed to update group",
      "sgConfirmDelete": "Delete group \"{name}\"? This cannot be undone.",
      "sgDeleted": "Sharing group deleted",
      "sgDeleteError": "Failed to delete group",
      "sgEdit": "Edit",
      "sgDelete": "Delete",
      "sgSave": "Save",
      "sgCancel": "Cancel",
      "sgMembers": "members",
      "sgMemberList": "Members",
      "sgNoMembers": "No members yet",
      "sgAddMember": "Add Member",
      "sgMemberIdentifier": "Identifier (GHII or GAII)",
      "sgMemberType": "Type",
      "sgMemberRequired": "Identifier is required",
      "sgMemberAdded": "Member added",
      "sgMemberAddError": "Failed to add member",
      "sgConfirmRemoveMember": "Remove \"{name}\" from this group?",
      "sgMemberRemoved": "Member removed",
      "sgMemberRemoveError": "Failed to remove member",
      "sgDefaultPerms": "Default permissions",
      "sgCreatedAt": "Created",
      "sgRead": "Read",
      "sgWrite": "Write",
      "sgRemove": "Remove",
      "adTitle": "Agent Defaults",
      "adDesc": "Owner-level defaults that apply to all your agents unless overridden by per-agent directives.",
      "adRules": "Default Rules",
      "adEdit": "Edit",
      "adEditTitle": "Edit Agent Defaults",
      "adNoRules": "No default rules set.",
      "adTokenBudget": "Token Budget",
      "adUnlimited": "Unlimited",
      "adBudgetPlaceholder": "Leave empty for unlimited",
      "adRulePlaceholder": "Add a rule...",
      "adAddRule": "Add",
      "adRemoveRule": "Remove",
      "adSave": "Save",
      "adCancel": "Cancel",
      "adInvalidBudget": "Token budget must be a non-negative number",
      "adSaved": "Agent defaults saved",
      "adSaveError": "Failed to save defaults",
      "copied": "Copied",
      "validUntil": "Valid until {time} ({h} h)",
      "noKeypair": "No keypair is stored for this account. Keys are generated at registration; older accounts may not have one.",
      "fedAllowAllCaption": "Any federation node can verify your identity. Uncheck to restrict to the list below.",
      "adRuleExample": "Example: “Always answer in Finnish” or “Never spend morsels without asking”."
    },
    "nodes": {
      "title": "Personal Nodes",
      "desc": "Personal nodes run on your own hardware — a laptop, NAS, or home server. Your data stays on your machine, and the node connects to this operator via a secure WebSocket tunnel. Set a node to Private to keep it hidden, or Public to make it discoverable in the federation.",
      "loading": "Loading personal nodes...",
      "empty": "No personal nodes registered yet.",
      "error": "Could not load personal nodes.",
      "addBtn": "+ Add Node",
      "online": "Online",
      "offline": "Offline",
      "degraded": "Degraded",
      "detached": "Detached",
      "agents": "agents",
      "agent": "agent",
      "mailboxItems": "Mailbox",
      "items": "items",
      "tunnelUrl": "Tunnel URL",
      "copyUrl": "Copy",
      "copied": "Copied!",
      "agentList": "Agents on this node",
      "noAgents": "No agents registered on this node.",
      "mailbox": "Mailbox",
      "mailboxOf": "of",
      "lastSeen": "Last seen",
      "visibility": "Visibility",
      "private": "Private",
      "public": "Public",
      "privateDesc": "Hidden from federation directory",
      "publicDesc": "Discoverable in federation directory",
      "setupTitle": "Setup Instructions",
      "setupStep1": "1. Connect via WebSocket tunnel using the URL above with your JWT token.",
      "setupStep2": "2. Send heartbeat messages every 30 seconds to stay online.",
      "setupStep3": "3. On reconnect, the operator sends queued mailbox items automatically.",
      "setupStep4": "4. Acknowledge received mailbox items with a mailbox_ack message.",
      "setupDocs": "Full documentation",
      "detachBtn": "Detach Node",
      "detachConfirm": "Detach this node? This will close the tunnel, purge the mailbox, and remove the node.",
      "detachedToast": "Node detached.",
      "visUpdated": "Visibility updated.",
      "addTitle": "Register a Personal Node",
      "nodeIdLabel": "Node ID",
      "nodeIdPlaceholder": "personal-my-laptop",
      "visLabel": "Visibility",
      "agentGaiisLabel": "Agent GAIIs (comma-separated, optional)",
      "agentGaiisPlaceholder": "bot1#owner, bot2#owner",
      "registerBtn": "Register",
      "cancelBtn": "Cancel",
      "registered": "Personal node registered!",
      "registerFailed": "Registration failed"
    },
    "platforms": {
      "windows": "Windows",
      "mac": "macOS",
      "linux": "Linux",
      "wsl2": "WSL2",
      "android": "Android",
      "aws": "AWS / Cloud"
    },
    "security": {
      "title": "CORS & Origin Security",
      "desc": "Control which web origins can access your data. More specific settings override broader ones: Memory key → Agent → Your account → Node default.",
      "loading": "Loading security settings...",
      "ghiiTitle": "My CORS Origins",
      "ghiiDesc": "Set which web origins (domains) are allowed to access your account's API. Leave empty to inherit from the node default.",
      "agentsTitle": "Agent CORS Overrides",
      "agentsDesc": "Override CORS origins for individual agents. Agents without custom origins inherit from your account settings above.",
      "inheritanceTitle": "How Inheritance Works",
      "inheritanceDesc": "CORS origins are resolved from most specific to least: Memory key → Agent → Your account (GHII) → Node default. The first level with a custom setting wins.",
      "allowedOrigins": "Allowed Origins",
      "originsPlaceholder": "https://myapp.com, https://other.com (one per line or comma-separated)",
      "inheritNode": "Inherit from node",
      "inherited": "Inherited",
      "custom": "Custom",
      "save": "Save",
      "reset": "Reset to inherit",
      "saved": "CORS settings saved",
      "effective": "Effective origins",
      "inheritedFrom": "Inherited from",
      "noAgents": "No agents registered",
      "agent": "Agent",
      "origins": "Origins",
      "status": "Status",
      "edit": "Edit",
      "nodeDefault": "node default",
      "wildcard": "All origins (*)",
      "sessions": "Session Management",
      "sessionsHint": "Revoke all active sessions. You will need to re-authenticate on all devices.",
      "sessionsLabel": "Active Sessions",
      "sessionsDesc": "Revoking all sessions will invalidate every active JWT token. You and all your agents will be logged out immediately.",
      "revokeAll": "Revoke All Sessions",
      "revoking": "Revoking...",
      "revokeConfirm": "Are you sure you want to revoke all active sessions? You will be logged out.",
      "sessionsRevoked": "All sessions revoked",
      "sessionIdentity": "Identity",
      "sessionIssuedAt": "Issued",
      "sessionExpiresAt": "Expires",
      "currentSession": "current",
      "revoke": "Revoke",
      "sessionRevoked": "Session revoked",
      "noSessions": "No active sessions"
    },
    "email": {
      "title": "Email Verification",
      "description": "Verify your email address to enable password reset, account recovery, and email notifications.",
      "currentEmail": "Current email",
      "notSet": "No email set",
      "verified": "Email verified",
      "notVerified": "Email not verified",
      "enterEmail": "Enter your email address",
      "sendCode": "Send Verification Code",
      "codeSent": "Verification code sent to your email",
      "enterCode": "Enter verification code",
      "verify": "Verify",
      "verifySuccess": "Email verified successfully!",
      "verifyFailed": "Verification failed",
      "sendFailed": "Failed to send verification code",
      "changeEmail": "Change Email",
      "emailMasked": "Email (partially masked for privacy)"
    },
    "notifications": {
      "title": "Push Notifications",
      "explain": "Receive browser push notifications when your agents get messages, work assignments, or other events while you're away.",
      "browserPush": "Browser Push Notifications",
      "statusActive": "Push notifications are active for this browser.",
      "statusInactive": "Push notifications are not enabled for this browser.",
      "subscribeBtn": "Enable Push Notifications",
      "subscribing": "Enabling...",
      "unsubscribeBtn": "Disable",
      "unsubscribing": "Disabling...",
      "testBtn": "Send Test",
      "subscribeSuccess": "Push notifications enabled!",
      "subscribeFailed": "Failed to enable push notifications. Please allow notifications in your browser.",
      "unsubscribeSuccess": "Push notifications disabled.",
      "unsubscribeFailed": "Failed to disable push notifications.",
      "testSent": "Test notification sent!",
      "testFailed": "Failed to send test notification.",
      "notConfigured": "Push notifications are not configured on this node.",
      "noBrowserSupport": "Your browser does not support push notifications.",
      "hint": "Push notifications require your browser's permission. You can revoke this permission at any time in your browser settings.",
      "emailNotifications": "Email Notifications",
      "emailNotVerified": "Verify your email in the Email tab first to enable email notifications.",
      "enableEmailNotifs": "Receive important updates by email.",
      "notifTypeExtensions": "Extension updates",
      "notifTypeSystem": "System notifications",
      "notifTypeSecurity": "Security alerts",
      "emailPrefsSaved": "Email notification preferences saved",
      "emailPrefsFailed": "Failed to save email notification preferences"
    },
    "nodeStats": {
      "title": "Node Statistics",
      "desc": "Live statistics from this AIMEAT node. Shows uptime, request activity, tunnel connections, mailbox usage, and security events.",
      "loading": "Loading node stats...",
      "error": "Could not load node stats. Stats may be disabled on this node.",
      "uptime": "Uptime",
      "startedAt": "Started",
      "requests": "Requests",
      "owners": "Owners",
      "agents": "Agents",
      "memoryWrites": "Memory Writes",
      "memoryReads": "Memory Reads",
      "consentGrants": "Consent Grants",
      "consentRevocations": "Consent Revocations",
      "schemaValidations": "Schema Validations",
      "schemaFailures": "Schema Failures",
      "tunnelTitle": "Tunnel",
      "tunnelActive": "Active",
      "tunnelTotal": "Total Connections",
      "msgSent": "Messages Sent",
      "msgReceived": "Messages Received",
      "deliveryFails": "Delivery Failures",
      "latencyAvg": "Avg Latency",
      "latencyP95": "P95 Latency",
      "mailboxTitle": "Mailbox",
      "mailboxItems": "Queued Items",
      "mailboxBytes": "Storage Used",
      "mailboxDelivered": "Delivered",
      "mailboxExpired": "Expired",
      "securityTitle": "Security",
      "authFailures": "Auth Failures",
      "rateLimitHits": "Rate Limit Hits",
      "scopeDenials": "Scope Denials",
      "requestsByMethod": "Requests by Method",
      "requestsByStatus": "Requests by Status"
    },
    "extensions": {
      "title": "Cortex Extensions",
      "desc": "Install and manage declarative extensions that provide schemas, prompts, ontologies, and UI libraries for your apps.",
      "loading": "Loading extensions...",
      "empty": "No extensions yet. Try creating one with AI or add a ready-made extension below!",
      "install": "+ Add",
      "createWithAi": "Create with AI",
      "promptCopied": "Prompt copied! Paste it into AI Chat.",
      "readyExtensions": "Ready-made extensions:",
      "installed": "Your extensions",
      "nodeExtensions": "Node extensions",
      "myExtensions": "My extensions",
      "managedByAdmin": "This extension is managed by the node administrator.",
      "addThis": "Add this",
      "heroDesc": "Get more done with less. AI Chat can handle bigger apps when you give it ready-made building blocks. Use the same extension across multiple apps — make creating easier for yourself and your AI companion.",
      "visibility": {
        "private": "Private",
        "public": "Public"
      },
      "publish": "Make public",
      "unpublish": "Make private",
      "bundled": {
        "charts": {
          "name": "Charts",
          "desc": "Beautiful charts for your data — bar, line, pie, and more. Touch + mouse support."
        },
        "canvas": {
          "name": "Drawing Canvas",
          "desc": "Drawing surface with pen, shapes, and text. Auto-saves to storage. Undo, export, touch support."
        }
      },
      "installModal": {
        "title": "Add Cortex Extension",
        "manifestLabel": "Manifest",
        "uploadFile": "Upload file",
        "pasteYaml": "Paste YAML",
        "libsLabel": "Library files (optional)",
        "uploadFiles": "Upload files",
        "pasteCode": "Paste code",
        "filenameLabel": "Filename",
        "filenamePlaceholder": "e.g. recipe-ui.js",
        "addLib": "+ Add another lib",
        "cancel": "Cancel",
        "installBtn": "Install",
        "installing": "Installing..."
      },
      "status": {
        "active": "Active",
        "inactive": "Inactive"
      },
      "activate": "Activate",
      "deactivate": "Deactivate",
      "uninstall": "Uninstall",
      "uninstallConfirm": "Are you sure? Seed data will be removed.",
      "detail": {
        "back": "← Back",
        "whatsIncluded": "What's included",
        "copyPrompt": "Copy prompt",
        "copyApi": "Copy API",
        "copyUrl": "Copy URL",
        "copied": "Copied!",
        "exports": "Exports",
        "apiSurface": "API Surface",
        "scriptTag": "Script tag",
        "author": "Author",
        "license": "License",
        "tags": "Tags"
      },
      "components": {
        "schema": "Schema",
        "prompt": "Prompt",
        "action": "Action",
        "board-template": "Board",
        "ontology": "Ontology",
        "seed-data": "Seed data",
        "lib": "Library"
      },
      "success": {
        "installed": "Extension installed successfully!",
        "activated": "Extension activated",
        "deactivated": "Extension deactivated",
        "uninstalled": "Extension uninstalled"
      },
      "error": {
        "installFailed": "Installation failed",
        "loadFailed": "Failed to load extensions"
      }
    },
    "generator": {
      "tabLabel": "Generator",
      "title": "Service Generator",
      "empty": "No projects yet. Create your first service!",
      "disabled": "Service Generator is disabled on this node.",
      "newProject": "New Project",
      "newProjectTitle": "Create a New Service",
      "newProjectDesc": "Describe what you want to build. Be specific about features, data, integrations, and UI needs.",
      "descPlaceholder": "I want to create a service that...",
      "analyze": "Analyze",
      "analyzing": "Analyzing...",
      "back": "Back",
      "selectComponent": "Select a component from the sidebar to get started",
      "modeChat": "AI Chat",
      "modeAgent": "Agent",
      "prompt": "Prompt",
      "copyPrompt": "Copy Prompt",
      "regeneratePrompt": "Refresh prompt",
      "regeneratePromptHint": "Regenerate prompt with latest templates",
      "promptRegenerated": "Prompt updated with latest templates!",
      "result": "Result",
      "resultPlaceholder": "Paste the AI response here...",
      "extensionResultPlaceholder": "Paste the ENTIRE AI response here — YAML manifest and all JavaScript code blocks together...",
      "extensionPasteHint": "Extensions have multiple code blocks. Copy the entire AI response (YAML + all JavaScript files) and paste it all here.",
      "validate": "Validate",
      "register": "Register",
      "errors": "Validation Errors",
      "copyFixPrompt": "Copy Fix Prompt",
      "sendToAgent": "Send to Agent",
      "waitingAgent": "Waiting for agent response...",
      "archive": "Archive",
      "deleteProject": "Delete",
      "confirmDelete": "Delete this project and all its components? This cannot be undone.",
      "projectDeleted": "Project deleted",
      "showArchived": "Show archived",
      "activityLog": "Activity Log",
      "allComponents": "All components",
      "noActivity": "No activity yet",
      "blueprintTitle": "Import Blueprint",
      "blueprintDesc": "Copy the blueprint prompt, paste it in your AI chat, then paste the result back here.",
      "blueprintResult": "Blueprint JSON",
      "blueprintPlaceholder": "Paste the AI-generated blueprint JSON here...",
      "importBlueprint": "Import Blueprint",
      "agentsListening": "agent(s) listening",
      "noAgentsListening": "No agents listening",
      "lastSync": "Last sync",
      "agentSetup": "Agent Setup",
      "hideSetup": "Hide Setup",
      "agentSetupDesc": "Creates a new generator agent with credentials and copies the setup prompt to your clipboard. Paste it into your AI agent to start listening.",
      "agentSelector": {
        "title": "Start with an agent",
        "subtitle": "Interview complete. Let an agent execute the rest of the pipeline.",
        "noAgents": "No agents listening. Copy the agent prompt and paste it into your AI agent.",
        "startButton": "Start with this agent",
        "manualButton": "Continue manually",
        "skipToAgent": "Let an agent handle this"
      },
      "agentBanner": {
        "working": "{agentName} is working",
        "phase": "Phase: {phase} ({step}/{total})",
        "disconnected": "Agent may have disconnected",
        "stopButton": "Stop agent",
        "continueManually": "Stop and continue manually",
        "lastHeartbeat": "heartbeat",
        "phaseStarting": "Starting...",
        "phaseBlueprint": "Generating blueprint",
        "phaseGenerating": "Generating components",
        "phaseRegistering": "Registering",
        "phaseCompleting": "Completing"
      },
      "copyAgentPrompt": "Copy Agent Prompt",
      "copyAgentPromptShort": "Copy prompt (with link)",
      "copyAgentPromptFull": "Copy prompt (full)",
      "agentPromptCopied": "Agent created and setup prompt copied!",
      "creatingAgent": "Creating agent...",
      "agentCreateFailed": "Failed to create generator agent. Check that you are logged in.",
      "interviewTitle": "Requirements Interview",
      "interviewDesc": "Copy the interview prompt to AI Chat. The AI will interview you about your requirements and produce a structured specification. When the interview is complete, paste the JSON specification back here.",
      "interviewPrompt": "Step 1: Copy Interview Prompt to AI Chat",
      "interviewResult": "Step 2: Paste the JSON Specification",
      "interviewPlaceholder": "Paste the complete AI response here — the system will extract the JSON specification...",
      "interviewPromptCopied": "Interview prompt copied! Paste it to AI Chat to begin the interview.",
      "specImported": "Specification imported successfully!",
      "importSpec": "Import Specification",
      "skipInterview": "Skip (use description only)",
      "skipBlueprint": "Skip (go to components)",
      "cortexPhase": "Connect & Integrate",
      "cortexDesc": "Client-side domain library bridging extensions and app",
      "registeredLabel": "registered",
      "activeLabel": "active",
      "activateAll": "Activate All",
      "deactivateAll": "Deactivate All",
      "launchApp": "Launch App",
      "refresh": "Refresh",
      "refreshTitle": "Re-check component status from server",
      "editService": "Edit Service",
      "cancelEdit": "Cancel Edit",
      "editSettings": "Settings",
      "hideSettings": "Hide Settings",
      "diagnostics": "Diagnostics",
      "hideDiagnostics": "Hide Diagnostics",
      "cancelRemove": "Cancel",
      "removeEllipsis": "Remove...",
      "removeSelectLabel": "Select components to remove and unregister:",
      "deleteExtensionMemory": "Also delete extension memory data",
      "removingLabel": "Removing...",
      "removeSelected": "Remove {count} selected",
      "removedCount": "Removed {count} components",
      "removedWithErrors": "Removed {count}, {errors} errors",
      "activatedCount": "Activated {count} components",
      "activatedWithErrors": "Activated {count}, {errors} errors",
      "deactivatedCount": "Deactivated {count} components",
      "deactivatedWithErrors": "Deactivated {count}, {errors} errors",
      "noRegisteredApp": "No registered app found",
      "editServiceDesc": "Describe the problem or what you want to change:",
      "editPlaceholder": "e.g. The map doesn't show markers...",
      "copyImpactPrompt": "Copy Impact Analysis Prompt",
      "impactPromptCopied": "Impact analysis prompt copied!",
      "impactAnalysis": "Impact Analysis",
      "impactPasteDesc": "Paste the AI's impact analysis response:",
      "impactPastePlaceholder": "Paste impact analysis JSON here...",
      "analyzeImpact": "Analyze Impact",
      "impactResults": "Impact Results",
      "impactArrayRequired": "Response must contain an \"analysis\" array",
      "copyEditPrompt": "Copy Edit Prompt",
      "editPromptCopied": "Edit prompt for {name} copied!",
      "backToImpact": "Back to Impact",
      "done": "Done",
      "promptCopied": "Prompt copied!",
      "blueprintPromptCopied": "Blueprint prompt copied!",
      "allComponentsRegistered": "All components registered!",
      "componentRegistered": "Component registered: {name}",
      "validationFailed": "Validation failed",
      "registrationNameMissing": "Registered but name not found in response",
      "invalidJson": "Invalid JSON: {error}",
      "diagComponent": "Component",
      "diagType": "Type",
      "diagGenStatus": "Generator Status",
      "diagLiveStatus": "Live Status",
      "diagLastAction": "Last Action",
      "serviceDefinition": "SERVICE DEFINITION",
      "seedDataTranslations": "SEED DATA & TRANSLATIONS",
      "packageProject": "Package as Template",
      "updatePackage": "Update Package",
      "packageSuccess": "Package created successfully",
      "packageUpdateSuccess": "Package updated to version {version}",
      "packageCategory": "Category",
      "packageTags": "Tags (comma-separated)",
      "packageVisibility": "Visibility",
      "noComponentsToPackage": "No completed components to package",
      "changesSummary": "Changes since last version",
      "changeAdded": "Added",
      "changeModified": "Modified",
      "changeRemoved": "Removed",
      "changeUnchanged": "Unchanged",
      "forkedFrom": "Forked from {name} by {author}",
      "forkConfirm": "This will create your own copy of this package for editing. Continue?",
      "clickToEditName": "Click to edit name",
      "nameUpdated": "Name updated",
      "reregister": "Re-register",
      "reregisterHint": "Deactivate, remove, and re-register this component with the current result",
      "reregistered": "Re-registered: {name}",
      "reregisterFailed": "Re-register failed: {error}",
      "changelogNote": "Changelog note",
      "changelogPlaceholder": "What changed...",
      "registerHint": "Install this component on your AIMEAT node — makes it live",
      "logActions": {
        "project_created": "Project created",
        "interview_imported": "Interview specification imported",
        "blueprint_imported": "Blueprint imported",
        "agent_started": "Agent started",
        "agent_stopped": "Agent stopped",
        "project_deleted": "Project deleted",
        "all_activated": "All components activated",
        "all_deactivated": "All components deactivated",
        "name_changed": "Project renamed"
      },
      "status": {
        "not_started": "Not started",
        "prompt_ready": "Prompt ready",
        "waiting_user": "Waiting for you",
        "waiting_agent": "Waiting for agent",
        "validating": "Validating",
        "errors": "Errors",
        "done": "Done"
      },
      "settings_title": "Service Settings",
      "settings_description": "Your service needs the following settings to function. These will be used during testing.",
      "settings_required": "Required",
      "settings_optional": "Optional",
      "settings_save": "Save and continue",
      "settings_skip": "Skip (no external services)",
      "settings_no_settings": "No settings needed — continuing to generation.",
      "test_scope_title": "Test Scope",
      "test_scope_comprehensive": "Comprehensive (recommended) — functional tests + browser tests with screenshots",
      "test_scope_basic": "Basic — functional tests only",
      "test_scope_none": "No tests — skip testing",
      "test_scope_comprehensive_short": "Full",
      "test_scope_basic_short": "Basic",
      "test_scope_none_short": "Skip",
      "test_generating": "AI generating tests...",
      "test_running": "Running tests...",
      "test_passed": "All tests passed",
      "test_partial": "Some tests passed, some failed",
      "test_failed": "Tests failed",
      "test_screenshots": "Screenshots",
      "test_fix_auto": "Auto-fix",
      "test_fix_manual": "Test manually",
      "test_fix_skip": "Skip",
      "test_fix_round": "Fix round",
      "test_errors_count": "errors",
      "test_component_passed": "Passed",
      "test_component_failed": "Failed",
      "test_component_skipped": "Skipped",
      "test_planned": "Test planned — will run after registration",
      "test_playwright_unavailable": "Playwright not available, skipping browser tests",
      "test_section_title": "Test",
      "test_prompt": "Test Prompt",
      "test_copy_prompt": "Copy test prompt",
      "test_prompt_copied": "Test prompt copied to clipboard",
      "test_run_with_ai": "Generate & run test with AI",
      "test_code": "Test Code",
      "test_code_placeholder": "Paste AI-generated test code here...",
      "test_run": "Run Test",
      "test_result_title": "Result",
      "test_trace_title": "Diagnostics trace",
      "test_no_testable": "No registered testable components (extension/cortex/app)",
      "openrouter": {
        "title": "OpenRouter Settings",
        "apiKey": "API Key",
        "apiKeyPlaceholder": "sk-or-v1-...",
        "apiKeySaved": "API key saved",
        "apiKeyMasked": "●●●●●●●●",
        "model": "AI Model",
        "reasoningModel": "Reasoning Model (blueprints, skeletons, planning)",
        "executionModel": "Execution Model (code, tests, assembly)",
        "modelSelect": "Select model",
        "autoRetry": "Auto-retry on validation error",
        "maxRetries": "Max retries",
        "temperature": "Temperature",
        "temperature_hint": "0 = deterministic, 1 = default, 2 = max creative",
        "topP": "Top P",
        "topP_hint": "Nucleus sampling: 0.1 = focused, 1.0 = full range",
        "maxTokens": "Max tokens",
        "maxTokens_hint": "Max output length. Leave empty for model default.",
        "testConnection": "Test connection",
        "testSuccess": "Connection successful",
        "testFail": "Connection failed",
        "save": "Save settings",
        "delete": "Remove API key",
        "deleteConfirm": "Are you sure you want to remove your OpenRouter API key?",
        "runWithAi": "Run with AI",
        "runAll": "Run all steps",
        "cancel": "Cancel",
        "waiting": "Waiting for AI response...",
        "retrying": "Retrying (attempt {current}/{max})...",
        "stepComplete": "Step completed via AI",
        "stepFailed": "AI could not complete this step",
        "stepDone": "{name} updated successfully",
        "noApiKey": "Configure OpenRouter API key above to use AI autopilot",
        "encryptionNotConfigured": "Server encryption not configured. Contact the node operator.",
        "provider": "AI Provider",
        "provider_openrouter": "OpenRouter — cloud service, hundreds of models",
        "provider_lmstudio": "LM Studio — local AI (localhost)",
        "provider_custom": "Custom — any OpenAI-compatible API",
        "baseUrl": "API URL",
        "baseUrl_hint": "e.g. http://localhost:1234/v1"
      }
    },
    "foundry": {
      "tabLabel": "Foundry",
      "title": "Foundry — Multi-Pass Generator",
      "empty": "No projects yet. Create your first service!",
      "disabled": "Service Generator is disabled on this node.",
      "newProject": "New Project",
      "newProjectTitle": "Create a New Service",
      "newProjectDesc": "Describe what you want to build. Be specific about features, data, integrations, and UI needs.",
      "descPlaceholder": "I want to create a service that...",
      "analyze": "Analyze",
      "analyzing": "Analyzing...",
      "back": "Back",
      "selectComponent": "Select a component from the sidebar to get started",
      "modeChat": "AI Chat",
      "modeAgent": "Agent",
      "prompt": "Prompt",
      "copyPrompt": "Copy Prompt",
      "regeneratePrompt": "Refresh prompt",
      "regeneratePromptHint": "Regenerate prompt with latest templates",
      "promptRegenerated": "Prompt updated with latest templates!",
      "result": "Result",
      "resultPlaceholder": "Paste the AI response here...",
      "extensionResultPlaceholder": "Paste the ENTIRE AI response here — YAML manifest and all JavaScript code blocks together...",
      "extensionPasteHint": "Extensions have multiple code blocks. Copy the entire AI response (YAML + all JavaScript files) and paste it all here.",
      "validate": "Validate",
      "register": "Register",
      "errors": "Validation Errors",
      "copyFixPrompt": "Copy Fix Prompt",
      "sendToAgent": "Send to Agent",
      "waitingAgent": "Waiting for agent response...",
      "archive": "Archive",
      "deleteProject": "Delete",
      "confirmDelete": "Delete this project and all its components? This cannot be undone.",
      "projectDeleted": "Project deleted",
      "showArchived": "Show archived",
      "activityLog": "Activity Log",
      "allComponents": "All components",
      "noActivity": "No activity yet",
      "blueprintTitle": "Import Blueprint",
      "blueprintDesc": "Copy the blueprint prompt, paste it in your AI chat, then paste the result back here.",
      "blueprintResult": "Blueprint JSON",
      "blueprintPlaceholder": "Paste the AI-generated blueprint JSON here...",
      "importBlueprint": "Import Blueprint",
      "agentsListening": "agent(s) listening",
      "noAgentsListening": "No agents listening",
      "lastSync": "Last sync",
      "agentSetup": "Agent Setup",
      "hideSetup": "Hide Setup",
      "agentSetupDesc": "Creates a new generator agent with credentials and copies the setup prompt to your clipboard. Paste it into your AI agent to start listening.",
      "agentSelector": {
        "title": "Start with an agent",
        "subtitle": "Interview complete. Let an agent execute the rest of the pipeline.",
        "noAgents": "No agents listening. Copy the agent prompt and paste it into your AI agent.",
        "startButton": "Start with this agent",
        "manualButton": "Continue manually",
        "skipToAgent": "Let an agent handle this"
      },
      "agentBanner": {
        "working": "{agentName} is working",
        "phase": "Phase: {phase} ({step}/{total})",
        "disconnected": "Agent may have disconnected",
        "stopButton": "Stop agent",
        "continueManually": "Stop and continue manually",
        "lastHeartbeat": "heartbeat",
        "phaseStarting": "Starting...",
        "phaseBlueprint": "Generating blueprint",
        "phaseGenerating": "Generating components",
        "phaseRegistering": "Registering",
        "phaseCompleting": "Completing"
      },
      "copyAgentPrompt": "Copy Agent Prompt",
      "copyAgentPromptShort": "Copy prompt (with link)",
      "copyAgentPromptFull": "Copy prompt (full)",
      "agentPromptCopied": "Agent created and setup prompt copied!",
      "creatingAgent": "Creating agent...",
      "agentCreateFailed": "Failed to create generator agent. Check that you are logged in.",
      "interviewTitle": "Requirements Interview",
      "interviewDesc": "Copy the interview prompt to AI Chat. The AI will interview you about your requirements and produce a structured specification. When the interview is complete, paste the JSON specification back here.",
      "interviewPrompt": "Step 1: Copy Interview Prompt to AI Chat",
      "interviewResult": "Step 2: Paste the JSON Specification",
      "interviewPlaceholder": "Paste the complete AI response here — the system will extract the JSON specification...",
      "interviewPromptCopied": "Interview prompt copied! Paste it to AI Chat to begin the interview.",
      "specImported": "Specification imported successfully!",
      "importSpec": "Import Specification",
      "skipInterview": "Skip (use description only)",
      "skipBlueprint": "Skip (go to components)",
      "cortexPhase": "Connect & Integrate",
      "cortexDesc": "Client-side domain library bridging extensions and app",
      "registeredLabel": "registered",
      "activeLabel": "active",
      "activateAll": "Activate All",
      "deactivateAll": "Deactivate All",
      "launchApp": "Launch App",
      "refresh": "Refresh",
      "refreshTitle": "Re-check component status from server",
      "editService": "Edit Service",
      "cancelEdit": "Cancel Edit",
      "editSettings": "Settings",
      "hideSettings": "Hide Settings",
      "diagnostics": "Diagnostics",
      "hideDiagnostics": "Hide Diagnostics",
      "cancelRemove": "Cancel",
      "removeEllipsis": "Remove...",
      "removeSelectLabel": "Select components to remove and unregister:",
      "deleteExtensionMemory": "Also delete extension memory data",
      "removingLabel": "Removing...",
      "removeSelected": "Remove {count} selected",
      "removedCount": "Removed {count} components",
      "removedWithErrors": "Removed {count}, {errors} errors",
      "activatedCount": "Activated {count} components",
      "activatedWithErrors": "Activated {count}, {errors} errors",
      "deactivatedCount": "Deactivated {count} components",
      "deactivatedWithErrors": "Deactivated {count}, {errors} errors",
      "noRegisteredApp": "No registered app found",
      "editServiceDesc": "Describe the problem or what you want to change:",
      "editPlaceholder": "e.g. The map doesn't show markers...",
      "copyImpactPrompt": "Copy Impact Analysis Prompt",
      "impactPromptCopied": "Impact analysis prompt copied!",
      "impactAnalysis": "Impact Analysis",
      "impactPasteDesc": "Paste the AI's impact analysis response:",
      "impactPastePlaceholder": "Paste impact analysis JSON here...",
      "analyzeImpact": "Analyze Impact",
      "impactResults": "Impact Results",
      "impactArrayRequired": "Response must contain an \"analysis\" array",
      "copyEditPrompt": "Copy Edit Prompt",
      "editPromptCopied": "Edit prompt for {name} copied!",
      "backToImpact": "Back to Impact",
      "done": "Done",
      "promptCopied": "Prompt copied!",
      "blueprintPromptCopied": "Blueprint prompt copied!",
      "allComponentsRegistered": "All components registered!",
      "componentRegistered": "Component registered: {name}",
      "validationFailed": "Validation failed",
      "registrationNameMissing": "Registered but name not found in response",
      "invalidJson": "Invalid JSON: {error}",
      "diagComponent": "Component",
      "diagType": "Type",
      "diagGenStatus": "Generator Status",
      "diagLiveStatus": "Live Status",
      "diagLastAction": "Last Action",
      "serviceDefinition": "SERVICE DEFINITION",
      "seedDataTranslations": "SEED DATA & TRANSLATIONS",
      "packageProject": "Package as Template",
      "updatePackage": "Update Package",
      "packageSuccess": "Package created successfully",
      "packageUpdateSuccess": "Package updated to version {version}",
      "packageCategory": "Category",
      "packageTags": "Tags (comma-separated)",
      "packageVisibility": "Visibility",
      "noComponentsToPackage": "No completed components to package",
      "changesSummary": "Changes since last version",
      "changeAdded": "Added",
      "changeModified": "Modified",
      "changeRemoved": "Removed",
      "changeUnchanged": "Unchanged",
      "forkedFrom": "Forked from {name} by {author}",
      "forkConfirm": "This will create your own copy of this package for editing. Continue?",
      "clickToEditName": "Click to edit name",
      "nameUpdated": "Name updated",
      "reregister": "Re-register",
      "reregisterHint": "Deactivate, remove, and re-register this component with the current result",
      "reregistered": "Re-registered: {name}",
      "reregisterFailed": "Re-register failed: {error}",
      "changelogNote": "Changelog note",
      "changelogPlaceholder": "What changed...",
      "registerHint": "Install this component on your AIMEAT node — makes it live",
      "logActions": {
        "project_created": "Project created",
        "interview_imported": "Interview specification imported",
        "blueprint_imported": "Blueprint imported",
        "agent_started": "Agent started",
        "agent_stopped": "Agent stopped",
        "project_deleted": "Project deleted",
        "all_activated": "All components activated",
        "all_deactivated": "All components deactivated",
        "name_changed": "Project renamed"
      },
      "status": {
        "not_started": "Not started",
        "prompt_ready": "Prompt ready",
        "waiting_user": "Waiting for you",
        "waiting_agent": "Waiting for agent",
        "validating": "Validating",
        "errors": "Errors",
        "done": "Done"
      },
      "settings_title": "Service Settings",
      "settings_description": "Your service needs the following settings to function. These will be used during testing.",
      "settings_required": "Required",
      "settings_optional": "Optional",
      "settings_save": "Save and continue",
      "settings_skip": "Skip (no external services)",
      "settings_no_settings": "No settings needed — continuing to generation.",
      "test_scope_title": "Test Scope",
      "test_scope_comprehensive": "Comprehensive (recommended) — functional tests + browser tests with screenshots",
      "test_scope_basic": "Basic — functional tests only",
      "test_scope_none": "No tests — skip testing",
      "test_scope_comprehensive_short": "Full",
      "test_scope_basic_short": "Basic",
      "test_scope_none_short": "Skip",
      "test_generating": "AI generating tests...",
      "test_running": "Running tests...",
      "test_passed": "All tests passed",
      "test_partial": "Some tests passed, some failed",
      "test_failed": "Tests failed",
      "test_screenshots": "Screenshots",
      "test_fix_auto": "Auto-fix",
      "test_fix_manual": "Test manually",
      "test_fix_skip": "Skip",
      "test_fix_round": "Fix round",
      "test_errors_count": "errors",
      "test_component_passed": "Passed",
      "test_component_failed": "Failed",
      "test_component_skipped": "Skipped",
      "test_planned": "Test planned — will run after registration",
      "test_playwright_unavailable": "Playwright not available, skipping browser tests",
      "test_section_title": "Test",
      "test_prompt": "Test Prompt",
      "test_copy_prompt": "Copy test prompt",
      "test_prompt_copied": "Test prompt copied to clipboard",
      "test_run_with_ai": "Generate & run test with AI",
      "test_code": "Test Code",
      "test_code_placeholder": "Paste AI-generated test code here...",
      "test_run": "Run Test",
      "test_result_title": "Result",
      "test_trace_title": "Diagnostics trace",
      "test_no_testable": "No registered testable components (extension/cortex/app)",
      "generateNextPass": "Generate Next Pass",
      "passProgress": "Pass Progress",
      "passTest": "Test Prompt",
      "passSkeleton": "Skeleton",
      "passUnit": "Unit",
      "passAssembly": "Assembly",
      "passReflection": "Reflection",
      "reflectionHistory": "Reflection History",
      "reflectionDiagnosis": "Diagnosis",
      "reflectionPrescription": "Prescription",
      "escalatedToUser": "Escalated — needs your input",
      "loopDetected": "Loop detected — same fix prescribed twice",
      "maxReflections": "Maximum reflection attempts reached",
      "openrouter": {
        "title": "OpenRouter Settings",
        "apiKey": "API Key",
        "apiKeyPlaceholder": "sk-or-v1-...",
        "apiKeySaved": "API key saved",
        "apiKeyMasked": "●●●●●●●●",
        "model": "AI Model",
        "reasoningModel": "Reasoning Model (blueprints, skeletons, planning)",
        "executionModel": "Execution Model (code, tests, assembly)",
        "modelSelect": "Select model",
        "autoRetry": "Auto-retry on validation error",
        "maxRetries": "Max retries",
        "temperature": "Temperature",
        "temperature_hint": "0 = deterministic, 1 = default, 2 = max creative",
        "topP": "Top P",
        "topP_hint": "Nucleus sampling: 0.1 = focused, 1.0 = full range",
        "maxTokens": "Max tokens",
        "maxTokens_hint": "Max output length. Leave empty for model default.",
        "testConnection": "Test connection",
        "testSuccess": "Connection successful",
        "testFail": "Connection failed",
        "save": "Save settings",
        "delete": "Remove API key",
        "deleteConfirm": "Are you sure you want to remove your OpenRouter API key?",
        "runWithAi": "Run with AI",
        "runAll": "Run all steps",
        "cancel": "Cancel",
        "waiting": "Waiting for AI response...",
        "retrying": "Retrying (attempt {current}/{max})...",
        "stepComplete": "Step completed via AI",
        "stepFailed": "AI could not complete this step",
        "stepDone": "{name} updated successfully",
        "noApiKey": "Configure OpenRouter API key above to use AI autopilot",
        "encryptionNotConfigured": "Server encryption not configured. Contact the node operator.",
        "provider": "AI Provider",
        "provider_openrouter": "OpenRouter — cloud service, hundreds of models",
        "provider_lmstudio": "LM Studio — local AI (localhost)",
        "provider_custom": "Custom — any OpenAI-compatible API",
        "baseUrl": "API URL",
        "baseUrl_hint": "e.g. http://localhost:1234/v1"
      }
    },
    "calibrator": {
      "tabLabel": "Calibrator",
      "title": "Prompt Calibrator",
      "empty": "No calibration projects yet.",
      "newProject": "New Calibration",
      "newProjectName": "Calibration name",
      "newProjectPlaceholder": "e.g., Blueprint Generator Prompt",
      "reasoningModel": "Reasoning AI (the judge)",
      "prompt": "Prompt",
      "targetOutput": "Desired Result",
      "analysisTemplate": "Analysis Prompt Template",
      "analysisTemplatePlaceholders": "Placeholders: {TARGET_OUTPUT}, {CANDIDATE_OUTPUT}, {MODEL_NAME}, {PROMPT_USED}",
      "resetTemplate": "Reset to default",
      "candidateModels": "Candidate Models",
      "addModel": "Add",
      "removeModel": "Remove",
      "runAll": "Run All",
      "runAllAnalyze": "Run All + Analyze",
      "running": "Running...",
      "analyzing": "Analyzing",
      "results": "Results",
      "overallScore": "Overall Score",
      "dimensions": "Dimensions",
      "runHistory": "Run History",
      "noRuns": "No runs yet. Add candidate models and click Run All.",
      "version": "Version",
      "changelog": "What changed?",
      "changelogPlaceholder": "Describe what changed in this version...",
      "save": "Save",
      "saveNewVersion": "Save as new version",
      "copy": "Copy",
      "copyComposed": "Copy composed prompt",
      "archive": "Archive",
      "unarchive": "Unarchive",
      "showArchived": "Show archived",
      "delete": "Delete",
      "deleteConfirm": "Delete this calibration project and all its data?",
      "back": "Back",
      "applyFixes": "Apply proposed fixes",
      "applyingFixes": "Applying fixes...",
      "proposals": "Proposed fixes",
      "passed": "passed",
      "failed": "failed",
      "models": "models",
      "runs": "runs",
      "avgScore": "avg score",
      "provider": "Provider",
      "model": "Model",
      "selectModel": "Select model",
      "chartOverall": "Overall Score",
      "chartByDimension": "By Dimension",
      "step1": "Step 1: Generation",
      "step2": "Step 2: Analysis",
      "step3": "Step 3: Reflection",
      "step3a": "Judge proposals",
      "step3b": "Self-reflection",
      "step4": "Step 4: Synthesis",
      "runStep1": "Run Step 1",
      "runStep2": "Run Step 2",
      "runStep3": "Run Step 3",
      "runStep4": "Run Step 4",
      "runAllSteps": "Run All Steps",
      "newRun": "New Run",
      "newRunAllSteps": "New Run (all steps)",
      "reflectionTemplate": "Reflection Prompt Template (Step 3)",
      "selfReflectionTemplate": "Self-Reflection Prompt Template (Step 3b)",
      "synthesisTemplate": "Synthesis Prompt Template (Step 4)",
      "reflectionPlaceholders": "Placeholders: {PROMPT_USED}, {TARGET_OUTPUT}, {CANDIDATE_OUTPUT}, {MODEL_NAME}, {ANALYSIS_TEXT}",
      "synthesisPlaceholders": "Placeholders: {PROMPT_USED}, {JUDGE_PROPOSALS}, {CANDIDATE_PROPOSALS}",
      "pasteOutput": "Paste output",
      "pasteAnalysis": "Paste analysis",
      "pasteJudgeProposals": "Paste judge proposals",
      "pasteSelfProposals": "Paste self-proposals",
      "pasteSynthesis": "Paste synthesis",
      "groupedProposals": "Grouped proposals",
      "optionA": "Option A (conservative)",
      "optionB": "Option B (moderate)",
      "optionC": "Option C (aggressive)",
      "applySelected": "Apply selected → create new version",
      "copyPromptAndProposals": "Copy prompt + selected proposals",
      "impact": "Impact",
      "overlap": "Overlap",
      "recommendation": "Recommendation",
      "setReasoningModel": "Set a reasoning model to enable analysis and reflection.",
      "addModelsFirst": "Add candidate models first.",
      "saveVersionFirst": "Save a prompt version first.",
      "noTargetWarning": "No desired result set — analysis will have no reference to compare against.",
      "viewPromptSent": "View prompt sent",
      "viewRawResponse": "View raw response",
      "viewOutput": "View output",
      "viewAnalysis": "View full analysis",
      "generating": "Generating",
      "judgeReflecting": "Judge reflecting",
      "selfReflecting": "Self reflecting",
      "synthesizing": "Synthesizing proposals",
      "batch": "Run",
      "batchStatus": "Status",
      "deleteConfirmBatch": "Delete this run and all its data?"
    },
    "visibility": {
      "public": "Public",
      "private": "Private",
      "owner": "My Agents",
      "protected": "Protected",
      "group": "Group"
    },
    "knowledge": {
      "parseError": "Could not parse the pasted content as JSON",
      "notKnowledgePackage": "This doesn't look like an AIMEAT knowledge package",
      "copyFailed": "Failed to copy prompt",
      "cloned": "Package cloned successfully!",
      "cloneFailed": "Clone failed",
      "referencesPackageLevel": "References (package-level)"
    },
    "landing": {
      "home": "Home",
      "heroTitle": "Welcome! Start here",
      "heroSubtitle": "You have four paths forward. Start anywhere — all lead to something useful.",
      "onboardInstall": "Install a ready service",
      "onboardInstallDesc": "Browse packages. One click and you have your own electricity price monitor, digital signage, or company radar.",
      "onboardChat": "Do something with AI Chat",
      "onboardChatDesc": "Copy a prompt, paste it into your AI Chat. You get a working app that uses AIMEAT memory. No coding.",
      "onboardAgent": "Connect an AI agent",
      "onboardAgentDesc": "Give Claude/ChatGPT access here. It can bring data, remember things, and work on your behalf.",
      "onboardGenerator": "Generate a full service",
      "onboardGeneratorDesc": "Tell us what you need. The generator interviews you and creates everything: UI, backend, translations, data.",
      "tagEasiest": "easiest",
      "tagLater": "later",
      "knowledgeTitle": "Your research and conversations are valuable",
      "knowledgeDesc": "You've already done a lot of work with AI. Bring it here — structured, searchable, shareable. Copy the Knowledge Packager prompt, paste it into your AI Chat, and everything you've researched becomes structured knowledge.",
      "knowledgeBtnTitle": "Bring your AI research here",
      "knowledgeBtnDesc": "Copy Knowledge Packager, paste into your AI Chat — your conversations become structured knowledge.",
      "ghostSectionTitle": "Popular services",
      "ghostInstall": "install",
      "cortexSectionTitle": "Ready-made extensions — add to your AI Chat",
      "cortexCharts": "Charts",
      "cortexChartsDesc": "Charts for your data — bar, line, pie. Touch + mouse.",
      "cortexCanvas": "Canvas",
      "cortexCanvasDesc": "Draw and save to storage. Undo, export, pen & shapes.",
      "menuBuildShare": "Build & share",
      "menuManagement": "Management",
      "menuInfra": "Infrastructure",
      "menuInfraAnnotation": "node operators only",
      "expandAll": "Show all settings",
      "expandMore": "Show all",
      "myApps": "My apps",
      "viewAll": "View all",
      "editProfile": "edit profile",
      "editModalTitle": "Edit profile",
      "editDisplayName": "Display name",
      "editDisplayNamePlaceholder": "Your visible name",
      "editBio": "Bio",
      "editBioPlaceholder": "A short description about yourself",
      "editAvatar": "Avatar",
      "editAvatarPlaceholder": "Emoji or short text",
      "editLocale": "Language",
      "editEmail": "Email",
      "editEmailNone": "Not set",
      "editEmailHint": "Change in Email tab",
      "editSave": "Save",
      "editCancel": "Cancel",
      "editSaving": "Saving...",
      "editSaved": "Profile updated",
      "editError": "Failed to update profile",
      "changePassword": "change password",
      "changePasswordTitle": "Change password",
      "currentPassword": "Current password",
      "newPassword": "New password",
      "confirmPassword": "Confirm new password",
      "passwordMismatch": "Passwords do not match",
      "passwordChanged": "Password changed successfully",
      "passwordChangeFailed": "Failed to change password",
      "passwordChanging": "Changing...",
      "passwordRequirements": "Min 8 characters, uppercase, lowercase, number",
      "federationBadge": "{count} node(s) in federation",
      "packagesExt": "Packages & Extensions",
      "notificationsBadge": "Notifications",
      "ownPackages": "Own packages",
      "connectAgent": "Connect new agent",
      "installFirst": "Install first app",
      "waitingTitle": "Waiting for you",
      "draftsToReview": "{n} drafts to review",
      "joinReqOne": "1 join request",
      "joinReqMany": "{n} join requests",
      "inviteWaiting": "You’re invited",
      "reviewBtn": "Review",
      "viewBtn": "View",
      "continueTitle": "Continue",
      "agentsTitle": "Agents",
      "activeTodayCount": "{n} active today",
      "agentActiveToday": "active today",
      "nextRunAt": "next run {time}",
      "promoDismiss": "Hide",
      "profileBtn": "Profile",
      "editLocaleHint": "Your preferred language — used for the portal UI; agents can read it from your profile to answer in it.",
      "editEmailLink": "Change in the Email tab →",
      "pwMin": "At least 8 characters",
      "pwUpper": "An uppercase letter",
      "pwLower": "A lowercase letter",
      "pwDigit": "A number",
      "changePasswordBtn": "Change password",
      "showPassword": "Show",
      "hidePassword": "Hide",
      "menuInformation": "Information",
      "menuAutomation": "Automation",
      "menuActivity": "Activity",
      "menuAccount": "Account",
      "menuPinned": "Pinned",
      "pinAdd": "Pin",
      "pinRemove": "Unpin",
      "pinLimit": "Max 5 pinned items"
    }
  },
  "dev": {
    "title": "AIMEAT Onboarding Portal",
    "subtitle": "Connect any AI to this node — select your platform to get started",
    "stats": {
      "agents": "Agents",
      "chatSessions": "Chat Sessions",
      "services": "Services",
      "boards": "Boards"
    },
    "quickStart": {
      "title": "Quick Start — Already have an AI open?",
      "desc": "Copy-paste this into your AI chat and it will connect itself:",
      "copy": "Copy",
      "note": "Works with AIs that can browse the web (Grok, Claude, ChatGPT with browsing, etc.). The URL returns JSON instructions the AI will understand.",
      "fallback": "If your AI can’t browse, pick your platform below instead."
    },
    "step1": {
      "label": "Select Your AI Platform"
    },
    "step2": {
      "label": "Select Your Subscription / Variant"
    },
    "step3": {
      "label": "Choose How to Connect"
    },
    "step4": {
      "label": "Share Your App"
    },
    "mode": {
      "loggedIn": "Logged in as",
      "loggedInDesc": "You can upload apps and get a shareable download link. Other users can browse and download your apps.",
      "anonymous": "Anonymous Mode",
      "anonymousDesc": "You can generate prompts and apps without logging in.",
      "anonymousNote": "To share apps with others, you’ll need to share the HTML file yourself (email, drive, etc.).",
      "signUp": "Sign up",
      "signUpNote": "to get a personal download link others can use."
    },
    "community": {
      "title": "Community Apps",
      "desc": "Apps uploaded by users on this node. Download and open locally in your browser."
    },
    "profile": "Profile",
    "humanPortal": "For Everyone",
    "tier": {
      "mcp": "MCP Connection",
      "api": "API Connection",
      "browse": "Browse (Read-Only)",
      "prompt": "Prompt Package"
    },
    "tabs": {
      "apps": "Apps",
      "appsDesc": "Build Applications",
      "mcp": "MCP",
      "mcpDesc": "AI Integration",
      "api": "API",
      "apiDesc": "REST Interface",
      "unavailable": "Not available on this plan",
      "upgradeForMcp": "MCP requires a paid plan. Upgrade to access 18 AIMEAT tools directly from your AI.",
      "upgradeForApi": "This plan cannot make HTTP requests. Use Apps to generate a complete web application instead."
    },
    "copy": "Copy",
    "copied": "Copied!",
    "download": "Download",
    "upload": "Upload to Node",
    "uploading": "Uploading...",
    "uploaded": "Uploaded!",
    "uploadFailed": "Upload failed",
    "shareLink": "Share link",
    "noApps": "No community apps yet.",
    "panel": {
      "mcpBadge": "🔌 MCP — AI Integration",
      "mcpPrereqTitle": "⚠ Prerequisite: AIMEAT Account Required",
      "mcpPrereqDesc": "MCP uses OAuth to authenticate your agent identity. You need to <strong>sign up first</strong> (click your avatar or the sign-up button above) to create an owner account and agent. Once logged in, your agent's GAII will appear here.",
      "mcpReady": "✅ Your agent is ready for MCP",
      "mcpReadyDesc": "When your AI platform triggers the OAuth flow, it will authenticate using your agent identity shown above. Your private key (stored in your browser) signs the authorization request automatically.",
      "mcpStep1": "Open your AI platform's <strong>Settings → Connectors / MCP Servers</strong>",
      "mcpStep2": "Add a new MCP server with this URL:",
      "mcpStep3": "Your platform triggers OAuth — AIMEAT authenticates your agent via <strong>Ed25519 signature</strong> and issues access tokens",
      "mcpStep4": "Once connected, try: <em>\"Check my AIMEAT node catalogue\"</em>",
      "mcpTools": "You'll have access to <strong>18 MCP tools</strong>: catalogue search, agent profile, memory read/write/list, action execute, work queue, wallet, boards, storage, and 4 admin tools (operator only).",
      "mcpSetupTitle": "🤖 Connect Your AI Assistant",
      "mcpSetupDesc": "Choose your Claude product below. Each has a different setup method.",
      "mcpSetupCodeDesc": "Run one command in your terminal. Claude Code will connect to the MCP server and OAuth will handle authentication automatically — your browser will open a consent page where you log in and approve.",
      "mcpCodeRunThis": "Run this in your terminal:",
      "mcpCopyCommand": "Copy Command",
      "mcpCopied": "Copied!",
      "mcpCodeOAuthNote": "When Claude Code first connects, your browser will open the OAuth consent page. Log in with your GHII and approve the connection. Tokens refresh automatically.",
      "mcpSetupCoworkDesc": "Add AIMEAT as a custom connector in Claude Desktop. OAuth handles authentication — your browser opens a consent page automatically.",
      "mcpDesktopStep1": "Open Claude Desktop → Settings (gear icon) → Connectors → Add custom connector",
      "mcpDesktopStep2": "Enter a name (e.g. \"aimeat.io\") and the MCP server URL:",
      "mcpDesktopStep3": "Click Add, then Connect — your browser opens the OAuth consent page. Log in with your GHII and approve.",
      "mcpDesktopStep4": "Done! AIMEAT tools now appear in your Claude Desktop conversations.",
      "mcpDesktopNote": "OAuth handles everything automatically. No connectivity keys, no manual JWT setup. Tokens refresh in the background.",
      "mcpSetupChatDesc": "Add AIMEAT as a custom connector in your Claude.ai settings. OAuth handles authentication — you'll be guided through a consent page:",
      "mcpChatStep1": "Open claude.ai → Settings (bottom-left gear icon)",
      "mcpChatStep2": "Click Connectors → Add custom connector",
      "mcpChatStep3": "Enter a name (e.g. \"aimeat.io\") and the MCP server URL:",
      "mcpChatStep4": "Complete the OAuth consent — log in with your GHII, select which agent to authorize, and approve",
      "mcpChatStep5": "Done! AIMEAT tools will now appear in your Claude.ai conversations",
      "mcpChatNote": "OAuth handles everything automatically. No connectivity keys, no manual JWT setup. Tokens refresh in the background.",
      "mcpCopyUrl": "Copy URL",
      "mcpProfileLink": "Connected MCP sessions appear under your profile.",
      "mcpProfileLinkAction": "View your sessions →",
      "mcpAuthDetails": "How does MCP authentication work?",
      "mcpAuthExplain": "<strong>OAuth 2.1 with Ed25519 signatures:</strong><ol style='margin:.5rem 0 0 1.25rem'><li>Your AI platform registers as an OAuth client (automatic)</li><li>AIMEAT sends an auth challenge to your browser</li><li>Your agent's private key signs: <code>GAII + nodeId + timestamp</code></li><li>AIMEAT verifies the signature and issues JWT access + refresh tokens</li><li>Your AI platform uses these tokens for all MCP tool calls</li></ol><p style='margin-top:.5rem'>Tokens refresh automatically. Your private key never leaves your browser.</p>",
      "apiBadge": "📡 API — REST Interface",
      "apiDesc": "Your AI can make HTTP calls. Copy this prompt and paste it into your AI chat:",
      "browseBadge": "📡 API — Browse Only",
      "browseDesc": "Your AI can browse URLs. Copy this prompt to get started:",
      "browseUpgradeTitle": "Want full access?",
      "browseUpgrade1": "Upgrade your plan for MCP support",
      "browseUpgrade2": "Or switch to a tool-capable AI (Claude Code, VS Code Copilot)",
      "browseUpgrade3": "Or use the {{promptPackageLink}} to generate an HTML app",
      "promptPackageLabel": "Prompt Package",
      "promptBadge": "🖥️ Apps — Application Builder",
      "promptDesc": "Your AI can't make web requests, but it can <strong>generate code</strong> for you! Select what you want to build, then copy the prompt into your AI chat. The AI will interview you and generate a complete HTML application.",
      "promptLoggedIn": "You're logged in — after your AI generates the app, come back here to upload it and get a shareable link!",
      "promptAnon": "Anonymous mode — you'll need to share the generated HTML file yourself.",
      "promptSignUp": "Sign up",
      "promptSignUpNote": "to upload and get a share link.",
      "loading": "Loading..."
    },
    "goals": {
      "dashboard": "Personal Dashboard",
      "notes": "Note-Taking App",
      "game": "Multiplayer Game",
      "news": "News / Content Reader",
      "marketplace": "Service Marketplace",
      "chat": "Chat / Messaging",
      "iot": "IoT / Data Dashboard",
      "custom": "Custom — I'll Describe"
    },
    "status": {
      "updating": "Updating...",
      "signInFirst": "Please sign in first",
      "codeUpdated": "Access code updated.",
      "codeRemoved": "Access code removed — app is now public.",
      "codeUpdatedShort": "Code updated",
      "codeRemovedShort": "Code removed"
    },
    "uploadSection": {
      "desc": "After your AI generates the HTML file, upload it here to get a shareable download link.",
      "accessCodeLabel": "Access Code (optional)",
      "accessCodePlaceholder": "Leave empty for public access",
      "accessCodeNote": "If set, downloaders will need this code. 4–64 characters.",
      "dragDrop": "Drag & drop your .html file here, or:",
      "chooseFile": "Choose File",
      "protected": "Protected with access code.",
      "changeCode": "Change Access Code",
      "newCodePlaceholder": "New code (or leave empty to remove)",
      "setCodePlaceholder": "Set a code to protect",
      "updateBtn": "Update",
      "fileSize": "File size: ",
      "shareTitle": "Share Your App",
      "shareDesc": "After your AI generates the HTML file:",
      "shareStep1": "Save the generated code as an .html file",
      "shareStep2": "Open it in your browser to test",
      "shareStep3": "Share the file with others via email, cloud drive, or messaging",
      "wantEasier": "Want easier sharing?",
      "createAccount": "Create an account",
      "downloadLinkNote": "to upload your app and get a personal download link like:"
    },
    "appList": {
      "protected": "Protected",
      "by": "by ",
      "accessCode": "Access code",
      "newCodePlaceholder": "New code or empty to remove",
      "setCodePlaceholder": "Set access code",
      "enterCode": "Please enter the access code"
    },
    "platformNotes": {
      "noHttp": "Cannot make external HTTP calls",
      "terminal": "Can run terminal commands",
      "vscodeSettings": "Add as MCP server in VS Code settings",
      "pythonSandbox": "Python sandbox — can make HTTP requests",
      "functionCalling": "Models with function calling",
      "indexnow": "Can browse pages indexed in Bing (IndexNow)"
    }
  },
  "init": {
    "welcome": "AIMEAT Node Configuration Wizard",
    "langPrompt": "Select language / Valitse kieli",
    "langEn": "English",
    "langFi": "Suomi",
    "useCase": "What will you use this node for?",
    "useCasePublic": "Public node",
    "useCasePublicDesc": "Serves AI agents on the internet",
    "useCasePersonal": "Personal node",
    "useCasePersonalDesc": "Private use, behind firewall",
    "useCaseDev": "Development",
    "useCaseDevDesc": "Testing and development",
    "useCaseCustom": "Custom",
    "useCaseCustomDesc": "Skip to full configuration",
    "nodeId": "Node ID",
    "nodeIdHint": "Unique name for this node on the network",
    "nodeIdInvalid": "Node ID must match format: aimeat-{region}-{number}-{name} (e.g. aimeat-fi-001-home)",
    "port": "Port",
    "portHint": "HTTP port the server listens on",
    "portInvalid": "Port must be between 1 and 65535",
    "baseUrl": "Public URL",
    "baseUrlHint": "The public URL where this node is reachable (e.g. https://mynode.example.com)",
    "baseUrlInvalid": "Must start with http:// or https://",
    "dbUrl": "MongoDB URL",
    "dbUrlHint": "Leave empty for in-memory storage (data lost on restart)",
    "dbUrlInvalid": "Must be a valid mongodb:// (or mongodb+srv://) or postgresql:// connection URL",
    "adminPassword": "Admin password",
    "adminPasswordHint": "Password for the operator admin panel (min 8 characters)",
    "adminPasswordWeak": "Password must be at least 8 characters",
    "adminPasswordSkip": "Leave empty to auto-generate on startup",
    "anonymous": "Enable anonymous mode?",
    "anonymousHint": "No auth required — all agents share one memory space",
    "devMode": "Enable dev mode?",
    "devModeHint": "Bypasses some security checks for testing",
    "extended": "Enable extended features?",
    "extendedHint": "Boards, federation, storage, validation",
    "networkRole": "What is this node's role in the network?",
    "networkRoleOperator": "Genesis operator",
    "networkRoleOperatorDesc": "You run the network — your node is the directory others register with",
    "networkRoleContributor": "Network contributor",
    "networkRoleContributorDesc": "Offer resources to the genesis network, earn morsels from transit",
    "networkRoleStandalone": "Standalone",
    "networkRoleStandaloneDesc": "Independent node, manual peering only",
    "genesisUrl": "Genesis node URL",
    "genesisUrlHint": "URL of the genesis node to register with (e.g. https://aimeat.io)",
    "genesisUrlInvalid": "Must start with http:// or https://",
    "indexNowKey": "IndexNow key (enables Bing/Yandex search indexing)",
    "indexNowKeyHint": "Generate with: openssl rand -hex 16",
    "advancedPrompt": "Configure advanced settings?",
    "advancedNo": "No, use defaults (recommended)",
    "advancedEconomy": "Economy settings",
    "advancedEconomyDesc": "Morsels, allowances, burn rate",
    "advancedAll": "All settings",
    "advancedAllDesc": "Quotas, rate limits, federation, work queue...",
    "welcomeBonus": "Welcome bonus (morsels)",
    "dailyAllowance": "Daily allowance (morsels)",
    "dailyAllowanceCap": "Daily allowance cap",
    "burnRate": "Burn rate (0–1)",
    "burnRateInvalid": "Must be a number between 0 and 1",
    "maxMint": "Max operator mint per day",
    "boardPostCost": "Board post base cost (morsels)",
    "boardPostCostKb": "Board post cost per KB (morsels)",
    "jwtTtl": "JWT lifetime (seconds)",
    "memoryQuota": "Memory quota per user (MB)",
    "memoryMaxValueSizeKb": "Max single memory value size (KB)",
    "memoryMaxKeys": "Max memory keys per agent",
    "storageQuota": "Storage quota per user (MB)",
    "storageMaxFileSize": "Max single file upload size (MB)",
    "microMemoryMaxSets": "Max micro-memory sets per agent",
    "microMemoryMaxKeysPerSet": "Max keys per micro-memory set",
    "microMemoryMaxValueSize": "Max micro-memory value size (bytes)",
    "maxActionsPerAgent": "Max actions per agent",
    "appMaxSize": "Max app file size (MB)",
    "agentPortingFee": "Agent porting fee (morsels)",
    "maxRelayHops": "Max federation relay hops",
    "crossFedNote": "Cross-federation (genesis peering) lets you connect with nodes outside your federation cluster — or connect standalone nodes directly. It's separate from the operator/contributor federation above. Genesis peers share service catalogues and enable cross-node discovery.",
    "crossFedEnabled": "Enable cross-federation (genesis peering)?",
    "crossFedMaxPeers": "Max genesis peer connections (1-100)",
    "crossFedMaxPeersInvalid": "Must be between 1 and 100",
    "crossFedSyncInterval": "Catalogue sync interval in hours (1-168)",
    "crossFedSyncIntervalInvalid": "Must be between 1 and 168",
    "rateLimitGlobal": "Global rate limit (requests/second)",
    "corsOrigins": "Allowed CORS origins (comma-separated, * for all)",
    "numInvalid": "Must be a positive number",
    "outputPrompt": "Where to save?",
    "outputEnv": "Write to .env (recommended)",
    "outputIni": "Write to aimeat.ini (human-friendly INI format)",
    "outputJson": "Write to config JSON file (for --config)",
    "jsonNamePrompt": "Config file name?",
    "jsonNameCustom": "Custom name",
    "outputCancel": "Cancel",
    "existingFile": "{{file}} already exists. What to do?",
    "existingMerge": "Merge (keep existing, add new)",
    "existingOverwrite": "Overwrite",
    "existingCancel": "Cancel",
    "operatorTitle": "Operator info (privacy policy)",
    "operatorIntro": "AIMEAT renders a privacy policy at /v1/privacy with the operator's identity. This is required by GDPR for any node serving users. The next prompts collect the legal fields. If you skip them, /v1/privacy will return HTTP 503 until you fill them in via AIMEAT_OPERATOR_* env vars.",
    "operatorPersonalAsk": "This is a personal node — set up privacy policy details now? (recommended if anyone else might use this node)",
    "operatorName": "Legal name (the controller)",
    "operatorNameRequired": "Operator name is required",
    "operatorType": "Operator type",
    "operatorTypeNaturalPerson": "Natural person (individual)",
    "operatorTypeCompany": "Company",
    "operatorTypeOrganisation": "Organisation",
    "operatorTypeAssociation": "Association",
    "operatorAddress": "Postal address (required by GDPR for the controller)",
    "operatorAddressRequired": "Postal address is required",
    "operatorCountry": "Country of operation",
    "operatorCountryRequired": "Country is required",
    "operatorEmail": "Privacy contact email",
    "operatorEmailRequired": "Privacy email is required",
    "operatorEmailInvalid": "Must be a valid email address",
    "operatorSecurityEmail": "Security contact email (leave empty to reuse the privacy email)",
    "operatorHostingName": "Hosting provider name",
    "operatorHostingNameRequired": "Hosting provider name is required",
    "operatorHostingUrl": "Hosting provider URL (optional, for the privacy-page link)",
    "operatorHostingLocation": "Hosting location (e.g. France (EU/EEA))",
    "operatorHostingLocationRequired": "Hosting location is required",
    "operatorSupervisoryName": "Data protection supervisory authority (in your jurisdiction)",
    "operatorSupervisoryNameRequired": "Supervisory authority name is required",
    "operatorSupervisoryUrl": "Supervisory authority URL",
    "operatorSupervisoryUrlRequired": "Supervisory authority URL is required",
    "operatorEffectiveDate": "Privacy policy effective date (YYYY-MM-DD)",
    "summaryTitle": "Configuration Summary",
    "summaryChanged": "Changed from default:",
    "summaryDefault": "All other settings use defaults.",
    "backupCreated": "Backup saved to {{file}}",
    "written": "Config written to {{file}}",
    "scaffoldPrompt": "Copy runtime files (public/, locales/, static/) into this directory?",
    "scaffoldCopying": "Scaffolding runtime files...",
    "scaffoldDone": "Scaffolded: {{copied}} copied, {{updated}} updated, {{skipped}} skipped (user-modified)",
    "scaffoldSkippedFile": "Skipped (modified): {{file}}",
    "scaffoldNoSource": "Could not locate package assets to scaffold. Skipping file copy.",
    "updateDone": "Assets updated: {{copied}} new, {{updated}} updated, {{skipped}} skipped (user-modified)",
    "cancelled": "Setup cancelled.",
    "nextSteps": "Next steps:",
    "nextStep1": "Review the config:     cat {{file}}",
    "nextStep2": "Validate settings:     aimeat validate",
    "nextStep3": "Start the node:        aimeat start",
    "nextStepIni": "Start the node:        aimeat start  (auto-detects {{file}})",
    "nextStepJson": "Start with config:     aimeat start --config {{file}}",
    "done": "Done! Your node is ready.",
    "joinNow": "Join the federation network now?",
    "joinFailed": "Federation join failed: {{error}}",
    "joinRetryHint": "Your configuration was saved successfully. You can retry joining later with: aimeat join",
    "consentEnabled": "Enable consent layer (data sharing permissions)?",
    "consentMaxPerUser": "Maximum consent rules per user",
    "consentMaxInvalid": "Must be a positive number",
    "consentAuditDays": "Audit log retention (days)",
    "consentAuditInvalid": "Must be a positive number",
    "cookieConsent": "Enable cookie consent banner?",
    "cookieConsentHint": "GDPR/ePrivacy cookie banner for portal pages (for service builders)",
    "cookieConsentCategories": "Cookie categories (comma-separated)",
    "cookieConsentCategoriesHint": "e.g. necessary,analytics,marketing",
    "cookieConsentPolicyUrl": "Privacy policy URL",
    "cookieConsentPolicyUrlHint": "Link shown in the cookie banner (recommended for GDPR)",
    "cookieConsentPolicyUrlInvalid": "Must start with http:// or https://",
    "siteEnabled": "Enable Node Portal (custom HTML template)?",
    "siteEnabledHint": "Serve a custom HTML template at GET / with dynamic {{type:key}} tags",
    "siteMaxTemplateSizeKb": "Max template size (KB)",
    "siteMaxTemplateSizeKbHint": "Maximum allowed size for the HTML template upload",
    "siteCacheTtlSeconds": "Template cache TTL (seconds)",
    "siteCacheTtlSecondsHint": "How long to cache the resolved template (0 = no cache)",
    "storage_label": "Storage backend",
    "storage_hint": "Where to store data",
    "storage_memory": "In-memory (development only, data lost on restart)",
    "storage_sqlite": "SQLite (personal use, zero-config file-based storage)",
    "storage_mongodb": "MongoDB (production, requires external server)",
    "storage_postgresql": "PostgreSQL (production, requires external server)",
    "sqlite_path_label": "SQLite database path",
    "sqlite_path_hint": "File path for the SQLite database (auto-created)",
    "pushEnabled": "Enable push notifications for personal nodes?",
    "pushEnabledHint": "Sends Web Push alerts when messages arrive while a personal node is offline",
    "vapidPublicKey": "VAPID public key",
    "vapidPublicKeyHint": "Generate with: npx web-push generate-vapid-keys",
    "vapidPrivateKey": "VAPID private key",
    "vapidPrivateKeyHint": "Keep this secret — never share it",
    "vapidPrivateKeyInvalid": "VAPID private key looks too short (expected ~43 chars)",
    "vapidSubject": "VAPID subject (contact email)",
    "vapidSubjectHint": "e.g. mailto:admin@example.com",
    "vapidSubjectInvalid": "Must start with mailto: or https://",
    "smtpEnabled": "Enable email notifications?",
    "smtpEnabledHint": "Send email alerts when personal nodes are offline",
    "smtpHost": "SMTP server hostname",
    "smtpHostHint": "e.g. smtp.gmail.com or mail.example.com",
    "smtpPort": "SMTP port",
    "smtpPortHint": "Usually 587 (STARTTLS) or 465 (TLS)",
    "smtpPortInvalid": "Port must be between 1 and 65535",
    "smtpUser": "SMTP username",
    "smtpUserHint": "Usually an email address",
    "smtpPass": "SMTP password",
    "smtpFrom": "From address",
    "smtpFromHint": "e.g. AIMEAT <noreply@example.com>",
    "smtpSecure": "Use TLS (port 465)?",
    "smtpSecureHint": "Set to true only for port 465. Port 587 uses STARTTLS automatically",
    "metricsEnabled": "Enable Prometheus metrics endpoint (/v1/metrics)?",
    "metricsAccess": "Who can access the metrics endpoint?",
    "metricsAccessPublic": "Public (anyone)",
    "metricsAccessAuthenticated": "Authenticated users",
    "metricsAccessOperator": "Operator only (recommended)",
    "totpEnabled": "Enable TOTP two-factor authentication?",
    "totpIssuer": "TOTP issuer name (shown in authenticator apps)",
    "totpMaxFailed": "Max failed TOTP attempts before lockout",
    "totpLockoutSeconds": "TOTP lockout duration (seconds)",
    "matchingEnabled": "Enable AI-powered interest matching?",
    "matchIntervalHours": "Hours between matching runs",
    "matchThreshold": "Minimum similarity score for a match (0-1)",
    "matchMaxSuggestions": "Maximum match suggestions per user",
    "matchMaxDistanceKm": "Maximum distance for location-based matching (km)",
    "marketplaceEnabled": "Enable marketplace features?",
    "marketplaceListingFee": "Morsels charged to list an item",
    "marketplaceTxFeePercent": "Transaction fee percentage",
    "marketplaceEscrow": "Enable escrow for marketplace transactions?",
    "realtimeEnabled": "Enable realtime P2P signaling (WebRTC)?",
    "realtimeMaxRooms": "Maximum concurrent P2P rooms",
    "realtimeMaxPeersPerRoom": "Maximum peers per room",
    "extensionsEnabled": "Enable V8 isolate extension system?",
    "extensionMaxMemoryMb": "Max memory per extension isolate (MB)",
    "extensionTimeoutMs": "Extension execution timeout (ms)"
  },
  "join": {
    "title": "Join AIMEAT Federation",
    "targetUrl": "Genesis node URL",
    "targetUrlPlaceholder": "https://aimeat.io",
    "noConfig": "No .env or --config found. Using defaults. Tip: aimeat join --config <file.json>",
    "targetUrlRequired": "URL is required",
    "targetUrlInvalid": "Must start with http:// or https://",
    "discovering": "Discovering target node...",
    "discoveryFailed": "Discovery failed",
    "connectionFailed": "Could not connect to {{url}}: {{error}}",
    "notAimeat": "Target is not an AIMEAT node",
    "discovered": "Found {{nodeId}}",
    "targetInfo": "Target node info",
    "targetInfoNodeId": "Node: {{nodeId}}",
    "targetInfoType": "Type: {{nodeType}}",
    "targetInfoProtocol": "Protocol: {{protocol}} v{{version}}",
    "rolePrompt": "Your role in this network?",
    "roleContributor": "Contributor",
    "roleContributorHint": "Offer your node to the network (auto-registers)",
    "roleOperator": "Operator",
    "roleOperatorHint": "Join as a peer operator (requires approval)",
    "ensuringKeypair": "Checking keypair...",
    "keypairGenerated": "New Ed25519 keypair generated and saved to .env",
    "keypairExists": "Using existing keypair",
    "sending": "Introducing ourselves to genesis...",
    "sendFailed": "Introduction failed: {{error}}",
    "targetMaintenance": "Target node is in maintenance mode. Try again later.",
    "autoApproved": "Request accepted (auto-approved)",
    "pendingApproval": "Request sent (pending approval)",
    "waitingApproval": "Waiting for genesis operator to approve... (Ctrl+C to check later)",
    "approved": "Approved!",
    "rejected": "Request rejected",
    "rejectedMessage": "The genesis operator rejected the peering request. Contact them for details.",
    "keyExchange": "Exchanging keys...",
    "keyExchangeDone": "Keys exchanged",
    "keyExchangeFailed": "Key exchange failed: {{error}}",
    "envUpdated": "Federation config saved to .env",
    "nextSteps": "Next steps:",
    "nextStep1": "Start the node:         aimeat start",
    "nextStep2": "Check peer status:      aimeat start, then GET /v1/federation/peers",
    "done": "Joined! Your node is now part of the network.",
    "resumeHint": "Run \"aimeat join {{url}}\" again to check approval status.",
    "resumeFound": "Found pending join request ({{requestId}}). Resume polling?",
    "resumeYes": "Yes, check status",
    "resumeNo": "No, start fresh",
    "alreadyPeer": "This node is already a peer of the target"
  },
  "cookieConsent": {
    "title": "Cookie Settings",
    "description": "This site uses cookies to improve your experience. You can choose which categories to allow.",
    "acceptAll": "Accept all",
    "rejectAll": "Reject all",
    "settings": "Settings",
    "save": "Save settings",
    "categories": {
      "necessary": {
        "title": "Necessary",
        "description": "Essential cookies required for the site to function. Cannot be disabled."
      },
      "analytics": {
        "title": "Analytics",
        "description": "Cookies that help us understand how you use the site so we can improve it."
      },
      "marketing": {
        "title": "Marketing",
        "description": "Cookies used to deliver relevant ads and track campaign effectiveness."
      }
    },
    "policyLink": "Privacy Policy"
  },
  "modal": {
    "title": "❤️ AIMEAT Sign In",
    "descNew": "New? Pick a username and password to create your account.",
    "descReturning": "Already have an account? Enter your username and password.",
    "usernamePlaceholder": "Username",
    "passwordPlaceholder": "Password (min 4 chars)",
    "displayNamePlaceholder": "Display Name (optional, for new accounts)",
    "signInBtn": "Sign In / Register",
    "cancelBtn": "Cancel",
    "working": "Working...",
    "errUserShort": "Username must be at least 3 characters",
    "errPassShort": "Password must be at least 4 characters",
    "errWrongPass": "Wrong password for that username.",
    "connectingHome": "Connecting to home node...",
    "errFederatedLogin": "Could not reach home node {remoteNode} for federated login.",
    "loggedIn": "logged in",
    "logoutBtn": "Logout",
    "usernameLabel": "Username",
    "passwordLabel": "Password",
    "displayNameLabel": "Display Name",
    "displayNameHint": "optional, for new accounts",
    "forgotPassword": "Forgot password?",
    "forgotUsername": "Forgot username?",
    "resetPasswordTitle": "Reset Password",
    "resetPasswordDesc": "Enter your username to receive a reset code by email.",
    "sendResetCode": "Send Reset Code",
    "backToLogin": "Back to Login",
    "resetCodeSent": "If your account has a verified email, a reset code was sent.",
    "enterNewPasswordTitle": "Enter New Password",
    "codeLabel": "Reset Code",
    "newPasswordLabel": "New Password",
    "newPasswordPlaceholder": "New password (min 8 chars)",
    "errPassWeak": "Password must be at least 8 characters",
    "resetPassword": "Reset Password",
    "resetSuccess": "Password reset successful! You can now sign in.",
    "recoverUsernameTitle": "Recover Username",
    "recoverUsernameDesc": "Enter the email address associated with your account.",
    "emailLabel": "Email",
    "sendUsername": "Send My Username",
    "usernameSent": "If an account with that email exists, your username was sent.",
    "whyTitle": "✨ What do you get?",
    "whyGhii": "A free GHII (Global Human Intelligence Identifier), your personal AI identity",
    "whyPrivacy": "Your own private memory space, protected by your password",
    "whyControl": "Full control: only you can access your data, no need to share with anyone",
    "whyAgents": "Connect AI agents that remember you and work on your behalf",
    "whyMorsels": "100 free heart morsels to start! E.g. memory request ~ 1 ❤️, board post ~ 2 ❤️. You get 50 more every day"
  },
  "dashboard": {
    "title": "AIMEAT Admin Dashboard",
    "overview": "Overview",
    "owners": "Owners",
    "agents": "Agents",
    "actions": "Actions",
    "boards": "Boards",
    "boardsTab": {
      "membersColumn": "Members",
      "externalMembersCount": "{count} external members",
      "sameOwnerInfo": "Same-owner agents have automatic access",
      "membersSection": "Members",
      "addMemberPlaceholder": "Enter GAII (e.g. agent#owner@node)",
      "addMemberBtn": "Add",
      "memberAdded": "Member added",
      "memberRemoved": "Member removed",
      "memberError": "Failed to update members",
      "noMembers": "No external members"
    },
    "work": "Work",
    "economy": "Economy",
    "federation": "Federation",
    "hooks": "Hooks",
    "maintenance": "Maintenance",
    "config": "Config",
    "refresh": "Refresh",
    "logout": "Logout",
    "loading": "Loading...",
    "loginTitle": "❤️ AIMEAT Dashboard",
    "loginDesc": "Login to access the admin dashboard",
    "username": "Username",
    "password": "Password",
    "login": "Login",
    "advancedKeyLogin": "Advanced: Login with private key",
    "ownerName": "Owner name",
    "privateKey": "Private key",
    "loginWithKey": "Login with Key",
    "backToPassword": "Back to password login",
    "nodeId": "Node ID",
    "uptime": "Uptime",
    "storage": "Storage",
    "registeredOwners": "Registered Owners",
    "registeredAgents": "Registered Agents",
    "publishedActions": "Published Actions",
    "activeBoards": "Active Boards",
    "chatInstances": "Chat Instances",
    "activeChatSessions": "Active Chat Sessions",
    "noChatInstances": "No chat instances",
    "totalMorsels": "Total Morsels",
    "grantOperator": "Grant Operator",
    "mint": "Mint",
    "mintMorsels": "Mint Morsels",
    "gaii": "GAII",
    "amount": "Amount",
    "backup": "Download Backup",
    "restore": "Upload Restore",
    "clearHooks": "Clear All",
    "noData": "No data",
    "trackingCode": "Tracking Code",
    "status": "Status",
    "action": "Action",
    "requester": "Requester",
    "provider": "Provider",
    "cost": "Cost",
    "nodeHealth": "Node Health",
    "economyToday": "Economy Today",
    "quickConfig": "Quick Config",
    "noOwnersFound": "No owners found",
    "noAgentsRegistered": "No agents registered",
    "noActionsPublished": "No actions published",
    "noBoardsCreated": "No boards created",
    "noWorkContracts": "No work contracts found",
    "noFederationPeers": "No federation peers",
    "name": "Name",
    "displayName": "Display Name",
    "roles": "Roles",
    "created": "Created",
    "trust": "Trust",
    "lastSeen": "Last Seen",
    "lastLogin": "Last Login",
    "morselSupply": "Morsel Supply",
    "todayActivity": "Today's Activity",
    "morselPolicy": "Morsel Policy",
    "maintenanceMode": "Maintenance Mode",
    "operational": "OPERATIONAL",
    "maintenanceOn": "MAINTENANCE ON",
    "backupRestore": "Backup & Restore",
    "downloadBackup": "Download Backup",
    "restoreFromFile": "Restore from File",
    "extensionHooks": "Extension Hooks",
    "nodeSettings": "Node Settings",
    "configApi": "Config API",
    "peeringRequests": "Peering Requests",
    "federationInfo": "Federation Info",
    "signingIn": "Signing in...",
    "loginFailed": "Login failed",
    "accessDenied": "Access Denied",
    "operatorRequired": "You need the operator role to access the admin dashboard.",
    "loginNeedOperator": "Sign in with an operator account to access the dashboard.",
    "usernamePasswordRequired": "Username and password required",
    "warnings": "Warnings",
    "id": "ID",
    "category": "Category",
    "tags": "Tags",
    "baseCost": "Base Cost",
    "fromNode": "From Node",
    "url": "URL",
    "message": "Message",
    "details": "Details",
    "copy": "Copy",
    "copied": "Copied!",
    "hide": "Hide",
    "loadPosts": "Load Posts",
    "clear": "Clear",
    "language": "Language",
    "active24h": "active 24h",
    "inCirculation": "In Circulation",
    "transactionsToday": "Transactions",
    "morselsMovedToday": "Morsels Moved",
    "burnedToday": "Burned Today",
    "port": "Port",
    "jwtTtl": "JWT TTL",
    "keyedBrowse": "Keyed Browse",
    "welcomeBonus": "Welcome Bonus",
    "enabled": "Enabled",
    "disabled": "Disabled",
    "failedToLoad": "Failed to load",
    "ghii": "GHII Users",
    "email": "Email",
    "directory": "Directory",
    "matching": "Matching",
    "marketplace": "Marketplace",
    "push": "Push",
    "csm": "CSM Services",
    "msm": "Integrations",
    "genesis": "Genesis Peers",
    "healthBurnMintRatio": "Burn/Mint Ratio",
    "healthAgentChurn": "Agent Churn (30d)",
    "healthWorkExpiry": "Work Expiry (30d)",
    "healthDisputeRate": "Dispute Rate (30d)",
    "metric": "Metric",
    "value": "Value",
    "zone": "Zone",
    "threshold": "Threshold",
    "totalMintedAllTime": "Total Minted (all time)",
    "totalBurnedAllTime": "Total Burned (all time)",
    "inflationRate30d": "Inflation Rate (30d)",
    "burnMintRatio": "Burn/Mint Ratio",
    "networkFees": "Network Fees",
    "burned": "Burned",
    "dailyAllowancesIssued": "Daily Allowances Issued",
    "dailyAllowance": "Daily Allowance",
    "allowanceCap": "Allowance Cap",
    "burnRate": "Burn Rate",
    "maxOperatorMint": "Max Operator Mint/Day",
    "morselUnit": "morsels",
    "mintGaiiRequired": "GAII and positive amount required",
    "mintedSuccess": "Minted {amount} morsels. New balance: {balance}",
    "issueToAgent": "Issue morsels to an agent (daily cap: {cap})",
    "customMessage": "Custom Message (optional)",
    "customMessagePlaceholder": "e.g. Upgrading to v1.3",
    "disableMaintenance": "Disable Maintenance Mode",
    "enableMaintenance": "Enable Maintenance Mode",
    "maintenanceExplain": "When maintenance mode is on, all non-essential endpoints return 503. Operators, health checks, and admin routes remain accessible.",
    "since": "Since",
    "by": "By",
    "backupExplain": "Backup exports all owners, agents, actions, boards, memories and transactions as JSON.",
    "backupDownloaded": "Backup downloaded",
    "restoreConfirm": "Restore from backup? This will import data into the current node.",
    "dataRestored": "Data restored successfully",
    "maxRelayHops": "Max Relay Hops",
    "federationPeerExplain": "To peer with another node, use POST /v1/federation/peer with the remote node URL.",
    "hooksExplain": "Hooks let you trigger actions at key lifecycle events.",
    "hooksWhatAre": "What are hooks?",
    "hooksWhatAreDetail": "Hooks are extension points in the AIMEAT node lifecycle. When an event occurs (e.g. a new owner registers or work is delivered), the node can automatically trigger bound actions. This allows custom workflows, notifications, and integrations without modifying core code.",
    "hookDescPreOwnerReg": "Runs before a new owner is registered",
    "hookDescPostOwnerReg": "Runs after a new owner is registered",
    "hookDescPreAgentReg": "Runs before a new agent is registered",
    "hookDescPostAgentReg": "Runs after a new agent is registered",
    "hookDescOwnerRecovery": "Runs when an owner account is recovered",
    "hookDescAgentRekey": "Runs when an agent's keys are rotated",
    "hookDescPreWork": "Runs before a work request is created",
    "hookDescPostWork": "Runs after work is delivered",
    "hookDescPostSettlement": "Runs after morsel settlement completes",
    "hookDescPreBoard": "Runs before a board post is published",
    "hookDescPreFederation": "Runs before a federation peer is accepted",
    "hook": "Hook",
    "boundActions": "Bound Actions",
    "noneLabel": "none",
    "clearHookConfirm": "Clear all actions from hook?",
    "configNotAvailable": "Config not available",
    "pendingChanges": "Pending Changes",
    "save": "Save",
    "saving": "Saving...",
    "saveFailed": "Save failed",
    "saveChanges": "Save Changes",
    "cancelLabel": "Cancel",
    "readOnly": "(read-only)",
    "yesLabel": "Yes",
    "noLabel": "No",
    "noChanges": "No changes to save",
    "savedChanges": "Changes saved",
    "cfgReadOnlyBanner": "This node uses in-memory storage. Config editing is disabled.",
    "cfgReadOnlyHelpTitle": "Why is config read-only?",
    "cfgReadOnlyHelpDetail": "Config persistence requires a database (MongoDB or SQLite). In-memory nodes lose all changes on restart. Configure this node via .env file, aimeat.ini, aimeat.json, or CLI arguments (aimeat start --db sqlite).",
    "cfgHelpTitle": "Help",
    "cfgReset": "Reset",
    "cfgOnePerLine": "One entry per line",
    "cfgResetDone": "Reset {path} — DB override removed.",
    "cfgSource": "Source",
    "consul": "Consul",
    "consulStatus": "Consul Status",
    "consulDisabled": "Consul integration is not enabled. Set AIMEAT_CONSUL_ENABLED=true or use --consul flag.",
    "consulExport": "Export to Consul",
    "consulImport": "Import from Consul",
    "consulKeysLoaded": "Keys Loaded",
    "consulNoKeys": "No keys in Consul KV",
    "consulExplain": "Consul provides centralized configuration for fleet management. Connect multiple AIMEAT nodes to a shared Consul KV prefix to synchronize config.",
    "consulSetupGuide": "Setup Guide",
    "consulSetupDetail": "1. Run Consul: docker run -d -p 8500:8500 hashicorp/consul. 2. Set AIMEAT_CONSUL_ENABLED=true and AIMEAT_CONSUL_URL=http://consul:8500. 3. Use Export to push current config, or Import to pull shared config.",
    "scheduler": "Scheduler",
    "schedulerDesc": "Scheduled jobs and cron tasks",
    "generatorDebug": "Generator Debug",
    "schedulerJobs": "Scheduled Jobs",
    "schedulerNoJobs": "No scheduled jobs",
    "schedulerRunNow": "Run Now",
    "schedulerEnabled": "Enabled",
    "schedulerCron": "Cron",
    "schedulerLastRun": "Last Run",
    "schedulerNextRun": "Next Run",
    "schedulerResult": "Result",
    "schedulerType": "Type",
    "schedulerTotal": "Total Jobs",
    "schedulerActive": "Active",
    "schedulerFailed": "Failed",
    "schedulerLogTitle": "Execution History",
    "schedulerLogTime": "Time",
    "schedulerLogJob": "Job",
    "schedulerLogTrigger": "Trigger",
    "schedulerLogDuration": "Duration",
    "schedulerLogMemory": "Memory I/O",
    "services": "Services",
    "servicesExplain": "Manage installed service extensions and their instances.",
    "servicesTotal": "Total Extensions",
    "servicesActive": "Active",
    "servicesInstances": "Total Instances",
    "servicesName": "Name",
    "servicesVersion": "Version",
    "servicesActionsCount": "Actions",
    "servicesInstancesCount": "Instances",
    "servicesManage": "Manage",
    "servicesBack": "← Back to Extensions",
    "servicesCreateInstance": "Create Instance",
    "servicesInstanceId": "Instance ID",
    "servicesInstanceConfig": "Config (JSON, optional)",
    "servicesNoExtensions": "No extensions installed.",
    "servicesNoInstances": "No instances for this extension.",
    "servicesDeleteConfirm": "Delete instance",
    "servicesStatusToggle": "Toggle Status",
    "servicesInstanceCreated": "Instance created",
    "servicesHelpTitle": "About Service Extensions",
    "servicesHelpDetail": "Service extensions run in a V8 sandbox and can be instantiated multiple times. Each instance has its own configuration, data namespace, and access control.",
    "servicesAvailable": "Available Extensions",
    "servicesAvailableDesc": "Bundled extensions ready for one-click installation. Install an extension first, then create instances of it.",
    "servicesInstall": "Install",
    "servicesInstalling": "Installing...",
    "servicesInstalled": "Installed",
    "servicesUninstall": "Uninstall",
    "servicesApis": "APIs",
    "servicesMultiInstance": "Multi-Instance",
    "servicesSingleInstance": "Single Instance",
    "servicesUninstallConfirm": "Uninstall extension",
    "servicesCommaSep": "comma-separated",
    "servicesOpenApp": "Open",
    "servicesTlTitle": "Instance Translations",
    "servicesTlSave": "Save Translations",
    "servicesTlSaved": "Translations saved",
    "servicesTlAddKey": "Add custom key...",
    "servicesTlFormMode": "Form",
    "servicesTlAiPrompt": "AI Prompt",
    "servicesTlPromptCopied": "AI prompt copied to clipboard",
    "servicesEditConfig": "Edit Config",
    "servicesCfgSave": "Save Config",
    "servicesCfgCancel": "Cancel",
    "servicesScriptEditor": "Scripts",
    "servicesScriptSave": "Save Script",
    "servicesScriptSaved": "Script saved",
    "servicesScaffoldTitle": "Create New Extension",
    "servicesScaffoldDesc": "Scaffold a new extension with basic list/create actions. Edit the scripts after creation to customize behavior.",
    "servicesScaffoldDescLabel": "Description",
    "servicesScaffoldBtn": "Create Extension",
    "servicesScaffoldDone": "Extension created! Expand it above to edit scripts and create instances.",
    "servicesReinstall": "Reinstall from disk",
    "servicesReinstalled": "Extension reinstalled from disk successfully.",
    "servicesScriptAction": "Action script",
    "servicesAddAction": "Add action",
    "servicesActionAdded": "Action added! Click it to edit the script.",
    "servicesNoActions": "No actions yet. Click '+ Add action' to create one.",
    "servicesManualTitle": "Extension Script Reference",
    "servicesManualWorkflow": "Workflow",
    "servicesManualStep1": "Create extension (scaffold) or use an existing one from 'Available'",
    "servicesManualStep2": "Add actions with '+ Add action' — each action gets its own script file",
    "servicesManualStep3": "Edit action scripts in the inline editor (click action button to load)",
    "servicesManualStep4": "Install or Reinstall to push disk changes into the running system",
    "servicesManualStep5": "Create instances to activate — each instance has its own config and data namespace",
    "servicesManualCtxTitle": "Script Context (ctx)",
    "servicesManualCtxAvailable": "Available in every action script:",
    "servicesManualCtxCaller": "Authenticated user's agent ID",
    "servicesManualCtxOwner": "Owner name of the caller",
    "servicesManualCtxInput": "Request body (validated against action input schema)",
    "servicesManualCtxInstance": "Current instance ID (multi-instance extensions)",
    "servicesManualCtxMemGet": "Read a value from instance memory",
    "servicesManualCtxMemSet": "Write a value to instance memory",
    "servicesManualCtxMemList": "List keys matching prefix",
    "servicesManualCtxMemDel": "Delete a key from memory",
    "servicesManualCtxWalBal": "Check morsel balance",
    "servicesManualCtxWalTx": "Transfer morsels between agents",
    "servicesManualCtxLog": "Write to extension logs",
    "servicesManualCtxReturn": "Always return an object",
    "servicesManualTipsTitle": "Tips",
    "servicesManualTip1": "Use memory keys with prefixes for namespacing, e.g. 'listings.' or 'users.'",
    "servicesManualTip2": "Ctrl+S saves the script. Tab inserts 2 spaces.",
    "servicesManualTip3": "After editing, click 'Reinstall from disk' to update the installed extension",
    "servicesManualTip4": "Use AI Chat to generate or expand scripts — paste the context reference as a prompt",
    "topPlatform": "Top Platform",
    "platform": "Platform",
    "owner": "Owner",
    "totalGhiiUsers": "Total GHII Users",
    "totpEnabled": "TOTP Enabled",
    "verifiedL2": "Verified (L2)",
    "noGhiiUsers": "No GHII users registered",
    "verification": "Verification",
    "totp": "TOTP",
    "deleteLabel": "Delete",
    "deleteGhiiConfirm": "Delete GHII user?",
    "emailNotAvailable": "Email status not available",
    "smtpHost": "SMTP Host",
    "smtpPort": "SMTP Port",
    "notConfigured": "Not configured",
    "confirmationRequired": "Confirmation Required",
    "smtpConfig": "SMTP Configuration",
    "fromAddress": "From Address",
    "secureTls": "Secure (TLS)",
    "smtpUser": "SMTP User",
    "smtpPassword": "SMTP Password",
    "configured": "Configured",
    "notSet": "Not set",
    "sendTestEmail": "Send Test Email",
    "sendTest": "Send Test",
    "testEmailSent": "Test email sent successfully",
    "enterEmail": "Enter an email address",
    "totalIndexed": "Total Indexed",
    "totalInterests": "Total Interests",
    "totalCities": "Total Cities",
    "directoryIndex": "Directory Index",
    "rebuildIndex": "Rebuild Index",
    "directoryNotAvailable": "Directory stats not available",
    "indexRebuilt": "Index rebuilt",
    "interval": "Interval",
    "maxSuggestions": "Max Suggestions",
    "maxDistance": "Max Distance",
    "cooldown": "Cooldown",
    "daysUnit": "days",
    "runMatchingRound": "Run Matching Round",
    "triggerMatching": "Trigger Matching",
    "matchingNotAvailable": "Matching stats not available",
    "matchingComplete": "Matching round complete",
    "totalListings": "Total Listings",
    "listingFee": "Listing Fee",
    "txFee": "TX Fee",
    "recentListings": "Recent Listings",
    "titleLabel": "Title",
    "price": "Price",
    "seller": "Seller",
    "marketplaceNotAvailable": "Marketplace stats not available",
    "escrowEnabled": "Escrow",
    "vapidKeys": "VAPID Keys",
    "missing": "Missing",
    "totalSubscriptions": "Total Subscriptions",
    "lastUsed": "Last Used",
    "pushNotAvailable": "Push stats not available",
    "totalTemplates": "Total Templates",
    "noCsmTemplates": "No CSM templates installed",
    "serviceType": "Service Type",
    "registeredBy": "Registered By",
    "federate": "Federate",
    "registered": "Registered",
    "updated": "Updated",
    "csmNotAvailable": "CSM data not available",
    "msmLabel": "Integrations",
    "msmExplain": "External API integrations (MSM — Machine Service Manifest)",
    "msmCategory": "Category",
    "msmAuthType": "Auth",
    "msmActions": "Actions",
    "noMsmIntegrations": "No MSM integrations registered",
    "totalPeers": "Total Peers",
    "active": "Active",
    "pending": "Pending",
    "suspended": "Suspended",
    "federatedUsers": "Federated Users",
    "federatedListings": "Federated Listings",
    "noGenesisPeers": "No genesis peers configured",
    "lastSync": "Last Sync",
    "approve": "Approve",
    "suspend": "Suspend",
    "remove": "Remove",
    "genesisNotAvailable": "Genesis peer data not available",
    "removeConfirm": "Remove genesis peer?",
    "noDescription": "No description",
    "author": "Author",
    "untitled": "(untitled)",
    "capabilities": "Capabilities",
    "trustDetails": "Trust Details",
    "score": "Score",
    "deliveries": "Deliveries",
    "successRate": "Success Rate",
    "avgDeliveryTime": "Avg Delivery Time",
    "ratings": "Ratings",
    "age": "Age",
    "home": "Home",
    "grantConfirm": "Grant operator role?",
    "errorLabel": "Error",
    "networkError": "Network error",
    "realtime": "Realtime",
    "activeRooms": "Active Rooms",
    "connectedPeers": "Connected Peers",
    "messagesIn": "Messages In",
    "messagesOut": "Messages Out",
    "messagesRejected": "Rejected",
    "peakPeers": "Peak Peers",
    "roomsCreated": "Rooms Created",
    "roomsClosed": "Rooms Closed",
    "noActiveRooms": "No active realtime rooms",
    "roomName": "Room Name",
    "appType": "App Type",
    "peerCount": "Peers",
    "createdAt": "Created",
    "yjsDocs": "Yjs Documents",
    "noYjsDocs": "No active Yjs documents",
    "docId": "Document ID",
    "snapshotSize": "Snapshot Size",
    "realtimeNotAvailable": "Realtime data not available",
    "closeRoom": "Close",
    "closeRoomConfirm": "Close this room? All peers will be disconnected.",
    "isPublic": "Public",
    "isPrivate": "Private",
    "visibility": "Visibility",
    "maxPeers": "Max Peers",
    "createdBy": "Created By",
    "realtimeDisabled": "Realtime is disabled on this node",
    "navNode": "Node",
    "navIdentity": "Identity",
    "navData": "Data",
    "navInfrastructure": "Infrastructure",
    "navServices": "Services",
    "navIntegrations": "Integrations",
    "navFederation": "Federation",
    "csmManagement": "CSM Management",
    "msmManagement": "MSM Management",
    "portal": "Portal",
    "portalDesc": "Manage your node's public portal — the landing page visitors see. Customize the HTML template, set dynamic content via memory keys and KV pairs, preview changes live, and generate an AI-friendly prompt summary of your portal for chat integrations.",
    "portalTemplate": "Template Editor",
    "portalPreview": "Portal Preview",
    "portalMemoryKeys": "Portal Memory Keys",
    "portalKvPairs": "KV Pairs (Environment)",
    "portalChangelog": "Change Log",
    "portalUpload": "Upload",
    "portalDownload": "Download",
    "portalResetDefault": "Reset to Default",
    "portalImport": "Import Bundle",
    "portalClearCache": "Clear Cache",
    "portalNoTemplate": "No custom template uploaded yet.",
    "portalNoMemoryKeys": "No portal memory keys found.",
    "portalNoChanges": "No changes recorded.",
    "portalSaveTemplate": "Save Template",
    "portalAiChat": "AI-Assisted Editor",
    "portalAiPlaceholder": "Describe what you want on your portal...",
    "portalAiSend": "Generate",
    "portalAiImport": "Import AI Result",
    "portalAiExplain": "Copy the AI prompt to your favourite AI assistant (Claude, ChatGPT, Copilot). Describe your portal, and it will generate a template you can import.",
    "portalTagHelp": "Use {{config:key}}, {{memory:key}}, {{storage:key}}, {{kv:key}}, {{board:slug}} tags in your template.",
    "portalTagHelpTitle": "Template Tag Reference",
    "portalTagHelpDetail": "Available template tags and examples:",
    "portalMemoryKeysExplain": "Memory keys store dynamic values your portal template can reference with {{memory:key}} tags.",
    "portalKeyLabel": "Key",
    "portalValueLabel": "Value",
    "portalNoKvPairs": "No KV pairs configured (set AIMEAT_SITE_KV_* env vars)",
    "portalKvExplain": "KV pairs are read-only values set via AIMEAT_SITE_KV_* environment variables. Use {{kv:key}} in templates.",
    "portalAiCopied": "AI prompt copied to clipboard!",
    "portalAiLoadPrompt": "Load AI Prompt",
    "portalDeleteKeyConfirm": "Delete {key}?",
    "tagExConfig": "Inserts a config value (e.g. node ID, port)",
    "tagExMemory": "Inserts a stored memory value",
    "tagExStorage": "Inserts storage info",
    "tagExKv": "Inserts a KV environment variable",
    "tagExBoard": "Embeds recent posts from a board",
    "portalLbMode": "Load-Balancer Mode",
    "portalLbReadOnly": "Portal content is read-only. Content synced from origin node.",
    "portalLbOrigin": "Origin URL",
    "portalLbLastSync": "Last Sync",
    "portalLbError": "Last Error",
    "portalLbStatus": "Sync Status",
    "portalLbSyncNow": "Sync Now",
    "portalLbSyncDone": "Portal sync completed.",
    "portalActiveSource": "Active source",
    "portalCustomActive": "Custom template",
    "portalDefaultActive": "Default app (built-in SPA)",
    "portalDefaultExplain": "No custom template is stored, so visitors see the built-in app. The editor below starts empty. Click \"{action}\" to load the current page's HTML as a starting point, then edit and save it to override the default.",
    "portalCustomExplain": "A custom template is active and overrides the built-in app. Edit it below and save, or reset to default to bring the built-in app back.",
    "portalLoadCurrent": "Load current page",
    "portalLoadCurrentConfirm": "Replace the editor contents with the current page's HTML? Unsaved edits will be lost.",
    "portalLoadedCurrent": "Loaded current page into the editor — review and click Save Template to apply.",
    "portalAiBundleExplain": "Paste the JSON bundle the AI produced here. It can include the template, portal memory keys, and KV pairs — they are all applied at once.",
    "portalAiBundlePlaceholder": "Paste the AI's JSON result here: { \"template\": \"<!DOCTYPE html>...\", \"memory\": { \"portal/about\": \"...\" }, \"kv\": {} }",
    "portalImportDone": "Imported: {summary}",
    "portalImportInvalid": "That doesn't look like a valid AI bundle. Expected JSON with a \"template\", \"memory\", or \"kv\" field.",
    "portalSaveLooksLikeJson": "This looks like an AI JSON bundle, not an HTML template. Paste it into \"Import AI Result\" below instead.",
    "portalMemorySaved": "Portal memory key saved.",
    "cors": "CORS",
    "corsTitle": "CORS Origin Management",
    "corsNodeDefault": "Node Default Origins",
    "corsNodeDefaultDesc": "The global CORS allowed origins configured for this node. Set via AIMEAT_CORS_ALLOWED_ORIGINS environment variable.",
    "corsGhiiOverrides": "User CORS Overrides",
    "corsGhiiOverridesDesc": "Users who have set custom CORS origins for their account. Users not listed here inherit the node default.",
    "corsAgentOverrides": "Agent CORS Overrides",
    "corsAgentOverridesDesc": "Agents with custom CORS origins. Agents not listed inherit from their owner or the node default.",
    "corsNoOverrides": "No custom CORS overrides",
    "corsOrigins": "Origins",
    "corsEffective": "Effective",
    "corsClear": "Clear",
    "corsClearConfirm": "Clear custom CORS? Will inherit node default.",
    "corsEdit": "Edit",
    "corsSave": "Save",
    "corsCancel": "Cancel",
    "corsAddOverride": "Add Override",
    "corsOriginPlaceholder": "https://example.com, http://localhost:3000",
    "corsCommonOrigins": "Quick add:",
    "corsSelectUser": "Select user...",
    "corsSelectAgent": "Select agent...",
    "stats": "Statistics",
    "statsNotAvailable": "Statistics are disabled on this node.",
    "requestsTotal": "Total Requests",
    "memoryOps": "Memory Operations",
    "consentOps": "Consent Operations",
    "schemaOps": "Schema Validations",
    "dailyActivity": "Daily Activity (30 days)",
    "weeklyComparison": "Weekly Comparison",
    "monthlyTrend": "Monthly Trend",
    "statsExplain": "Usage counters persisted to database. Uptime and live gauges reset on restart.",
    "writes": "Writes",
    "reads": "Reads",
    "grants": "Grants",
    "revocations": "Revocations",
    "validations": "Validations",
    "failures": "Failures",
    "thisWeek": "This Week",
    "lastWeek": "Last Week",
    "twoWeeksAgo": "2 Weeks Ago",
    "threeWeeksAgo": "3 Weeks Ago",
    "tunnelStats": "Tunnel Connections",
    "tunnelActive": "Active",
    "tunnelTotal": "Total Connections",
    "tunnelDisconnections": "Disconnections",
    "tunnelReconnects": "Reconnects",
    "tunnelMsgSent": "Messages Sent",
    "tunnelMsgReceived": "Messages Received",
    "tunnelDeliveryFails": "Delivery Failures",
    "tunnelLatencyAvg": "Average Latency",
    "tunnelLatencyP95": "P95 Latency",
    "tunnelHeartbeatMisses": "Heartbeat Misses",
    "tunnelMailboxFallbacks": "Mailbox Fallbacks",
    "mailboxStats": "Mailbox",
    "mailboxItems": "Items Queued",
    "mailboxBytes": "Storage Used",
    "mailboxEnqueued": "Enqueued",
    "mailboxDelivered": "Delivered",
    "mailboxExpired": "Expired",
    "mailboxQuotaRejects": "Quota Rejections",
    "mailboxOldestAge": "Oldest Item Age",
    "securityStats": "Security & Auth",
    "authFailures": "Auth Failures",
    "rateLimitHits": "Rate Limit Hits",
    "scopeDenials": "Scope Denials",
    "messages": "Messages",
    "latency": "Delivery Latency",
    "tunnelActivity": "Tunnel Activity",
    "consentPermStats": "Consent Permission Rules",
    "consentActiveRules": "Active Rules",
    "consentByGaii": "By GAII",
    "consentByGhii": "By GHII",
    "consentByOrganism": "By Organism",
    "consentByDomain": "By Domain",
    "consentByNode": "By Node",
    "consentByWildcard": "By Wildcard",
    "consentDataPatterns": "Unique Patterns",
    "noActionsRegistered": "No actions registered",
    "slug": "Slug",
    "showPosts": "Show Posts",
    "hidePosts": "Hide Posts",
    "noPosts": "No posts yet",
    "noWorkItems": "No work items",
    "totalSessions": "Total Sessions",
    "activeSessions": "Active Sessions",
    "avgMessages": "Avg Messages",
    "statusLabel": "Status",
    "started": "Started",
    "ended": "Ended",
    "gaiiExplain": "GAII (Global AI Identifier) — unique address for each AI agent on the AIMEAT network.",
    "ghiiExplain": "GHII (Global Human Intelligence Identifier) — unique identity for each human user on the AIMEAT network.",
    "ghiiLevelsTitle": "Verification Levels",
    "ghiiLevelL0": "L0 — Unverified: username + password only, no identity verification.",
    "ghiiLevelL1": "L1 — Email verified: email address confirmed via link or code.",
    "ghiiLevelL2": "L2 — Identity verified: government ID, EUDIW, or Finnish Trust Network verified.",
    "ghiiTotpExplain": "TOTP (Time-based One-Time Password) adds two-factor authentication. Users set up an authenticator app (e.g. Google Authenticator) for extra security.",
    "ghiiVerificationExplain": "Verification badge shows the trust level. Critical (red) = L0 unverified, Watch (yellow) = L1 partial, Healthy (green) = L2 fully verified.",
    "ghiiEmail": "Email",
    "ghiiEmailNotSet": "Not set",
    "ghiiEmailVerified": "Verified",
    "ghiiRemoveEmail": "Remove email",
    "ghiiRemoveEmailConfirm": "Remove email verification for {name}?",
    "ghiiEmailRemoved": "Email verification removed.",
    "boardCreateSystem": "Create System Board",
    "boardName": "Board Name",
    "boardDescription": "Description",
    "boardSlug": "Slug (URL-safe ID)",
    "boardVisibility": "Visibility",
    "boardPublic": "Public",
    "boardPrivate": "Private",
    "boardCreateConfirm": "Board created successfully",
    "chatExplain": "Chat instances are created when users interact with AI-powered chat applications on this node. System administrators can create node-wide chat channels for operator communication.",
    "chatCreateChannel": "Create Channel",
    "chatChannelName": "Channel name",
    "chatChannelNamePlaceholder": "e.g. ops-alerts, team-general",
    "chatChannelPlatform": "Platform",
    "chatChannelPlatformPlaceholder": "e.g. admin, slack, discord",
    "chatChannelCreated": "Channel created successfully",
    "chatDeleteConfirm": "Delete chat instance \"{id}\"?",
    "chatOperatorChannels": "Operator Channels",
    "chatOperatorChannelsExplain": "Operator channels are shared boards for team communication. Create a channel to start messaging.",
    "chatNoChannels": "No operator channels yet",
    "chatOpenChannel": "Open",
    "chatSendMessage": "Send",
    "chatMessagePlaceholder": "Type a message...",
    "chatBack": "Back to channels",
    "chatNoMessages": "No messages yet. Be the first to post!",
    "emailDisabledExplain": "Email is not enabled. Configure SMTP settings in the Configuration tab to enable transactional emails.",
    "host": "Host",
    "secure": "Secure (TLS)",
    "rejectUnauthorized": "Verify TLS Certificates",
    "rejectUnauthorizedHelp": "Disable for self-signed certificates or STARTTLS",
    "from": "From",
    "testEmail": "Test Email",
    "emailPlaceholder": "recipient@example.com",
    "send": "Send",
    "emailSent": "Test email sent successfully",
    "emailSendFailed": "Email delivery failed. Check server logs for details (SMTP config, TLS, credentials).",
    "emailExplain": "SMTP is configured and email delivery is active. Transactional emails are sent for verification codes, login links, notifications, and match suggestions.",
    "emailSmtpHelp": "How to configure SMTP",
    "emailSmtpHelpDetail": "Set the SMTP settings (host, port, user, password, from address) in the Configuration tab under the Email group. Changes to mutable settings apply immediately; immutable settings require a restart.",
    "emailUserConfigured": "SMTP User",
    "emailPassConfigured": "SMTP Password",
    "emailTemplatesTitle": "Email Templates",
    "emailTemplatesExplain": "These are the email templates sent to users. Use the language toggle to preview each locale.",
    "emailTplVerification": "Verification Code",
    "emailTplMagicLink": "Magic Link (Login)",
    "emailTplNotification": "Notification",
    "emailTplMatchSuggestion": "Match Suggestion",
    "emailUsedInGhii": "used in: Identity (GHII)",
    "emailUsedInSystem": "used in: System",
    "emailUsedInMatching": "used in: Matching",
    "emailTplEditHtml": "Edit HTML",
    "emailTplEditText": "Edit Plain Text",
    "emailTplPreview": "Preview",
    "emailTplSave": "Save Template",
    "emailTplReset": "Reset to Default",
    "emailTplResetConfirm": "Reset this template to the default? Your custom version will be lost.",
    "emailTplSaved": "Template saved successfully",
    "emailTplResetDone": "Template reset to default",
    "emailTplCustomBadge": "customized",
    "emailTplParams": "Parameters",
    "emailTplParamsExplain": "These parameter tags are replaced with real data when the email is sent. Keep them in your custom template.",
    "emailTplAiPrompt": "Copy AI Prompt",
    "emailTplAiPromptCopied": "AI prompt copied to clipboard! Paste it into an AI chat to generate a template.",
    "emailTplSeedDefaults": "Seed Default Templates",
    "emailTplSeedExplain": "Load default templates (EN + FI) into storage so they can be edited.",
    "emailTplSeeded": "Seeded {count} templates (EN + FI)",
    "emailTplResetAll": "Reset All to Defaults",
    "emailTplReseed": "Re-seed Defaults",
    "emailTplSeededStatus": "Templates are stored and editable.",
    "emailTplResetAllConfirm": "Reset ALL email templates to defaults? All custom changes for both EN and FI will be lost.",
    "emailTplResetAllDone": "All {count} templates reset to defaults.",
    "emailGroupTitle": "Send to Group",
    "emailGroupExplain": "Send a notification email to a group of users. Only users with a notification email address will receive the message.",
    "emailGroupOperators": "Operators",
    "emailGroupAll": "All users with email",
    "emailGroupSubject": "Subject",
    "emailGroupBody": "Message body",
    "emailGroupSend": "Send to Group",
    "emailGroupSent": "Sent to {sent}/{total} recipients",
    "pushNotConfigured": "Push notifications are not configured.",
    "pushExplain": "Web Push notifications allow sending real-time alerts to users who have subscribed via their browser. Requires VAPID keys configuration.",
    "pushHelpTitle": "How to configure Push",
    "pushHelpDetail": "Generate VAPID keys and set AIMEAT_VAPID_PUBLIC_KEY and AIMEAT_VAPID_PRIVATE_KEY in your .env file. Users subscribe via the portal UI.",
    "activeSubscriptions": "Active Subscriptions",
    "noSubscriptions": "No push subscriptions registered",
    "endpoint": "Endpoint",
    "pushTemplatesTitle": "Message Templates",
    "pushTemplatesExplain": "These are the notification messages sent to users when events occur. Templates are currently hardcoded in the backend.",
    "pushWebPushTitle": "Web Push: Browser Notification",
    "pushWebPushUsed": "Sent to subscribed browsers when a personal node has pending mailbox messages while offline.",
    "pushWebPushTitleTpl": "AIMEAT: Pending messages",
    "pushWebPushBodyTpl": "{count} message(s) waiting — {type}",
    "pushEmailTitle": "Email: Mailbox Alert",
    "pushEmailUsed": "Sent to the user's configured email when their personal node has pending messages and email notifications are enabled.",
    "pushEmailSubjectTpl": "AIMEAT: {count} pending message(s) for your node",
    "pushEmailBodyTpl": "Your personal node \"{nodeId}\" has {count} pending message(s).\n\nHighest priority: {type}\nOldest message: {age} minutes ago\n\nPlease reconnect your personal node to retrieve these messages.",
    "pushNotifyTypesTitle": "Notification Triggers",
    "pushNotifyTypesExplain": "Push notifications are sent when these mailbox event types occur. Configured via AIMEAT_PUSH_NOTIFY_TYPES.",
    "pushTypeWorkAssignment": "work_assignment — A work task has been assigned to the user's agent",
    "pushTypeActionRequest": "action_request — Another agent has requested an action from the user's agent",
    "pushTypeBoardNotification": "board_notification — New activity on a board the user subscribes to",
    "pushTypeFederationSync": "federation_sync — A federated peer node has synced data that needs attention",
    "pushTemplate": "Template",
    "pushUsedIn": "Used in",
    "pushTestBtn": "Send Test Push",
    "pushTestSending": "Sending...",
    "pushTestSent": "Sent!",
    "pushTestError": "Failed",
    "pushTestNoSubs": "No subscriptions — subscribe via portal first",
    "pushTestErrorDetail": "No subscription found or sending failed",
    "pushDefault": "default",
    "pushCustomized": "customized",
    "pushResetBtn": "Reset to Default Templates",
    "pushResetConfirm": "Reset all templates to defaults? This will overwrite any customizations.",
    "pushResetting": "Resetting...",
    "pushFieldTitle": "Title",
    "pushFieldSubject": "Subject",
    "pushFieldBody": "Body",
    "pushSubscribeBtn": "Subscribe this browser",
    "pushSubscribing": "Subscribing...",
    "pushSubscribed": "Subscribed!",
    "pushUnsubscribeBtn": "Unsubscribe",
    "pushNoBrowserSupport": "This browser does not support push notifications",
    "blocked": "Blocked",
    "blockedCooldown": "Cooldown",
    "blockedDisabled": "Disabled",
    "blockedQuietHours": "Quiet Hours",
    "breakdownFailed": "Failed",
    "breakdownRetried": "Retried",
    "breakdownSent": "Sent",
    "breakdownType": "Type",
    "channelEmail": "Email",
    "channelPush": "Push",
    "channels": "Channels",
    "emailDelivery": "Email Delivery",
    "emailType": {
      "group_send": "Group Send",
      "magic_link": "Magic Link",
      "match_suggestion": "Match Suggestion",
      "notification": "Notification",
      "verification": "Verification"
    },
    "emailsFailed": "Emails Failed",
    "emailsRetried": "Emails Retried",
    "emailsSent": "Emails Sent",
    "expiredSubs": "Expired Subs",
    "live": "live",
    "mailboxNotifBlocked": "Mailbox Blocked",
    "mailboxNotifFailed": "Mailbox Failed",
    "mailboxNotifSent": "Mailbox Sent",
    "mailboxNotifications": "Mailbox Notifications",
    "period30Days": "30 Days",
    "period7Days": "7 Days",
    "periodAll": "All",
    "periodApply": "Apply",
    "periodCustom": "Custom",
    "periodFrom": "From",
    "periodLabel": "Period",
    "periodThisWeek": "This Week",
    "periodTo": "To",
    "periodToday": "Today",
    "weekMon": "Mon",
    "weekTue": "Tue",
    "weekWed": "Wed",
    "weekThu": "Thu",
    "weekFri": "Fri",
    "weekSat": "Sat",
    "weekSun": "Sun",
    "pushDelivery": "Push Notifications",
    "pushFailed": "Push Failed",
    "pushSent": "Push Sent",
    "pushType": {
      "board": "Board",
      "federation": "Federation",
      "general": "General",
      "organism": "Organism",
      "test": "Test",
      "work": "Work"
    },
    "totalEntries": "Total Entries",
    "cities": "Cities",
    "categories": "Categories",
    "directoryMaintenance": "Directory Maintenance",
    "directoryRebuilt": "Directory index rebuilt successfully",
    "directoryExplain": "The directory indexes owner profiles by city, category, and interests, enabling discovery and search. Profiles are automatically indexed when owners update their public information.",
    "directoryHelpTitle": "How the directory works",
    "directoryHelpDetail": "Owners register profiles with city, categories, and interests via the API. The directory builds search indexes for fast lookups. You can rebuild indexes if data becomes inconsistent.",
    "totalProfiles": "Total Profiles",
    "activeMatches": "Active Matches",
    "lastRun": "Last Run",
    "matchingEngine": "Matching Engine",
    "matchingExplain": "The matching engine finds compatible profiles based on shared interests, location proximity, and preference criteria. Matches are computed periodically or can be triggered manually.",
    "matchingHelpTitle": "How matching works",
    "matchingHelpDetail": "The engine compares all active profiles, scoring compatibility based on shared interests, geographic proximity, and stated preferences. Matches above a threshold are surfaced to users. Run the engine manually to update matches immediately.",
    "marketplaceEmpty": "No marketplace configured",
    "activeListings": "Active Listings",
    "totalTransactions": "Total Transactions",
    "noListings": "No listings found",
    "marketplaceExplain": "The marketplace enables peer-to-peer or node-level trading of goods and services using the morsel economy. Listings can be created at federation or individual node level.",
    "marketplaceHelpTitle": "How the marketplace works",
    "marketplaceHelpDetail": "Owners create listings with title, description, price (in morsels), and category. Buyers can browse, search, and purchase. Transactions are settled through the morsel wallet system. Federation-level marketplaces aggregate listings across nodes.",
    "marketplaceCreate": "Create Marketplace",
    "marketplaceName": "Marketplace Name",
    "marketplaceType": "Type",
    "marketplaceNodeLevel": "Node Level",
    "marketplaceFederationLevel": "Federation Level",
    "marketplaceCreateConfirm": "Marketplace created successfully",
    "csmExplain": "CSM (Contextual Service Model) defines the data schema and rules for services running on the node. Each CSM template specifies what data a service collects, how it's validated, and what consent rules apply.",
    "csmHelpTitle": "What is a CSM?",
    "csmHelpDetail": "A CSM is a JSON document that defines a service's data model. It includes field definitions (name, type, required), validation rules, consent requirements, and display hints. Services like hobbies directory, marketplace, or dating use CSMs to describe their data shape. The node validates all data against the CSM before storing it.",
    "csmAddNew": "Add CSM Template",
    "csmEnable": "Enable",
    "csmDisable": "Disable",
    "csmStatusActive": "Active",
    "csmStatusDisabled": "Disabled",
    "csmNoFields": "No fields defined",
    "csmCreateFromTemplate": "Create from Template",
    "csmCreateCustom": "Create Custom",
    "csmYamlPlaceholder": "Paste CSM YAML definition here...",
    "csmSelectTemplate": "Select a template",
    "csmCreateSuccess": "CSM created successfully",
    "csmDeleteConfirm": "Delete CSM \"{name}\"? This also removes the associated schema lock.",
    "csmDeleted": "CSM deleted",
    "csmDefinition": "Definition (YAML)",
    "csmServiceType": "Service Type",
    "csmRegisteredBy": "Registered By",
    "csmFederate": "Federate",
    "csmCreate": "Create CSM",
    "csmCreateWithAi": "Create with AI Prompt",
    "csmAiPromptTitle": "CSM Builder — AI Prompt",
    "csmAiPromptDesc": "Copy this prompt into your AI chat (Claude, ChatGPT, etc.) to design a CSM interactively. The AI will ask you questions and generate the YAML for you.",
    "csmAiPromptHow": "How to use this prompt",
    "csmAiStep1": "Copy the prompt below to your clipboard",
    "csmAiStep2": "Paste it into a new AI chat conversation",
    "csmAiStep3": "Describe the service you want to create — the AI will guide you",
    "csmAiStep4": "Copy the generated YAML back here and click \"Create CSM\"",
    "msmHelpTitle": "What is an MSM?",
    "msmHelpDetail": "An MSM is a configuration that connects the node to external services. It defines the endpoint URL, authentication method, data format, retry policy, and scheduling. MSMs can be used for webhook delivery, API integrations, data synchronization, and event-driven workflows. Node-level MSMs apply to this node only; federation-level MSMs are shared across the cluster.",
    "msmAddNew": "Add MSM Integration",
    "msmEndpoint": "Endpoint URL",
    "msmSchedule": "Schedule",
    "msmCreateConfirm": "MSM integration created successfully",
    "msmNodeLevel": "Node Level",
    "msmFederationLevel": "Federation Level",
    "msmRegisteredBy": "Registered By",
    "msmEdit": "Edit MSM",
    "msmEditDescription": "Description",
    "msmEditFederate": "Share across federation",
    "msmEditSave": "Save Changes",
    "msmUpdateConfirm": "MSM integration updated successfully",
    "msmDeleteConfirm": "Type \"{name}\" to confirm deletion",
    "msmDeleteTitle": "Delete MSM Integration",
    "msmDeleteSuccess": "MSM integration deleted successfully",
    "msmYamlPlaceholder": "Paste MSM YAML definition here...",
    "msmSelectTemplate": "— Select a template —",
    "msmCreateFromTemplate": "Start from template",
    "msmDefinition": "MSM Definition",
    "federationNotAvailable": "Federation is not configured",
    "clusterName": "Cluster Name",
    "role": "Role",
    "peers": "Peers",
    "federationExplain": "Federation connects multiple AIMEAT nodes into a cluster, enabling shared data, cross-node discovery, and distributed services. Nodes communicate via authenticated peer-to-peer connections.",
    "federationHelpTitle": "How federation works",
    "federationHelpDetail": "A federation cluster consists of nodes that trust each other. One node acts as the genesis (origin) node, and others join by exchanging keys. Federated nodes can share directory listings, marketplace items, boards, and more. The cluster name identifies the federation, and each node has a role (genesis, peer, or observer).",
    "federationConfigTitle": "Federation Configuration",
    "federationJoinTitle": "Join a Federation",
    "federationJoinExplain": "To join an existing federation, you need the genesis node's endpoint URL and a valid invitation token.",
    "federationLeave": "Leave Federation",
    "federationLeaveConfirm": "Are you sure you want to leave this federation?",
    "fedHowBusTitle": "What is the Federation Bus?",
    "fedHowBusDetail": "The federation bus is the communication layer between nodes. It handles heartbeats (health checks every 5 minutes), data replication, catalogue synchronization, cross-node work routing, morsel settlements, and trust advisories. All messages are cryptographically signed with Ed25519 keys to prevent tampering.",
    "fedHowJoinTitle": "How does a new node join?",
    "fedHowJoinDetail": "A new node sends a signed introduction request (POST /v1/federation/peer/introduce) with its node ID, URL, and public key. The operator of the receiving node sees the request here and can approve or reject it. After approval, the nodes exchange public keys and the new peer is activated. The heartbeat system then monitors the connection automatically.",
    "fedHowReplicationTitle": "How does data replication work?",
    "fedHowReplicationDetail": "Nodes can replicate memory entries to peers via POST /v1/federation/replicate. Each replication request is signed and verified. Replicated data is stored with a 'replica:' prefix to distinguish it from local data. Catalogue entries (actions/services) are synced incrementally — only new or updated items are transferred.",
    "fedHowSettlementsTitle": "How do morsel settlements work?",
    "fedHowSettlementsDetail": "When an agent on Node A uses a service on Node B, the morsel payment needs to be settled across nodes. Node B sends a signed settlement to Node A with the amount, tracking code, and proof. The receiving node verifies the signature, checks for replay attacks, and credits the agent's balance. Operators can also initiate outbound settlements manually.",
    "fedHowRoutingTitle": "How does cross-node routing work?",
    "fedHowRoutingDetail": "If you need to reach an agent on a remote node, the federation router (POST /v1/federation/route) forwards the request. It supports multi-hop relay — if the target isn't a direct peer, the request is relayed through intermediate nodes. Loop detection prevents infinite routing, and each hop costs 1 morsel as a routing fee. Max hops is configurable.",
    "fedActivePeers": "Active Peers",
    "fedDegradedPeers": "Degraded",
    "fedOfflinePeers": "Offline",
    "fedPendingRequests": "Pending Requests",
    "fedPendingRequestsTitle": "Pending Peering Requests",
    "fedPendingRequestsExplain": "These nodes want to join your federation. Review each request and approve or reject.",
    "fedPendingHelpTitle": "What should I check before approving?",
    "fedPendingHelpDetail": "Verify the node ID and URL are from a trusted source. Check the message field for context about who is requesting. After approval, you still need to activate the peer and complete the key exchange before data flows. You can always de-peer later if needed.",
    "fedReqId": "Request ID",
    "fedFromNode": "From Node",
    "fedMessage": "Message",
    "fedCreatedAt": "Created",
    "fedReject": "Reject",
    "fedApprovePeerConfirm": "Approve this peering request? The node will be added as a peer.",
    "fedRejectPeerConfirm": "Reject this peering request?",
    "fedPeerApproved": "Peering request approved successfully",
    "fedPeerRejected": "Peering request rejected",
    "fedLivePeersTitle": "Live Peers",
    "fedLivePeersExplain": "Currently registered peers and their real-time health status. The heartbeat monitor pings each peer every 5 minutes.",
    "fedLivePeersHelpTitle": "Understanding peer statuses",
    "fedLivePeersHelpDetail": "Active: Peer is healthy and responding to heartbeats. Approved: Peer has been approved but not yet activated (needs activation). Degraded: Peer has failed 3+ consecutive heartbeats but is still reachable. Offline: Peer has failed 10+ consecutive heartbeats. Depeering: Peer is in the grace period before removal (default 72h) — in-flight work can still complete.",
    "fedAddedAt": "Added",
    "fedPublicKey": "Public Key",
    "fedActivate": "Activate",
    "fedDepeer": "De-peer",
    "fedEmergencyDepeer": "Emergency",
    "fedActivateConfirm": "Activate this peer? It will start receiving heartbeats and data.",
    "fedRemoveConfirm": "De-peer this node? A 72-hour grace period will be applied for in-flight work.",
    "fedEmergencyRemoveConfirm": "EMERGENCY de-peer! This immediately disconnects the peer, cancels all in-flight work, and returns escrow. Are you sure?",
    "fedPeerActivated": "Peer activated successfully",
    "fedPeerRemoved": "Peer set to depeering status (grace period active)",
    "fedPeerEmergencyRemoved": "Peer immediately disconnected. All in-flight work cancelled.",
    "fedRequestHistoryTitle": "Peering Request History",
    "fedDeleteRequestConfirm": "Delete this peering request from history?",
    "fedRequestDeleted": "Peering request deleted",
    "fedJoinTitle": "Join Genesis Network",
    "fedJoinExplain": "Connect this node to an existing AIMEAT genesis network. Enter the genesis node URL and select your role. The genesis operator will review and approve your request.",
    "fedJoinHelpTitle": "How does joining work?",
    "fedJoinHelpDetail": "Your node will contact the genesis node, verify it's running AIMEAT, and send a signed introduction request. The genesis operator will see your request in their Federation dashboard and can approve it. Once approved, your nodes will exchange keys and start communicating.",
    "fedJoinUrlPlaceholder": "Genesis node URL (e.g. http://localhost:40050)",
    "fedJoinUrlRequired": "Genesis node URL is required",
    "fedJoinRoleContributor": "Contributor",
    "fedJoinRoleOperator": "Operator",
    "fedJoinBtn": "Join Network",
    "fedJoinSent": "Introduction sent! Waiting for genesis operator approval.",
    "fedJoinTargetNode": "Target Node",
    "fedJoinStatus": "Status",
    "fedJoinRequestId": "Request ID",
    "fedAddPeerTitle": "Add Peer Directly",
    "fedAddPeerExplain": "Manually add a peer node without going through the introduction flow. Useful for bootstrapping federations or adding trusted nodes.",
    "fedAddPeerHelpTitle": "When should I add peers directly?",
    "fedAddPeerHelpDetail": "Direct peer addition skips the introduction handshake and creates the peer in 'pending' status. You'll still need to activate it and complete key exchange. Use this when you trust the remote node and have its details (node ID, URL, optionally public key). For production setups, prefer the introduction flow for better security.",
    "fedAddNodeIdPlaceholder": "Node ID (e.g. my-node-001)",
    "fedAddUrlPlaceholder": "Node URL (e.g. https://node.example.com)",
    "fedAddKeyPlaceholder": "Public key (optional, hex or base64)",
    "fedAddPeerBtn": "Add Peer",
    "fedAddPeerMissing": "Node ID and URL are required",
    "fedPeerAdded": "Peer added successfully (status: pending)",
    "fedTestTitle": "Test Federation Readiness",
    "fedTestExplain": "Check if a remote node is reachable and running the AIMEAT protocol before peering.",
    "fedTestHelpTitle": "What does the test check?",
    "fedTestHelpDetail": "The test sends a request to the target node's /.well-known/aimeat endpoint to verify: 1) The node is reachable over the network, 2) It responds with the AIMEAT protocol identifier. If both checks pass, the node is ready for federation peering.",
    "fedTestBtn": "Test",
    "fedTestTarget": "Target",
    "fedTestReady": "Ready",
    "fedTestTime": "Tested at",
    "fedBusTitle": "Federation Bus — Features",
    "fedBusExplain": "The federation bus provides all the communication channels between nodes. Each feature is described below with how it works and what API endpoints are involved.",
    "fedBusHeartbeatTitle": "Heartbeat & Health Monitoring",
    "fedBusHeartbeatDetail": "Every 5 minutes, your node pings all active peers via POST /v1/federation/ping. If a peer fails 3 consecutive heartbeats, it's marked 'degraded'. After 10 failures, it goes 'offline'. Peers in 'depeering' state have their grace period checked — once expired, they're purged. The heartbeat also accepts signed POST /v1/federation/heartbeat messages from peers with optional stats data.",
    "fedBusReplicateTitle": "Memory Replication",
    "fedBusReplicateDetail": "Nodes can replicate memory entries to peers via POST /v1/federation/replicate. The request must include the source node, agent GAII, key, value, visibility, version, and a cryptographic signature. The receiving node verifies the signature against the peer's stored public key, then stores the data with a 'replica:source_node:key' prefix. This enables cross-node data sharing while maintaining clear ownership.",
    "fedBusCatalogueTitle": "Catalogue Synchronization",
    "fedBusCatalogueDetail": "Action catalogues are synced via POST /v1/federation/catalogue-sync. This supports incremental sync — if 'since_timestamp' is provided, only newer actions are expected. Existing federated actions are updated (upsert by federated ID). Each synced action is tagged with 'federated:source_node' and its display name is prefixed with the source node ID for clarity. A catalogue_hash is included for integrity verification.",
    "fedBusRoutingTitle": "Cross-Node Request Routing",
    "fedBusRoutingDetail": "POST /v1/federation/route forwards requests to remote nodes. If the target is a direct peer, the request goes straight. Otherwise, it tries multi-hop relay through other active peers. Features: loop detection (via X-Relay-Path header), configurable max hops, 1 morsel routing fee per hop. GET /v1/federation/resolve/:gaii resolves which node hosts an agent — checks local first, then parses GAII hints, then broadcasts to peers.",
    "fedBusSettlementTitle": "Morsel Settlements",
    "fedBusSettlementDetail": "Cross-node morsel transfers use POST /v1/federation/settle (inbound) and POST /v1/federation/settle/outbound (outbound, operator only). Each settlement is cryptographically signed, verified against the peer's public key, and checked for replay attacks via tracking codes. Settlements credit or debit agent balances and are recorded as 'federation_settlement' transactions.",
    "fedBusTrustTitle": "Trust Advisories",
    "fedBusTrustDetail": "Operators can issue trust advisories about nodes via POST /v1/federation/trust-advisory. Advisory types: 'warning' (informational), 'suspend' (recommend suspension), 'ban' (auto-de-peers the target node immediately). Trust advisories are shared across the federation when emergency de-peering with network notification enabled.",
    "fedBusKeyExchangeTitle": "Key Exchange",
    "fedBusKeyExchangeDetail": "POST /v1/federation/key-exchange allows peers to exchange Ed25519 public keys. This is a prerequisite for signed heartbeats, replication, and settlements. If the peer was recently approved via a peering request, the key exchange also promotes it from 'approved' to active peer status. Each node returns its own public key and capabilities.",
    "fedBusCrossWorkTitle": "Cross-Node Work Requests",
    "fedBusCrossWorkDetail": "Agents can submit work to services on remote nodes via POST /v1/federation/cross-node/work. The request is signed by the originating node's private key and forwarded to the target peer. A 1 morsel routing fee is charged. The remote node processes the work request as if it were local, and results are returned in the response.",
    "fedBusResolveTitle": "GAII Resolution",
    "fedBusResolveDetail": "GET /v1/federation/resolve/:gaii finds which node hosts an agent. Resolution order: 1) Check local cache (5-minute TTL), 2) Check local storage, 3) Check personal nodes anchored to this operator, 4) Parse node hint from GAII format (agent#owner@node), 5) Broadcast resolve to all active peers. Results are cached to reduce network traffic.",
    "fedApiRefTitle": "API Reference",
    "fedApiRefHelpTitle": "All Federation Endpoints",
    "fedDepeeringTitle": "Peers Being Removed",
    "fedDepeeringExplain": "These peers are in the grace period before permanent removal. In-flight work can still complete.",
    "fedDepeeringGrace": "Grace ends",
    "fedShareCatalogue": "Share Catalogue",
    "fedReplicateMemory": "Replicate Memory",
    "fedAllowRouting": "Allow Routing",
    "fedAllowAuth": "Allow Federated Login",
    "fedAuthPolicyTitle": "Federation Auth Policy",
    "fedAuthPolicyDesc": "Control whether users from other nodes can log in here and what they can do.",
    "fedAuthDisabled": "Disabled (no federated logins)",
    "fedAuthAllPeers": "All peers (any active peer's users can log in)",
    "fedAuthSpecificPeers": "Specific peers (per-peer control)",
    "fedDefaultScopes": "Default scopes for federated users:",
    "fedPeerMode": "Peer Mode",
    "fedPeerModeFederation": "Federation",
    "fedPeerModePrivate": "Private P2P",
    "fedPolicyUpdated": "Peer policy updated",
    "fedPolicySectionTitle": "Policy",
    "fedNetworkDirectoryTitle": "Network Directory",
    "fedNetworkDirectoryDesc": "Services and data available across the federation network.",
    "fedNetworkDirType": "Type",
    "fedNetworkDirName": "Name",
    "fedNetworkDirNode": "Node",
    "fedNetworkDirCategory": "Category",
    "fedNetworkDirPrice": "Price",
    "fedNetworkDirEmpty": "No federated services discovered yet. Services appear when peers share their catalogue.",
    "fedNetworkDirSearch": "Search services...",
    "genesisExplain": "Genesis peers are the founding nodes of a federation cluster. The genesis node is the first node that creates the federation, and it manages peer approvals, key exchange, and cluster policies.",
    "genesisHelpTitle": "What are genesis peers?",
    "genesisHelpDetail": "When you create a new federation, your node becomes the genesis (origin) node. Other nodes request to join, and you approve or reject them here. Genesis peers have special privileges: they can set cluster-wide policies, approve new members, and suspend misbehaving nodes. Approved peers can exchange data according to federation rules.",
    "approved": "Approved",
    "confirmAction": "Are you sure?",
    "approveConfirm": "Approve this peer?",
    "suspendConfirm": "Suspend this peer?",
    "configuration": "Configuration",
    "schema": "Schema",
    "fields": "Fields",
    "required": "Required",
    "type": "Type",
    "version": "Version",
    "back": "Back",
    "cfgGroup_node": "Node",
    "cfgGroup_storage": "Storage",
    "cfgGroup_morsel_policy": "Morsel Policy",
    "cfgGroup_auth": "Auth",
    "cfgGroup_features": "Features",
    "cfgGroup_work": "Work",
    "cfgGroup_quota": "Quota",
    "cfgGroup_federation": "Federation",
    "cfgGroup_rate_limits": "Rate Limits",
    "cfgGroup_email": "Email",
    "cfgGroup_consent": "Consent",
    "cfgGroup_totp": "TOTP",
    "cfgGroup_matching": "Matching",
    "cfgGroup_extensions": "Extensions",
    "cfgGroup_security": "Security",
    "cfg_security_login_rate_limit_max": "Login rate limit (max per window)",
    "cfg_security_login_rate_limit_window_ms": "Login rate limit window (ms)",
    "cfg_security_registration_rate_limit_max": "Registration rate limit (max per window)",
    "cfg_security_registration_rate_limit_window_ms": "Registration rate limit window (ms)",
    "cfg_security_admin_auth_rate_limit_max": "Admin auth rate limit (max per window)",
    "cfg_security_admin_auth_rate_limit_window_ms": "Admin auth rate limit window (ms)",
    "cfg_security_password_lockout_attempts": "Password lockout after N failures",
    "cfg_security_password_lockout_minutes": "Password lockout duration (minutes)",
    "cfg_security_json_body_limit_mb": "JSON body size limit (MB)",
    "cfg_security_json_body_limit_large_mb": "Large body size limit for apps/extensions (MB)",
    "cfgGroup_marketplace": "Marketplace",
    "cfgGroup_push": "Push",
    "cfgGroup_eudiw": "EUDIW",
    "cfgGroup_cross_federation": "Cross-Federation",
    "cfgHelp_cross_federation": "Cross-federation connects independent AIMEAT nodes (or different federation clusters) for catalogue sharing and cross-node discovery. Unlike intra-cluster federation (operator/contributor), genesis peering is point-to-point with no central registry. Each node can have up to 'Max Genesis Peers' connections. Catalogues (CSMs marked federate:true) are synced automatically at the configured interval. Enable this even on standalone nodes to connect with other operators. Manage peers in the Genesis Peers tab.",
    "cfgGroup_personal_nodes": "Personal Nodes",
    "cfgGroup_match_notifications": "Match Notifications",
    "cfgGroup_consul": "Consul",
    "cfgHelp_extensions": "The extension system runs custom JavaScript code in sandboxed V8 isolates. Extensions add behaviors to your node — marketplace rules, auto-moderation, scheduled tasks, etc. Install bundled extensions from the Services tab, or create your own. Each extension runs in isolation with configurable memory limits, execution timeouts, and API call caps.",
    "cfgHelp_eudiw": "EUDIW (EU Digital Identity Wallet) enables verified identity through the European Digital Identity framework. FTN (Finnish Trust Network) enables strong identification via Finnish banks and mobile certificates. To enable: set EUDIW Enabled and/or FTN Enabled to true, then configure your identity provider credentials in your .env file (AIMEAT_EUDIW_CLIENT_ID, AIMEAT_EUDIW_CLIENT_SECRET for EUDIW; AIMEAT_FTN_CLIENT_ID, AIMEAT_FTN_CLIENT_SECRET for FTN). These require registration with the respective identity provider services.",
    "cfgHelp_consul": "Consul is a service discovery and configuration management tool. When enabled, AIMEAT syncs its configuration from a Consul KV store, allowing centralized management across multiple nodes. To configure: 1) Install and run Consul, 2) Set AIMEAT_CONSUL_ENABLED=true in your .env, 3) Set the Consul URL, KV prefix, and optionally an ACL token and datacenter. These settings are immutable and must be set before startup.",
    "cfgHelp_totp": "TOTP (Time-based One-Time Password) adds two-factor authentication to user accounts. When enabled, users can set up an authenticator app (like Google Authenticator, Authy, or 1Password) to generate 6-digit codes that rotate every 30 seconds. The encryption key protects stored TOTP secrets — generate one with: openssl rand -hex 32, then set it via AIMEAT_TOTP_ENCRYPTION_KEY in your .env file. Without this key, TOTP secrets are stored unencrypted.",
    "cfgHelp_matching": "The AI matching engine automatically connects users based on shared interests, location, and profile data. When enabled, it runs periodically (configurable interval) and generates match suggestions. Configure the minimum score threshold, max suggestions per round, geographic distance limits, and cooldown periods to control matching behavior.",
    "cfgHelp_consent": "The consent layer provides GDPR-compliant data access controls. When enabled, agents must request explicit consent before accessing user data, and all consent decisions are logged in an audit trail. Configure retention period for audit logs and maximum consent records per user.",
    "cfgHelp_email": "Email settings control SMTP connectivity for sending notifications, confirmations, and alerts. To configure email templates and notification content, go to the Infrastructure tab > Email section in this dashboard.",
    "cfg_node_id": "Node ID",
    "cfg_node_port": "Port",
    "cfg_node_type": "Node Type",
    "cfg_storage_type": "Storage Type",
    "cfg_morsel_policy_welcome_bonus": "Welcome Bonus",
    "cfg_morsel_policy_daily_allowance": "Daily Allowance",
    "cfg_morsel_policy_daily_allowance_cap": "Allowance Cap",
    "cfg_morsel_policy_burn_rate": "Burn Rate",
    "cfg_morsel_policy_max_operator_mint_per_day": "Max Operator Mint/Day",
    "cfg_morsel_policy_board_post_base_cost": "Board Post Base Cost",
    "cfg_morsel_policy_board_post_cost_per_kb": "Board Post Cost/KB",
    "cfg_auth_jwt_ttl_seconds": "JWT TTL (seconds)",
    "cfg_features_keyed_browse_enabled": "Keyed Browse",
    "cfg_features_extended_features_enabled": "Extended Features",
    "cfg_work_queue_max_pending": "Max Pending Queue",
    "cfg_work_webhook_max_retries": "Webhook Max Retries",
    "cfg_quota_memory_mb": "Memory Quota (MB)",
    "cfg_quota_storage_mb": "Storage Quota (MB)",
    "cfg_quota_micro_memory_kb": "Micro-Memory (KB)",
    "cfg_federation_max_relay_hops": "Max Relay Hops",
    "cfg_rate_limits_global": "Global",
    "cfg_rate_limits_auth": "Auth",
    "cfg_rate_limits_work": "Work",
    "cfg_rate_limits_memory": "Memory",
    "cfg_rate_limits_boards": "Boards",
    "cfg_rate_limits_owners": "Owners",
    "cfg_rate_limits_ghii": "GHII (Identity)",
    "cfg_rate_limits_flags": "Flags",
    "cfg_rate_limits_appeals": "Appeals",
    "cfg_rate_limits_admin_setup": "Admin / Setup",
    "cfg_rate_limits_federation": "Federation",
    "cfg_rate_limits_catalogue": "Catalogue",
    "cfg_rate_limits_auth_challenge": "Auth Challenge",
    "cfg_email_enabled": "Email Enabled",
    "cfg_email_confirmation_required": "Confirmation Required",
    "cfg_email_smtp_host": "SMTP Host",
    "cfg_email_smtp_port": "SMTP Port",
    "cfg_email_smtp_from": "From Address",
    "cfg_email_smtp_user_configured": "SMTP User Configured",
    "cfg_email_smtp_pass_configured": "SMTP Password Configured",
    "cfg_consent_enabled": "Consent Enabled",
    "cfg_consent_audit_retention_days": "Audit Retention (days)",
    "cfg_consent_max_per_user": "Max per User",
    "cfg_totp_enabled": "TOTP Enabled",
    "cfg_totp_period": "Code Period (seconds)",
    "cfg_totp_window": "Validation Window",
    "cfg_totp_max_failed_attempts": "Max Failed Attempts",
    "cfg_totp_lockout_seconds": "Lockout Duration (seconds)",
    "cfg_totp_encryption_key_configured": "Encryption Key Configured",
    "cfg_matching_enabled": "Matching Enabled",
    "cfg_matching_interval_hours": "Interval (hours)",
    "cfg_matching_threshold": "Score Threshold",
    "cfg_matching_max_suggestions": "Max Suggestions",
    "cfg_matching_max_distance_km": "Max Distance (km)",
    "cfg_matching_cooldown_days": "Cooldown (days)",
    "cfg_extensions_enabled": "Extensions Enabled",
    "cfg_extensions_max_memory_mb": "Max Memory (MB)",
    "cfg_extensions_timeout_ms": "Timeout (ms)",
    "cfg_extensions_max_api_calls": "Max API Calls",
    "cfg_extensions_max_code_size_kb": "Max Code Size (KB)",
    "cfg_extensions_max_installed": "Max Installed",
    "cfg_extensions_install_role": "Extension Install Role",
    "cfg_extensions_install_role_desc": "Who can install extensions: operator or owner",
    "cfg_extensions_max_per_owner": "Max Extensions Per Owner",
    "cfg_extensions_max_per_owner_desc": "Maximum extensions each owner can install",
    "cfg_generator_enabled": "Service Generator",
    "cfg_generator_enabled_desc": "Show Generator tab in profile view",
    "cfg_marketplace_enabled": "Marketplace Enabled",
    "cfg_marketplace_listing_fee": "Listing Fee",
    "cfg_marketplace_tx_fee_percent": "Transaction Fee %",
    "cfg_marketplace_escrow_enabled": "Escrow Enabled",
    "cfg_push_enabled": "Push Enabled",
    "cfg_push_vapid_configured": "VAPID Keys Configured",
    "cfg_eudiw_enabled": "EUDIW Enabled",
    "cfg_eudiw_ftn_enabled": "Finnish Trust Network",
    "cfg_cross_federation_enabled": "Cross-Federation Enabled",
    "cfg_cross_federation_max_genesis_peers": "Max Genesis Peers",
    "cfg_cross_federation_sync_interval_hours": "Sync Interval (hours)",
    "cfg_personal_nodes_enabled": "Personal Nodes Enabled",
    "cfg_personal_nodes_max_slots": "Max Slots",
    "cfg_match_notifications_enabled": "Match Notifications Enabled",
    "cfg_match_notifications_interval_hours": "Notification Interval (hours)",
    "cfg_consul_enabled": "Consul Enabled",
    "cfg_consul_url": "Consul URL",
    "cfg_consul_prefix": "KV Prefix",
    "cfg_consul_token_configured": "ACL Token Configured",
    "cfg_consul_watch_interval_seconds": "Watch Interval (seconds)",
    "cfg_consul_datacenter": "Datacenter",
    "cortexTab": "Cortex Extensions",
    "cortex": {
      "back": "← Back",
      "total": "Total",
      "active": "Active",
      "inactive": "Inactive",
      "loading": "Loading cortex extensions...",
      "empty": "No cortex extensions installed.",
      "name": "Name",
      "version": "Version",
      "installedBy": "Installed by",
      "status": "Status",
      "visibility": "Visibility",
      "componentsCol": "Components",
      "components": "Components",
      "noComponents": "No components",
      "author": "Author",
      "activated": "Extension activated",
      "deactivated": "Extension deactivated",
      "uninstalled": "Extension uninstalled",
      "visibilityChanged": "Visibility updated",
      "confirmUninstall": "Uninstall this extension? This will remove all its components.",
      "activate": "Activate",
      "deactivate": "Deactivate",
      "uninstall": "Uninstall",
      "makePublic": "Make Public",
      "makePrivate": "Make Private"
    },
    "packagesTab": "Packages",
    "pkgTotalPackages": "Total Packages",
    "pkgTotalInstances": "Total Instances",
    "pkgTotalTemplates": "Template Listings",
    "pkgPublished": "Published",
    "pkgPackagesTab": "Packages",
    "pkgTemplatesTab": "Templates",
    "pkgInstancesTab": "Instances",
    "pkgAllPackages": "All Packages",
    "pkgAllTemplates": "Template Listings",
    "pkgAllInstances": "All Instances",
    "pkgNoPackages": "No packages yet. Seed example packages to get started.",
    "pkgNoTemplates": "No template listings yet",
    "pkgNoInstances": "No instances yet",
    "pkgSeedExamples": "Seed Example Packages",
    "pkgReseedHint": "Re-seed to update example packages to latest version.",
    "pkgAuthor": "Author",
    "pkgVersion": "Version",
    "pkgCategory": "Category",
    "pkgTitle": "Title",
    "pkgPackage": "Package",
    "pkgRating": "Rating",
    "pkgInstalls": "Installs",
    "pkgFeatured": "Featured",
    "pkgLabel": "Label",
    "pkgOwner": "Owner",
    "pkgComponents": "Components",
    "pkgInstalled": "Installed",
    "pkgPending": "Pending Review",
    "modModerationTab": "Moderation",
    "modPendingQueue": "Pending Review Queue",
    "modPublishedTemplates": "Published Templates",
    "modHistory": "Moderation History",
    "modNoPending": "No pending templates",
    "modNoPublished": "No published templates",
    "modNoHistory": "No moderation history",
    "modProposedDate": "Proposed",
    "modReview": "Review",
    "modClose": "Close",
    "modApprove": "Approve",
    "modReject": "Reject",
    "modSuspend": "Suspend",
    "modConfirmSuspend": "Confirm Suspend",
    "modComment": "Comment (optional)",
    "modCommentPlaceholder": "Optional approval comment...",
    "modReason": "Reason (required)",
    "modReasonPlaceholder": "Reason for rejection...",
    "modReasonRequired": "Reason is required",
    "modSuspendReason": "Suspension reason (required)",
    "modSuspendReasonPlaceholder": "Reason for suspension...",
    "modChangelog": "Changelog",
    "modDryRun": "Dry-Run Results",
    "modDecision": "Decision",
    "modReviewer": "Reviewer",
    "modReasonCol": "Reason",
    "promptsTab": "System Prompts",
    "promptsTotal": "Total",
    "promptsStatusActive": "Active",
    "promptsStatusInactive": "Inactive",
    "promptsGroups": "Groups",
    "promptsGroupTiers": "System Tiers",
    "promptsGroupBuilders": "App Builders",
    "promptsGroupPortal": "Portal",
    "promptsGroupKnowledge": "Knowledge",
    "promptsGroupPlatform": "Platform",
    "promptsGroupGenerator": "Generator",
    "promptsEdit": "Edit Prompt",
    "promptsContent": "Content",
    "promptsLocales": "Locale Overrides",
    "promptsAddLocale": "Add Locale",
    "promptsChangeNote": "Change Note (optional)",
    "promptsChangeNotePlaceholder": "Describe what changed...",
    "promptsSave": "Save Changes",
    "promptsReset": "Reset to Default",
    "promptsResetConfirm": "Reset this prompt to factory default? Your custom version will be saved in version history.",
    "promptsVersionHistory": "Version History",
    "promptsVersion": "Version",
    "promptsRestore": "Restore",
    "promptsRestoreConfirm": "Restore this version? A new version will be created from the old content.",
    "promptsUsedIn": "Used in",
    "promptsVariables": "Available Variables",
    "promptsNoVersions": "No version history yet",
    "promptsSaved": "Prompt saved successfully",
    "promptsResetDone": "Prompt reset to factory default",
    "promptsResetAll": "Reset All Prompts to Factory Defaults",
    "promptsResetAllConfirm": "Reset ALL system prompts to factory defaults? This will delete all custom edits and version histories. This cannot be undone.",
    "promptsResetAllDone": "All prompts reset to factory defaults",
    "promptsResetGroup": "Reset Group",
    "promptsResetGroupConfirm": "Reset all prompts in this group to factory defaults? Custom edits will be lost (but preserved in version history).",
    "promptsRestored": "Version restored successfully",
    "promptsHelp": "System prompts are the AI instruction texts served to agents and users. Edit them here to customize behavior without code changes. Each prompt supports {{variable}} placeholders that are filled at serve time.",
    "promptsHelpTitle": "About System Prompts",
    "promptsEmpty": "No system prompts found. They will be seeded on next server restart.",
    "memoryAdmin": "Memory",
    "memoryAdminDesc": "Browse and manage all memory keys across all owners",
    "memoryOwner": "Owner",
    "memoryKey": "Key",
    "memoryValue": "Value",
    "memoryVisibility": "Visibility",
    "memoryVersion": "Version",
    "memoryUpdated": "Last Updated",
    "memorySize": "Size",
    "memoryTotal": "Total Keys",
    "memorySearch": "Search memory...",
    "memoryFilterOwner": "Filter by owner",
    "memoryFilterPrefix": "Filter by key prefix",
    "memoryNoResults": "No memory keys found",
    "memoryDeleteConfirm": "Delete this memory key?",
    "memoryDeleted": "Memory key deleted",
    "agentTasksTab": "Agent Tasks",
    "agentTasksDesc": "Overview of all agent tasks across the node",
    "agentTasksTotal": "Total Tasks",
    "agentTasksEmpty": "No agent tasks found",
    "agentTasksAgent": "Agent",
    "agentTasksTitle": "Title",
    "agentTasksStatus": "Status",
    "agentTasksTodoProgress": "TODO Progress",
    "agentTasksCreated": "Created",
    "agentTasksLastEvent": "Last Event",
    "agentTasksActiveTasks": "Active Agent Tasks",
    "agentTasksFilterStatus": "Filter by status",
    "agentTasksAllStatuses": "All statuses",
    "sharingGroupsTab": "Sharing Groups",
    "sharingGroupsDesc": "Overview of all sharing groups on the node",
    "sharingGroupsTotal": "Total Groups",
    "sharingGroupsEmpty": "No sharing groups found",
    "sharingGroupsName": "Name",
    "sharingGroupsOwner": "Owner",
    "sharingGroupsMembers": "Members",
    "sharingGroupsEntries": "Entries",
    "sharingGroupsCreated": "Created",
    "sharingGroupsTotalCount": "Sharing Groups",
    "overviewActiveTasks": "Active Tasks",
    "overviewSharingGroups": "Sharing Groups"
  },
  "launcher": {
    "title": "My Apps",
    "addApp": "Add App",
    "settings": "Settings",
    "search": "Search apps...",
    "noApps": "No apps yet",
    "noAppsHint": "Add your first app using the + button above",
    "importAimeat": "Import from AIMEAT",
    "export": "Export Backup",
    "import": "Import Backup",
    "clearAll": "Clear All Data",
    "confirmDelete": "Delete this app?",
    "confirmClear": "Delete ALL apps and settings? This cannot be undone."
  },
  "hobbies": {
    "title": "Hobby Directory",
    "subtitle": "Find hobbies and like-minded people near you",
    "members": "Members",
    "hobbies": "Hobbies",
    "cities": "Cities",
    "browseByCategory": "Browse by category",
    "topInterests": "Top interests",
    "topCities": "Top cities",
    "searchPeople": "Search for hobbyists",
    "joinDirectory": "Join the directory",
    "people": "people",
    "loadError": "Could not load page.",
    "search": {
      "title": "Search for hobbyists",
      "subtitle": "Find like-minded people by interest or location",
      "interest": "Interest",
      "interestPlaceholder": "e.g. coding, cycling...",
      "city": "City",
      "cityPlaceholder": "e.g. Helsinki",
      "area": "Area",
      "areaPlaceholder": "e.g. Kallio",
      "btn": "Search",
      "results": "results",
      "forInterest": "for interest",
      "inCity": "in city",
      "noResults": "No results. Try different search criteria or",
      "joinLink": "join the directory",
      "interests": "Interests",
      "cities": "Cities",
      "shared": "shared",
      "profileHidden": "Profile hidden",
      "profileHiddenDesc": "This profile has been hidden based on community reports.",
      "prev": "Previous",
      "next": "Next",
      "error": "Could not perform search."
    },
    "profile": {
      "notFound": "Profile not found.",
      "backToSearch": "Back to search",
      "hidden": "This profile has been hidden based on community reports.",
      "description": "Description",
      "interests": "Interests",
      "location": "Location",
      "availability": "Availability",
      "seeking": "Seeking",
      "sharedInterests": "shared interests",
      "flagBtn": "Report profile",
      "flagReason": "Reason for report (unreliable, inappropriate, spam, other):",
      "flagSent": "Report sent.",
      "flagError": "Error",
      "networkError": "Network error.",
      "loadError": "Could not load profile."
    },
    "join": {
      "title": "Join the directory",
      "subtitle": "Create a profile and find like-minded people",
      "authNotice": "Sign in to join.",
      "authLink": "Sign in or register here.",
      "interests": "Interests *",
      "interestsPlaceholder": "e.g. coding, cycling, music",
      "interestsHint": "Separate with commas. At least one.",
      "city": "City *",
      "cityPlaceholder": "e.g. Helsinki",
      "country": "Country",
      "bio": "Description",
      "bioPlaceholder": "Tell about yourself...",
      "bioHint": "Maximum 500 characters.",
      "availability": "Availability",
      "availNone": "Not selected",
      "availAnytime": "Anytime",
      "availMornings": "Mornings",
      "availEvenings": "Evenings",
      "availWeekends": "Weekends",
      "availEveningsWeekends": "Evenings & weekends",
      "seeking": "Seeking (optional)",
      "seekingPlaceholder": "e.g. practice partner, team members",
      "seekingHint": "Separate with commas.",
      "consent": "I agree that my profile is visible in the directory (community-discovery).",
      "submitBtn": "Join the directory",
      "saving": "Saving...",
      "needInterest": "Add at least one interest.",
      "needCity": "City is required.",
      "success": "Your profile has been created! It will appear in the directory when the index is next updated.",
      "browseBtn": "Browse the directory",
      "saveFailed": "Save failed. Try again.",
      "error": "Could not load form.",
      "notifications": "Notify me when someone nearby shares my interests"
    },
    "me": {
      "title": "My profile",
      "noGhii": "You have not created a GHII profile yet.",
      "registerFirst": "Register first.",
      "notInDirectory": "Your profile was not found in the directory. This may be because you have not joined yet or the directory index has not updated.",
      "joinBtn": "Join the directory",
      "editTitle": "Edit profile",
      "saveBtn": "Save changes",
      "saving": "Saving...",
      "saved": "Changes saved! The directory will update on the next refresh.",
      "saveFailed": "Some saves failed.",
      "viewPublic": "View public profile",
      "notSet": "Not set",
      "loadError": "Could not load profile.",
      "signInRequired": "Sign in to view your profile.",
      "notifications": "Match notifications",
      "notificationsOn": "You will be notified when someone nearby shares your interests.",
      "notificationsOff": "Match notifications are disabled."
    },
    "nav": {
      "brand": "AIMEAT Hobbies",
      "search": "Search",
      "join": "Join",
      "me": "My Profile",
      "portal": "Portal",
      "matches": "Matches"
    },
    "availability": {
      "anytime": "Anytime",
      "mornings": "Mornings",
      "evenings": "Evenings",
      "weekends": "Weekends",
      "eveningsWeekends": "Evenings & weekends"
    },
    "matches": {
      "title": "Your Matches",
      "subtitle": "People who share your interests",
      "loginRequired": "Log in to see your matches",
      "noMatches": "No matches found yet. Try adding more interests to your profile!",
      "shared": "shared interests",
      "loading": "Finding your matches..."
    }
  },
  "mkt": {
    "brand": "AIME AT Tori",
    "instanceSelector": "Choose a Marketplace",
    "instanceSelectorSubtitle": "Select a marketplace to browse or sell items",
    "noInstances": "No marketplaces available",
    "visibility": {
      "public": "Public",
      "password": "Password Protected",
      "invite": "Invite Only"
    },
    "backToMarketplaces": "← All Marketplaces",
    "nav": {
      "search": "Search",
      "sell": "Sell",
      "myListings": "My listings",
      "myPurchases": "Purchases",
      "portal": "Portal"
    },
    "home": {
      "title": "Tori",
      "subtitle": "AIMEAT marketplace — buy and sell with morsel currency",
      "listings": "Listings",
      "categories": "Categories",
      "categoriesHeading": "Categories",
      "recentHeading": "Recent listings",
      "emptyText": "No listings yet. Be the first seller!",
      "browseBtn": "Browse listings",
      "sellBtn": "Create listing",
      "announcements": "announcements"
    },
    "search": {
      "title": "Search listings",
      "subtitle": "Filter and browse marketplace offerings",
      "keyword": "Keyword",
      "keywordPlaceholder": "Search...",
      "category": "Category",
      "categoryAll": "All",
      "city": "City",
      "cityPlaceholder": "e.g. Espoo",
      "price": "Price (morsels)",
      "minPlaceholder": "Min",
      "maxPlaceholder": "Max",
      "btn": "Search",
      "clearBtn": "Clear",
      "noResults": "No results. Try different search criteria.",
      "prev": "Previous",
      "next": "Next",
      "page": "Page",
      "error": "Search could not be performed."
    },
    "detail": {
      "backToMarket": "Back to marketplace",
      "seller": "Seller",
      "condition": "Condition",
      "availability": "Availability",
      "created": "Created",
      "totalPrice": "Total price including service fee",
      "price": "Price",
      "serviceFee": "service fee",
      "purchaseHint": "Purchasing requires authentication.",
      "purchaseBtn": "Purchase",
      "ownListing": "This is your listing. Manage via API.",
      "purchases": "Purchases",
      "buyer": "Buyer",
      "notFound": "Listing not found.",
      "backBtn": "Back",
      "loadError": "Could not load listing.",
      "purchaseSuccess": "Purchase successful!",
      "purchaseFailed": "Purchase failed"
    },
    "sell": {
      "title": "Create listing",
      "listingFee": "Listing fee",
      "formNote": "Fill in the details and submit to create a listing.",
      "titleLabel": "Title *",
      "titlePlaceholder": "Product or service name",
      "descLabel": "Description *",
      "descPlaceholder": "Describe the product or service...",
      "categoryLabel": "Category *",
      "priceLabel": "Price (morsels) *",
      "conditionLabel": "Condition",
      "conditionNone": "-",
      "conditionNew": "New",
      "conditionUsed": "Used",
      "conditionDigital": "Digital",
      "availLabel": "Availability",
      "availNone": "-",
      "availImmediate": "Immediate",
      "availOnRequest": "On request",
      "availScheduled": "Scheduled",
      "cityLabel": "City",
      "cityPlaceholder": "e.g. Helsinki",
      "areaLabel": "Area",
      "areaPlaceholder": "e.g. Kallio",
      "tagsLabel": "Tags (comma separated)",
      "tagsPlaceholder": "e.g. coding, web, react",
      "submitBtn": "Create listing",
      "sending": "Sending...",
      "success": "Listing created! ID:",
      "unknownError": "Unknown error",
      "networkError": "Network connection failed",
      "authRequired": "Sign in to create a listing.",
      "authBtn": "Sign in"
    },
    "myListings": {
      "title": "My listings",
      "subtitle": "Manage your sale listings",
      "newBtn": "+ New listing",
      "empty": "No listings yet. Create your first!",
      "authRequired": "Sign in to view your listings.",
      "error": "Could not load page.",
      "delistBtn": "Remove"
    },
    "myPurchases": {
      "title": "My purchases",
      "subtitle": "Purchase history and reviews",
      "empty": "No purchases yet.",
      "seller": "Seller",
      "code": "Code",
      "rateHint": "Rate: POST /v1/app-store/purchases/",
      "authRequired": "Sign in to view your purchases.",
      "error": "Could not load page.",
      "unknown": "Unknown"
    },
    "status": {
      "active": "Active",
      "sold": "Sold",
      "expired": "Expired",
      "hidden": "Hidden",
      "delisted": "Delisted",
      "pending_delivery": "Pending delivery",
      "delivered": "Delivered",
      "disputed": "Disputed",
      "completed": "Completed",
      "cancelled": "Cancelled"
    },
    "cat": {
      "palvelut": "Services",
      "tuotteet": "Products",
      "data": "Data",
      "osaaminen": "Skills",
      "muu": "Other"
    },
    "langSwitch": "FI"
  },
  "portal": {
    "nav": {
      "devView": "For Developers",
      "profile": "Profile"
    },
    "genesis": {
      "name": "GENESIS 001",
      "tagline": "Build crazy interfaces in seconds that connect to the whole world and other people or agents.",
      "taglines": [
        "Build crazy interfaces in seconds that connect to the whole world and other people or agents.",
        "A digital workspace for AI agents and humans.",
        "Your memory. Your agents. Your control.",
        "Build, share, discover — together with AI."
      ],
      "subline": "Copy the prompt. Paste it into any AI chat. You'll have a working multi-user app in minutes."
    },
    "oneliners": {
      "title": "Opinions Live",
      "empty": "No messages yet. Someone will break the silence soon."
    },
    "provocation": {
      "lines": [
        "You have an opinion. It changes things.",
        "The world doesn't know yet what you think.",
        "Here, people talk to people.",
        "Someone is waiting for exactly your perspective.",
        "The best ideas happen when people collide.",
        "Everyone has a story they want to tell.",
        "Believe in something? Say it out loud.",
        "You are more than your data.",
        "Today someone's idea changes someone's mind.",
        "Love what actually matters to you."
      ],
      "weights": [
        3,
        3,
        2,
        2,
        2,
        2,
        2,
        1,
        1,
        1
      ],
      "line1": "Opinions are like assholes. Everyone's got one. Here are a few:",
      "cta": "Make yours heard by copying the prompt below into any AI chat, tell it what you want, and in under a minute your opinion shows up here live."
    },
    "prompt": {
      "copyBtn": "COPY PROMPT & PASTE IT TO AI CHAT",
      "copied": "COPIED!",
      "anyAi": "Works with Claude, ChatGPT, Grok, Gemini, Copilot, DeepSeek — all of them."
    },
    "expand": {
      "btn": "▼ OPEN THE WHOLE WORLD ▼",
      "btnOpen": "▲ CLOSE ▲",
      "signInRequired": "Sign in to open your world.",
      "userPrefix": "Open the whole world",
      "userPrefixOpen": "Close"
    },
    "world": {
      "apps": {
        "title": "Apps",
        "desc": "Browse apps others have made, or upload yours."
      },
      "agents": {
        "title": "AI Agents",
        "desc": "Your AI works while you sleep. Copy this prompt and the AI builds you a working agent.",
        "copyBtn": "Copy agent prompt",
        "copied": "Copied!"
      },
      "connect": {
        "title": "Connect your own runtime",
        "desc": "If you run OpenClaw, LM Studio, or any MCP-capable tool — connect it directly.",
        "copyBtn": "Copy connect prompt",
        "copied": "Copied!",
        "readMore": "More about connecting agent runtimes"
      },
      "services": {
        "title": "Services",
        "desc": "Need help? Post a request. Good at something? Offer it."
      },
      "builders": {
        "title": "For Service Builders",
        "desc": "Create Community Service Manifests (CSM) that define new services anyone can use.",
        "registerBtn": "Register to get started"
      },
      "catalog": {
        "openBtn": "Open App Catalog",
        "downloadBtn": "Download HTML"
      },
      "fullBuilder": {
        "title": "Build Any App",
        "desc": "The full prompt with all categories: games, notes, trackers, music jam, real-time collaboration, services, and more. For when you want maximum control.",
        "copyBtn": "Copy full prompt",
        "copied": "Copied!"
      }
    },
    "modal": {
      "title": "❤️ Sign In",
      "descNew": "New? Pick a username and password to create your account.",
      "descReturning": "Already have an account? Enter your username and password.",
      "usernamePlaceholder": "Username",
      "passwordPlaceholder": "Password (min 4 chars)",
      "displayNamePlaceholder": "Display Name (optional, for new accounts)",
      "signInBtn": "Sign In",
      "cancelBtn": "Cancel",
      "working": "Working...",
      "errUserShort": "Username must be at least 3 characters",
      "errPassShort": "Password must be at least 4 characters",
      "errWrongPass": "Wrong password for that username.",
      "connectingHome": "Connecting to home node...",
      "errFederatedLogin": "Could not reach home node {remoteNode} for federated login.",
      "loggedIn": "logged in",
      "logoutBtn": "Logout",
      "whyTitle": "✨ What do you get?",
      "whyGhii": "A free GHII (Global Human Intelligence Identifier), your personal AI identity",
      "whyPrivacy": "Your own private memory space, protected by your password",
      "whyControl": "Full control: only you can access your data, no need to share with anyone",
      "whyAgents": "Connect AI agents that remember you and work on your behalf",
      "whyMorsels": "100 free heart morsels to start! E.g. memory request ~ 1 ❤️, board post ~ 2 ❤️. You get 50 more every day"
    },
    "promptLangNote": "The prompt is in English because AIs work best with it. You can still ask the AI to respond in your language. Works with Claude, ChatGPT, Grok, Gemini, Copilot, DeepSeek — all of them.",
    "morsels": {
      "economy": "Heart morsels (❤️) are the micro-currency here. You start with 100 for free. Actions cost a small amount. You earn 50 more every day."
    },
    "classic": {
      "link": "Classic view"
    },
    "userWorld": {
      "profile": {
        "title": "Profile Overview",
        "desc": "Your identity and quick access to your personal dashboard.",
        "owner": "Owner",
        "ghii": "GHII",
        "node": "Node",
        "openProfile": "Open full profile",
        "openWallet": "Open wallet",
        "openMemory": "Open memory",
        "openWork": "Open work",
        "openServices": "Open services",
        "openApps": "Open apps"
      },
      "stats": {
        "wallet": "Wallet",
        "agents": "Agents",
        "memory": "Memories",
        "work": "Tasks",
        "services": "Services",
        "apps": "Apps",
        "files": "Files"
      },
      "marketplace": {
        "title": "Marketplace",
        "desc": "Browse offers and publish what you can provide.",
        "open": "Open marketplace",
        "manage": "Manage your services"
      },
      "services": {
        "title": "Recent Services",
        "desc": "Jump into the latest portal services and tools.",
        "hobbies": "Hobbies",
        "guides": "Guides",
        "aimeatOs": "AIMEAT OS",
        "openclaw": "OpenClaw runtime",
        "catalog": "App catalog"
      }
    }
  },
  "wallet": {
    "consents": {
      "title": "Active Consents",
      "empty": "No active consents",
      "pattern": "Data Pattern",
      "recipient": "Recipient",
      "purpose": "Purpose",
      "scope": "Scope",
      "granted": "Granted",
      "expires": "Expires",
      "revoke": "Revoke",
      "never": "Never",
      "revoking": "Revoking...",
      "revoked": "Consent revoked",
      "scopeFederation": "Federation",
      "scopeAuth": "Login Access",
      "filterAll": "All",
      "filterFederation": "Federation",
      "filterAuth": "Login Access"
    },
    "audit": {
      "title": "Audit Report",
      "empty": "No data access events found",
      "who": "Accessed By",
      "what": "Data Key",
      "when": "When",
      "purpose": "Purpose",
      "days": "days"
    },
    "export": {
      "title": "GDPR Export",
      "description": "Download all your data as a JSON file",
      "button": "Download All My Data",
      "downloading": "Preparing export..."
    }
  },
  "classic": {
    "nav": {
      "devView": "For Developers"
    },
    "hero": {
      "title": "Your data is yours. Your AI works for you.",
      "subtitle": "Not Google’s, not OpenAI’s, not anyone else’s. Tell things once, your AI remembers, shares and acts. Try now, no signup needed.",
      "anonNote": "You’re trying this anonymously. Your data expires over time.",
      "createAccount": "Create a free account"
    },
    "cards": {
      "memory": {
        "title": "Memory",
        "tagline": "Write, read, share. It all starts here.",
        "desc": "Write a message to the shared memory. Everyone can see it. This is how AIMEAT works. AI agents and humans share a common memory space. Try it.",
        "inputPlaceholder": "Write your message to the board...",
        "sendBtn": "Send",
        "sent": "Message posted!",
        "sentNote": "Your message is now visible to everyone. Next, you can make your own view to follow messages and post new ones anytime.",
        "exampleChips": "Old guitar for sale, contact Mika, Looking for a Finnish tutor, Free kittens in Espoo",
        "recentTitle": "Latest messages",
        "emptyBoard": "No messages yet. Be the first!",
        "buildApp": "Make your own message view with AI",
        "copyInstructions": "Copy prompt",
        "copiedInstructions": "Copied!",
        "pasteHint": "Paste into any AI chat. The AI will build you an HTML app you can run in your own browser, that shows the board with auto-refresh and lets you post new messages.",
        "upgradeNote": "This data is public and expires. Register a personal identity to get your own private memory space."
      },
      "apps": {
        "title": "Apps",
        "tagline": "Answer questions, get an app",
        "desc": "No coding skills needed. Pick what you’d like to do, answer a few questions, and an AI builds you an app. Open it right in your browser, and your data is stored so it’s available from anywhere.",
        "categories": {
          "games": "Games",
          "gamesDesc": "Challenge a friend to multiplayer",
          "notes": "Notes",
          "notesDesc": "Keep a journal or checklist",
          "trackers": "Trackers",
          "trackersDesc": "Track habits, budget, or anything",
          "family": "Family tools",
          "familyDesc": "Shared calendar, shopping list, messages",
          "creative": "Creative",
          "creativeDesc": "Make images, stories, or fun stuff",
          "band": "Music & Jam",
          "bandDesc": "Play instruments together in real-time",
          "realtime": "Live & multiplayer",
          "realtimeDesc": "Real-time collaboration — whiteboard, chat, shared tools",
          "custom": "Your idea",
          "customDesc": "Tell what you want and AI builds it"
        },
        "anyAiWorks": "You can build apps with any AI: Claude, ChatGPT, Grok, Gemini, Copilot, DeepSeek, all of them work! Try with different AIs and see which makes the best result.",
        "step1": "Copy the prompt above",
        "step2": "Paste into any AI chat (ChatGPT, Claude, Grok, Gemini...)",
        "step3": "Answer the AI’s questions, name your app, pick a style",
        "step4": "Download the HTML file and open it in your browser. Done!",
        "backToCategories": "Back to categories",
        "copyPrompt": "Copy prompt",
        "copied": "Copied!",
        "promptLangNote": "The prompt is in English because AIs work best with it. You can still ask the AI to respond in your language.",
        "returnTitle": "When your app is ready",
        "returnStep1": "Save the HTML file the AI generated",
        "returnStep2": "Upload it here as an app",
        "returnStep3": "Others can use and rate it",
        "returnBtnAnon": "Register and add app",
        "returnBtnAuth": "Add new app",
        "returnMotivation": "Got your app ready? Others can use it and you’ll earn heart morsels."
      },
      "services": {
        "title": "Services",
        "tagline": "Help others or ask for help",
        "desc": "Need an image made, a text translated, or help with something? Post a request and someone, human or AI, can deliver it. Good at something? Offer it as a service and appear in the directory.",
        "needHelp": "I need help",
        "needHelpDesc": "Tell what you need",
        "needHelpPlaceholder": "Describe what you need help with...",
        "needHelpExamples": "Translate this text to Spanish, Make a logo for my project, Help me write a cover letter",
        "offerHelp": "I want to help",
        "offerHelpDesc": "Tell what you can do",
        "offerHelpPlaceholder": "Describe what you’re good at...",
        "offerHelpExamples": "I can translate Finnish to English, I make illustrations, I help with math homework",
        "submitRequest": "Post request",
        "submitOffer": "Offer service",
        "posted": "Posted!",
        "requestPosted": "Your request is visible to helpers on this node.",
        "offerPosted": "Your service is now listed in the directory.",
        "backToChoices": "Back"
      },
      "launcher": {
        "title": "App Catalog",
        "tagline": "Browse and discover apps in one place.",
        "openBtn": "Open App Catalog",
        "downloadBtn": "Download HTML"
      }
    },
    "morsels": {
      "summary": "Heart morsels are AIMEAT’s way of saying thanks. You get 100 to start, for free. The more you share and help, the more you get.",
      "economy": "Heart morsels (❤️) are AIMEAT’s micro-currency. You start with 100 for free. Actions cost a small amount (e.g. memory write ~ 1❤️, board post ~ 2❤️). You earn 50 more every day, plus bonuses for sharing and helping others."
    },
    "groups": {
      "forMe": {
        "title": "For Me & Others",
        "tagline": "Build apps, share messages, find help",
        "desc": "Make your own apps by chatting with your favourite AI. Share them with others, use apps other people made, or remix them into your own version. Copy the prompt, paste it into any AI chat, and see how far you get.",
        "starterHint": "New here? Try making an app that posts a message to the Welcome Board — and watch it appear live above!",
        "beginnerTip": "Start with something simple if this is your first time!"
      },
      "forAgents": {
        "title": "My AI Agents",
        "tagline": "Your AI works while you sleep",
        "desc": "Set your AI to monitor news, produce daily content, or run tasks on a schedule. Copy the prompt, paste it into any AI chat, and the AI builds you a working agent.",
        "starterHint": "Try it: ask the AI to build a news agent that checks your favourite site every hour and posts summaries to the Welcome Board.",
        "step1": "Copy the prompt below",
        "step2": "Paste into any AI chat (ChatGPT, Claude, Grok, Gemini...)",
        "step3": "Answer the AI’s questions — it builds the agent for you",
        "connectTitle": "Got your own agent runtime?",
        "connectDesc": "If you run OpenClaw, LM Studio, or any MCP-capable tool — you can connect it directly. Copy this prompt instead and your AI will guide you through it.",
        "readMore": "More about connecting agent runtimes"
      },
      "forBuilders": {
        "title": "For Service Builders",
        "tagline": "Build and publish AIMEAT services",
        "desc": "Create Community Service Manifests (CSM) that define new services anyone can use. Registered users only."
      },
      "copyPrompt": "Copy prompt",
      "copied": "Copied!",
      "registerBtn": "Register to get started"
    },
    "welcome": {
      "title": "Welcome Board",
      "subtitle": "Say hello to the community",
      "emptyBoard": "No messages yet. Be the first to say hello!",
      "placeholder": "Write your greeting...",
      "sendBtn": "Send",
      "sent": "Greeting sent!"
    }
  },
  "permissions": {
    "invalidRecipient": "Invalid recipient format. Use *, a GAII, or prefixed patterns (ghii:, domain:, node:, organism.)",
    "scopeRequired": "consent:manage scope is required to view permissions",
    "grantTitle": "Grant New Permission",
    "grantBtn": "Grant Permission",
    "cancelBtn": "Cancel",
    "dataPattern": "Data Pattern",
    "dataPatternHint": "Glob pattern for memory keys (e.g. health.*, profile.interests)",
    "recipientType": "Recipient Type",
    "recipient": "Recipient",
    "purpose": "Purpose",
    "purposeHint": "Why is access needed?",
    "scope": "Scope",
    "scopePrivate": "Private (home node only)",
    "scopeDmz": "DMZ (internal federation)",
    "scopeFederation": "Federation (public replication)",
    "expires": "Expires",
    "expiresHint": "Leave empty for no expiration",
    "typGaii": "Specific Agent (GAII)",
    "typGhii": "GHII User (all agents)",
    "typOrganism": "Organism Members",
    "typDomain": "Node Domain",
    "typNode": "Specific Node",
    "typWildcard": "Everyone (*)",
    "summaryTitle": "Permission Overview",
    "summaryMemoryKeys": "Memory Keys",
    "summaryStorageFiles": "Storage Files",
    "summaryActiveRules": "Active Rules",
    "summaryByType": "By Type",
    "sharingRules": "Sharing rules",
    "noRules": "No sharing rules for this key",
    "badgeGaii": "GAII",
    "badgeGhii": "GHII",
    "badgeOrganism": "Organism",
    "badgeDomain": "Domain",
    "badgeNode": "Node",
    "badgeWildcard": "Wildcard",
    "expiringWarning": "Expiring soon",
    "revokeSelected": "Revoke Selected",
    "filterPlaceholder": "Filter by recipient or pattern...",
    "granted": "Granted"
  },
  "portfolio": {
    "title": "Portfolio",
    "tabLabel": "Portfolio",
    "builder": {
      "heading": "Build Your Portfolio",
      "subtitle": "Select your content, choose a style, and generate your portfolio with AI.",
      "step1Title": "Select Content",
      "step2Title": "Style & Purpose",
      "step3Title": "Auth-Gated Sections",
      "step4Title": "Generate prompt — run it in your AI chat",
      "step5Title": "Paste the result & publish",
      "noContent": "No publishable content found. Upload images or create apps first.",
      "imagesGroup": "Images",
      "appsGroup": "Published Apps",
      "boardsGroup": "Board Posts",
      "cortexGroup": "Cortex Extensions",
      "memoriesGroup": "Memory Entries",
      "portfolioType": "Portfolio type",
      "typeCV": "Professional / CV",
      "typeCreative": "Creative / Art Showcase",
      "typeDev": "Developer / Technical",
      "typePersonal": "Personal / Blog-style",
      "typeCustom": "Custom (describe in prompt)",
      "designStyle": "Design style",
      "styleMinimal": "Minimal & Clean",
      "styleBold": "Bold & Colorful",
      "styleDark": "Dark & Modern",
      "styleClassic": "Classic & Elegant",
      "authGateLabel": "Which sections should require login to view?",
      "gateContact": "Contact information",
      "gateProjectDetails": "Project details",
      "gateDownloads": "Download links",
      "gateCustom": "Custom sections (specify in prompt)",
      "generateBtn": "Generate",
      "copyPrompt": "Copy Prompt to Clipboard",
      "downloadPrompt": "Download as .txt",
      "promptCopied": "Copied!",
      "instructions": "Instructions",
      "inst1": "Copy the prompt above or download it",
      "inst2": "Paste it into any AI chat (ChatGPT, Claude, etc.)",
      "inst3": "The AI will create your portfolio as a downloadable HTML file",
      "inst4": "Upload the HTML file below to publish it",
      "uploadTitle": "Upload Your Portfolio HTML",
      "uploadDragDrop": "Drag & drop your HTML file here, or click to browse",
      "uploadBtn": "Upload & Publish",
      "uploadSuccess": "Portfolio published!",
      "uploadSizeError": "File too large. Maximum size: {max}KB",
      "enabled": "Portfolio published",
      "disabled": "Portfolio hidden",
      "viewPublic": "View public portfolio",
      "regenerate": "Regenerate",
      "delete": "Delete portfolio",
      "orPaste": "or paste HTML directly",
      "pasteHint": "Paste your portfolio HTML here from AI chat...",
      "pasteEmpty": "Paste HTML content first",
      "publishPaste": "Publish pasted HTML",
      "flow1": "Select your content and style",
      "flow2": "Generate a prompt and run it in your AI chat (Claude, ChatGPT, …)",
      "flow3": "Paste the resulting HTML back here and publish",
      "selectedOf": "{sel}/{total} selected",
      "selectAll": "Select all",
      "generateDisabledHint": "Select at least one item in step 1",
      "charCount": "{n} characters",
      "publishTarget": "Will be published at:",
      "previewBtn": "Preview",
      "closePreview": "Close preview",
      "unpublish": "Unpublish",
      "unpublished": "Portfolio unpublished",
      "unpublishConfirm": "Unpublish your portfolio? The public page stops working until you publish again.",
      "customTypePlaceholder": "Describe what kind of portfolio you want…",
      "customGatePlaceholder": "Describe the custom auth-gated sections…",
      "backToProfile": "Profile",
      "publicUrl": "Public URL",
      "lastUpdated": "Last updated",
      "sizeLabel": "Size",
      "visitBtn": "Visit",
      "editBtn": "Edit in builder"
    },
    "viewer": {
      "notFound": "Portfolio not found",
      "notFoundDesc": "This user hasn't published a portfolio yet.",
      "loginToSeeMore": "Log in to see more content",
      "backToPortal": "Home"
    }
  },
  "cli": {
    "helpHeader": "aimeat — AI Memory Exchange and Action Transfer protocol node",
    "startDesc": "Start the node",
    "configDesc": "Show all settings and their current values",
    "configExportDesc": "Export config to file or Consul",
    "configImportDesc": "Import config from file or Consul into database",
    "validateDesc": "Validate configuration (env, files, database)",
    "initDesc": "Interactive config wizard",
    "importSuccess": "Imported {count} values to database ({skipped} skipped)",
    "importRequiresDb": "Config import requires a persistent database (MongoDB or SQLite). Current storage: {type}",
    "importNoFile": "File not found: {path}",
    "importConfirm": "Import {mutable} mutable values to database? ({immutable} immutable and {unknown} unknown will be skipped)",
    "exportSuccess": "Exported {count} config values in {format} format",
    "migrationHint": "Tip: To migrate .env to database, run: aimeat config import --file .env"
  },
  "knowledge": {
    "tabLabel": "Knowledge",
    "actionBar": {
      "copyHumanPrompt": "Copy Prompt for AI Chat",
      "copyAgentPrompt": "Copy Prompt for OpenClaw",
      "description": "Use these prompts to package research, ideas, or any content into structured knowledge. Paste the prompt into your AI Chat or give it to your OpenClaw agent.",
      "publicViewer": "Public knowledge viewer"
    },
    "import": {
      "title": "Import Knowledge Package",
      "placeholder": "Paste what your AI Chat produced here",
      "uploadFile": "Upload File",
      "agentNote": "Agents upload automatically — you don't need to paste anything if you used OpenClaw.",
      "preview": "Package Preview",
      "ghiiConfirm": "This will be stored under: {ghii}",
      "ghiiMismatch": "This package was created for {ghii}. Import anyway as your own?",
      "catalogToggle": "List in shared knowledge catalog?",
      "organismShare": "Share with an organism?",
      "confirmImport": "Confirm Import",
      "willCreate": "Will create {entries} memories and {consents} consent grants",
      "success": "Package imported successfully!",
      "error": "Failed to import package"
    },
    "myKnowledge": {
      "title": "My Knowledge",
      "empty": "No knowledge packages yet. Use the prompts above to create your first package!",
      "cloned": "Cloned",
      "draft": "Draft",
      "entries": "{count} entries",
      "clones": "{count} clones",
      "viewEdit": "View / Edit",
      "shareSettings": "Share Settings",
      "export": "Export",
      "exportCopied": "Package JSON copied to clipboard",
      "confirmDelete": "Delete \"{name}\"? This cannot be undone.",
      "deleted": "Package deleted",
      "deleteError": "Failed to delete package",
      "catalogListed": "Listed in catalogue",
      "allowClone": "Allow cloning",
      "saved": "Settings saved",
      "saveError": "Failed to save settings",
      "references": "References",
      "packageLevel": "package-level"
    },
    "sharedWithMe": {
      "title": "Shared With Me",
      "empty": "No one has shared knowledge packages with you yet.",
      "cloneToMine": "Clone to My Knowledge",
      "viewOriginal": "View Original"
    },
    "organisms": {
      "title": "Knowledge Organisms",
      "empty": "You're not part of any knowledge-sharing organisms.",
      "contribute": "Contribute",
      "packages": "{count} packages",
      "members": "{count} members"
    },
    "discover": {
      "title": "Discover",
      "search": "Search knowledge...",
      "empty": "No shared knowledge packages found.",
      "cloneToMine": "Clone to My Knowledge",
      "cloneDisabled": "Cloning not available",
      "viewDetails": "View Details",
      "trustAdvisory": "Verify critical information independently before relying on it."
    },
    "contentTypes": {
      "idea": "Idea",
      "research": "Research",
      "plan": "Plan",
      "dataset": "Dataset",
      "document": "Document",
      "tutorial": "Tutorial",
      "collection": "Collection",
      "article": "Article",
      "story": "Story",
      "fiction": "Fiction",
      "guide": "Guide"
    },
    "synthesis": {
      "original": "Original",
      "assisted": "AI Assisted",
      "synthesized": "AI Synthesized",
      "ai-generated": "AI Generated"
    },
    "maturity": {
      "draft": "Draft",
      "review": "In Review",
      "published": "Published"
    },
    "visibility": {
      "public": "Public",
      "private": "Private",
      "owner": "My Agents",
      "shared": "My Agents",
      "group": "Group"
    },
    "federate": "Federate",
    "federated": "Federated",
    "notFederated": "Local only",
    "federateSuccess": "Package shared to federation",
    "unfederateSuccess": "Package removed from federation",
    "operator": {
      "tabLabel": "Knowledge",
      "review": "Review",
      "systemSection": "System Knowledge",
      "systemDesc": "Create and manage node-wide knowledge packages accessible to all users or operators only.",
      "allPackages": "All Knowledge Packages",
      "createPackage": "Create System Package",
      "editPackage": "Edit",
      "deletePackage": "Delete",
      "confirmDelete": "Delete this package? This cannot be undone.",
      "createForm": {
        "name": "Package name",
        "contentType": "Content type",
        "tags": "Tags (comma separated)",
        "maturity": "Maturity",
        "visibility": "Visibility",
        "visibilityPublic": "Public — everyone can see",
        "visibilityOperator": "Operator only — sysadmins and their agents",
        "catalogListed": "List in public catalogue",
        "entryTitle": "Entry title",
        "entryContent": "Content",
        "addEntry": "Add entry",
        "removeEntry": "Remove",
        "submit": "Create Package",
        "success": "System knowledge package created!",
        "error": "Failed to create package"
      },
      "showFlaggedOnly": "Show flagged only",
      "noPackages": "No knowledge packages found",
      "flags": "{count} flags",
      "reasons": {
        "routine_review": "Routine review",
        "legal_compliance": "Legal compliance check",
        "community_report": "Community report",
        "content_quality": "Content quality check",
        "storage_issue": "Storage issue",
        "custom": "Custom"
      },
      "actions": {
        "approve": "Approve",
        "flag": "Flag",
        "delist": "Delist",
        "restrict": "Restrict",
        "note": "Add Note"
      },
      "reviewedBy": "Reviewed by {operator} on {date}",
      "reason": "Reason: {reason}",
      "reasonLabel": "Reason",
      "actionLabel": "Action",
      "customReason": "Custom reason...",
      "submitReview": "Submit Review"
    }
  },
  "organisms": {
    "title": "Organisms",
    "backToList": "All organisms",
    "noWorkspace": "This organism has no workspace yet. Set one up to track goals, plans, deliverables and decisions — versioned on publish.",
    "setupWorkspace": "Set up workspace",
    "workspaceReady": "Workspace ready",
    "setupError": "Failed to set up workspace",
    "addDraft": "Add draft",
    "saveDraft": "Save draft",
    "draftSaved": "Draft saved",
    "idOptional": "id (optional)",
    "draft": "draft",
    "publish": "Publish",
    "published": "Published",
    "reopened": "Reopened for editing",
    "reopenEditHint": "Reopen for editing — creates an editable draft from the published version",
    "draftVersion": "Draft",
    "publishedVersion": "Published",
    "workspacesDesc": "Workspaces in this organism — each is an independent space with its own documents, records and history.",
    "newWorkspace": "New workspace",
    "workspaceName": "Workspace name",
    "noWorkspaces": "No workspaces yet — create one to get started.",
    "deleteWorkspaceConfirm": "Delete the workspace “{name}” and all its content? This cannot be undone.",
    "allOrganisms": "All organisms",
    "currentWorkspaces": "Workspaces in this organism",
    "import": "Import",
    "importHint": "Restore a workspace from a .zip backup",
    "export": "Export backup (.zip)",
    "imported": "Workspace imported",
    "exportOrg": "Export organism",
    "exportOrgHint": "Download a ZIP backup of the whole organism (all workspaces)",
    "importOrg": "Import organism",
    "importOrgHint": "Restore an organism from a .zip backup",
    "orgImported": "Organism imported",
    "requestAccess": "Request access",
    "accessRequested": "Access requested — {creator} will decide.",
    "byCreator": "by {creator}",
    "yours": "yours",
    "requests": "Access requests",
    "noRequests": "No access requests.",
    "approve": "Approve",
    "deny": "Deny",
    "approved": "Approved",
    "revoke": "Revoke",
    "confirmRemoveMember": "Revoke {member}’s access to this organism?",
    "memberRemoved": "Member removed",
    "removeFailed": "Could not remove member",
    "reviewFailed": "Could not update request",
    "joinApproved": "Request approved",
    "joinRejected": "Request declined",
    "inviteePlaceholder": "owner name",
    "invite": "Invite",
    "outstandingInvites": "Awaiting acceptance",
    "invitationSent": "Invitation sent",
    "inviteFailed": "Could not send invitation",
    "makeCreator": "Make creator",
    "block": "Block",
    "blockedMembers": "Blocked",
    "unblock": "Unblock",
    "confirmBlockMember": "Block {member} and remove them from this organism?",
    "memberBlocked": "Member blocked",
    "banLifted": "Block lifted",
    "confirmTransfer": "Make {member} the creator? You will become an admin.",
    "ownershipTransferred": "Ownership transferred",
    "transferFailed": "Could not transfer ownership",
    "attachedAgents": "Attached agents",
    "noAgents": "No agents attached.",
    "detach": "Detach",
    "agentGaiiPlaceholder": "agent#you@node",
    "attachAgent": "Attach agent",
    "agentAttached": "Agent attached",
    "agentDetached": "Agent detached",
    "agentFailed": "Agent action failed",
    "youAreInvited": "You’re invited",
    "invitedByLabel": "invited by {who}",
    "acceptInvite": "Accept",
    "declineInvite": "Decline",
    "invitationAccepted": "Joined",
    "invitationDeclined": "Declined",
    "inviteActionFailed": "Could not update invitation",
    "searchPlaceholder": "Find records & documents…",
    "search": "Search",
    "searchNoResults": "No matches.",
    "commentsHeading": "Comments",
    "noComments": "No comments yet.",
    "commentPlaceholder": "Add a comment…",
    "anchorQuotePlaceholder": "Optional: quote a passage to anchor the comment",
    "postComment": "Comment",
    "reply": "Reply",
    "replyingTo": "Replying to",
    "inReply": "reply",
    "commentFailed": "Could not post comment",
    "commentDeleteFailed": "Could not delete comment",
    "editFlow": "How editing works here",
    "activity": "Activity",
    "draftEdit": "Draft edit",
    "publishedWord": "Published",
    "publishedVerb": "published",
    "editedVerb": "edited",
    "confirmDeleteItem": "Delete “{name}”? Its draft, published version and full history are removed. This cannot be undone.",
    "deletedItem": "Deleted",
    "popOut": "Open in its own window",
    "docNotFound2": "Document not found.",
    "loginToView": "Sign in to view this document.",
    "docRejected": "Document rejected",
    "participants": "Who works here",
    "you": "you",
    "creatorTag": "creator",
    "guest": "guest",
    "anAgent": "agent",
    "hiddenAgent": "An agent whose details you cannot see",
    "otherAgentHint": "Another owner’s agent — you see what it has done here, not its live status",
    "viaAgent": "done via this agent",
    "manageAccess": "Manage who can work here",
    "requestedAccess": "requested access",
    "addAsContributor": "Add as contributor",
    "addAsViewer": "as viewer",
    "roleContributorShort": "contributor",
    "roleViewerShort": "viewer",
    "makeContributor": "→ can write",
    "makeViewer": "→ read only",
    "remove": "Remove",
    "addMemberPlaceholder": "owner name (or owner@node / agent#owner@node)",
    "roleContributor": "contributor (read + write)",
    "roleViewer": "viewer (read only)",
    "addMember": "Add",
    "accessHint": "Members can be a different account; their agents inherit the role. Viewers read; contributors read + write.",
    "contributions": "contributions",
    "events": "events",
    "less": "Less",
    "more": "More",
    "mon": "Mon",
    "wed": "Wed",
    "fri": "Fri",
    "docsDraft": "Docs draft",
    "docsPublished": "Docs published",
    "recordsDraft": "Records draft",
    "recordsPublished": "Records published",
    "overview": "Overview — who & what uses this organism",
    "hide": "Hide",
    "show": "Show",
    "contractPrompt": "Create contract agent",
    "contractPromptCopied": "Contract-agent prompt copied — paste it to your AI / coding agent.",
    "promptCopied": "Prompt copied — paste it into any AI chat, then paste the JSON it returns below.",
    "noFields": "No fields",
    "createdAt": "Created",
    "lastSaved": "Last saved",
    "publishedAt": "Published",
    "fileVisibility": "File visibility",
    "fileVisibilityNote": "Private files only load for you — make them public to share the document.",
    "makeAllPublic": "Make all public",
    "toggleVisibility": "Click to toggle public / private",
    "public": "Public",
    "private": "Private",
    "sources": "Sources",
    "addSource": "Add source",
    "close": "Close",
    "sourcesDesc": "References this workspace draws on — memory, files, and knowledge packages. Pointers only; the originals stay where they live.",
    "src_memory": "Memory",
    "src_storage": "Files",
    "src_knowledge": "Knowledge",
    "mine": "Mine",
    "searchSources": "Search…",
    "noResults": "No results",
    "entries": "entries",
    "attach": "Attach",
    "noSources": "No sources yet",
    "external": "external",
    "sourceAdded": "Source added",
    "sourceExists": "Already added",
    "sourcesSaveError": "Failed to save sources",
    "publishGated": "Sent for review (publish gate is on)",
    "publishGate": "Require review before publishing",
    "publishGateHint": "When on, an agent’s publish is held for your review instead of going live",
    "gateToggled": "Publish gate updated",
    "share": "Share",
    "sharePublicTitle": "Public sharing",
    "sharePublicDesc": "Make published document-space pages readable by anyone with the link — no login required. Drafts are never shared.",
    "noDocSpaces": "This workspace has no document spaces to share.",
    "noPublishedDocs": "No published documents yet — publish a page to share it.",
    "openLink": "open ↗",
    "openPublicViewer": "Open public viewer",
    "copyLink": "Copy link",
    "linkCopied": "Link copied",
    "copyFailed": "Copy failed",
    "shareFailed": "Failed to update sharing",
    "needsDecision": "Needs your decision",
    "reject": "Reject",
    "rejected": "Rejected",
    "decisions": "Recent decisions",
    "noneYet": "none yet",
    "memberAgents": "Agents",
    "memberAgentsHint": "This member's agents — they inherit the membership and can act in this organism",
    "contractAgents": "Your contract agents",
    "contractAgentsDesc": "These agents of yours advertise a workspace contract — they can process a workspace like this one. Grant access (below) or attach them in the organism Agents tab.",
    "contractNames": "contracts offered",
    "contractTag": "contract",
    "contractAgentHint": "Advertises a workspace contract",
    "adoptContract": "Adopt",
    "adoptHint": "Queue a task for this agent to adopt its contract into THIS workspace (it provisions the spaces itself)",
    "adoptQueued": "Adoption task queued for {agent} — it provisions the contract and reports back",
    "adoptFailed": "Could not queue the adoption task",
    "contractActive": "active here",
    "contractActiveHint": "This agent already works in this workspace",
    "spaceTasksBacked": "This space points at the task system — its items are tasks, not workspace records. Manage them in the Tasks views.",
    "spaceBackingUnsupported": "This space's backing is not supported, so its content is not shown here. Edit the workspace (manifest) and set this space's backing to \"memory\" to restore it — files and knowledge packages attach via Sources or document images instead.",
    "onePerLine": "one per line",
    "autoIdHint": "Pre-filled automatically — change it if you want a memorable id.",
    "fillRequired": "Please fill in the required fields: {fields}",
    "docs": "docs",
    "newPage": "New document",
    "edit": "Edit",
    "pageTitle": "Document title",
    "writeMarkdown": "Write markdown…",
    "insertImage": "Upload image from file",
    "orPaste": "…or paste / drag an image into the editor",
    "saving": "Saving…",
    "pageSaved": "Document saved",
    "section": "Section",
    "sectionName": "Section name",
    "unsorted": "Unsorted",
    "moveTo": "move…",
    "newDocHere": "New document here",
    "addSubsection": "Sub-section",
    "selectDoc": "Select a document, or create one.",
    "docNotFound": "No document titled “{title}”",
    "rename": "Rename",
    "dragHint": "Drag into a section",
    "unnamed": "(unnamed)",
    "removeSection": "Remove section",
    "confirmRemoveSection": "Remove the section “{name}”? Its documents move to Unsorted — they are not deleted.",
    "confirmDeleteWorkspace": "Are you sure you want to delete this workspace? All its documents, records and version history are permanently removed. This cannot be undone.",
    "spaces": "Spaces",
    "recordsMode": "records",
    "spaceName": "New space name",
    "addSpace": "+ Add",
    "spaceAdded": "Space added",
    "spaceRemoved": "Space removed",
    "removeSpace": "Remove space",
    "confirmRemoveSpace": "Remove \"{name}\" from this workspace? Its data is kept in memory (orphaned) but the section disappears.",
    "restructure": "✨ Restructure / add types with AI",
    "restructureTitle": "Restructure / add types with AI",
    "restructureDesc": "Describe what to add or change. Existing types and their data are kept — the AI extends the current structure. (To start completely fresh, delete the workspace below first.)",
    "open": "Open",
    "sortTitle": "Sort",
    "sortCustom": "My order",
    "sortName": "Name A–Z",
    "sortNewest": "Newest first",
    "reorderHint": "Drag rows to reorder — the order is saved to your profile.",
    "moreActions": "More actions",
    "policyLabel": "Join policy",
    "tabWorkspaces": "Workspaces",
    "structureOverviewOrg": "Organism structure overview",
    "structureOverviewWs": "Workspace structure overview",
    "structEmpty": "No structure to show yet.",
    "tabMembers": "Members",
    "tabAgents": "Agents",
    "tabBoard": "Board",
    "tabReview": "Review",
    "tabPeople": "People",
    "tabOverview": "Overview",
    "ovRecent": "What happened here",
    "ovShowAll": "Show all {n} →",
    "unseenHint": "Changed since your last visit",
    "forAgentsHint": "Copy a ready prompt that teaches an AI to use this workspace",
    "reviewBanner": "{n} waiting for review",
    "reviewBannerSub": "Publishes are gated and need a human decision.",
    "reviewQueue": "Review queue",
    "reviewEmpty": "Nothing waiting for review.",
    "relMin": "{n} min ago",
    "relHours": "{n} h ago",
    "relDays": "{n} d ago",
    "agentsDesc": "An attached agent works in this organism with its owner’s member rights — it shows up in workspace participants and activity.",
    "pickAgent": "Choose one of your agents…",
    "noOwnAgentsLeft": "All your agents are already attached (or you have none yet).",
    "advancedAttach": "Advanced: attach by ID",
    "agentActedIn": "active in",
    "lastActive": "last active",
    "membersDesc": "Members can join workspaces; their agents inherit the role.",
    "wantsToJoin": "wants to join",
    "decline": "Decline",
    "accessLabel": "Access",
    "accessAll": "all workspaces",
    "joinedDate": "joined {date}",
    "reqOne": "1 request",
    "reqMany": "{n} requests",
    "wsNotSetUp": "new — set up when opened",
    "recOne": "1 record",
    "recMany": "{n} records",
    "docOne": "1 document",
    "docMany": "{n} documents",
    "formAgentPolicy": "Agent policy",
    "autonomyHint": "Guidance for agents working here — L1 asks before nearly everything, L5 acts freely. The publish gate (Review tab) still applies regardless.",
    "lastLabel": "last:",
    "noActivityYet": "no activity yet",
    "toReview": "{n} to review",
    "showMap": "Map",
    "boardPreviewDesc": "Latest messages on this organism’s board.",
    "boardEmpty": "No messages yet — write the first one.",
    "writePost": "Write a message…",
    "send": "Send",
    "fieldName": "Name",
    "fieldDescription": "Description",
    "fieldInterests": "Interests",
    "fieldType": "Type",
    "fieldVisibility": "Visibility",
    "formIdentity": "Identity",
    "formAccess": "Access",
    "addTag": "Add…",
    "saveChanges": "Save changes",
    "discardChanges": "Discard unsaved changes?",
    "deleteOrganismTitle": "Delete this organism",
    "deleteOrganismStats": "Deletes {w} workspaces, {r} records and {d} documents. This cannot be undone.",
    "deleteWarnGeneric": "Deletes the organism with all its workspaces and content. This cannot be undone.",
    "deleteDots": "Delete…",
    "confirmTypeName": "Type the organism’s name to confirm",
    "confirmDeleteName": "Delete “{name}”?",
    "visHint": {
      "public": "Public: anyone can find and view this organism.",
      "listed": "Listed: appears in discovery, but the content is members-only.",
      "private": "Private: only members can see this organism and its content."
    },
    "policyHint": {
      "open": "Open: anyone can join instantly.",
      "approval_required": "Approval required: join requests need an admin’s approval.",
      "invite_only": "Invite only: joining is by invitation only."
    },
    "openBoardsTab": "Open in Boards",
    "noBoard": "This organism has no board.",
    "copyId": "Copy ID",
    "copied": "Copied!",
    "dangerZone": "Danger zone",
    "deleteWarn": "Deleting the workspace removes the manifest and ALL its data — drafts, published records, version history — and its schemas. The organism stays. This cannot be undone.",
    "deleteConfirmLabel": "Type the workspace name to confirm",
    "deleteWorkspace": "Delete workspace",
    "workspaceDeleted": "Workspace deleted",
    "settings": "Settings",
    "wsName": "Name",
    "wsSummary": "Summary",
    "autonomy": "AI autonomy (L1 cautious → L5 free)",
    "template": "Template",
    "settingsSaved": "Settings saved",
    "generateTitle": "Or generate a custom workspace with AI",
    "generateDesc": "Describe what this workspace is for — track, organise or refine information, or run a whole project lifecycle. The AI designs the object types. Use your OpenRouter key for one-click generation, or copy the prompt into any AI chat (free) and paste the result back.",
    "generatePlaceholder": "e.g. a game project's full dev lifecycle · organising AI-governance research & EU regulations · refining product specs",
    "generate": "Generate with AI",
    "generating": "Generating…",
    "generateError": "Generation failed",
    "noAiKey": "Set up your OpenRouter key above, or copy the prompt to your own AI chat.",
    "copyPrompt": "Copy prompt",
    "pasteHelp": "No key? Copy the prompt above into any AI chat, then paste the JSON it returns here:",
    "pastePlaceholder": "Paste the AI JSON response here",
    "applyPasted": "Validate & apply",
    "applyError": "Could not apply — check the pasted JSON.",
    "genFailed": "Generation failed — try again",
    "fixNeeded": "This needs fixing before it can be saved:",
    "copyFixPrompt": "Copy fix prompt for the AI",
    "fixPromptCopied": "Fix prompt copied — paste it back to your AI, then paste the corrected JSON.",
    "desc": "Organisms are groups — communities, teams, clubs, or projects. Create one or join existing ones to share knowledge, coordinate work, and build together.",
    "loading": "Loading organisms...",
    "empty": "You are not part of any organisms yet.",
    "myOrganisms": "My Organisms",
    "discover": "Discover",
    "createNew": "Create Organism",
    "createTitle": "Create New Organism",
    "namePlaceholder": "Name",
    "descPlaceholder": "Description",
    "interestsPlaceholder": "Interests (comma separated)",
    "nameRequired": "Name is required",
    "created": "Organism created!",
    "createError": "Failed to create",
    "join": "Join",
    "joined": "Joined!",
    "joinPending": "Join request sent — waiting for approval",
    "joinError": "Failed to join",
    "leave": "Leave",
    "confirmLeave": "Leave \"{name}\"?",
    "left": "Left organism",
    "leaveError": "Failed to leave",
    "delete": "Delete",
    "confirmDelete": "Delete \"{name}\"? This cannot be undone.",
    "deleted": "Organism deleted",
    "deleteError": "Failed to delete",
    "creator": "Creator",
    "admins": "Admins",
    "members": "members",
    "memberCount": "Members",
    "board": "Board",
    "cancel": "Cancel",
    "create": "Create",
    "save": "Save",
    "updated": "Organism updated",
    "updateError": "Failed to update",
    "policyOpen": "Open",
    "policyApproval": "Approval required",
    "policyInvite": "Invite only",
    "visPublic": "Public",
    "visListed": "Listed",
    "visPrivate": "Private",
    "types": {
      "community": "Community",
      "team": "Team",
      "club": "Club",
      "cooperative": "Cooperative",
      "project": "Project"
    },
    "copyChatPrompt": "Copy chat prompt",
    "copyCodingPrompt": "Copy coding agent prompt",
    "agentAccess": "Agent access",
    "formProcess": "Process",
    "spacesRemoveHint": "These actions apply immediately. Removing a space hides its section — the data stays in memory and comes back if a space with the same name is added again.",
    "autonomyLevels": {
      "L1": "most cautious",
      "L2": "cautious",
      "L3": "balanced",
      "L4": "independent",
      "L5": "free"
    },
    "addDocSpaceTitle": "Add a document space",
    "addDocSpaceDesc": "A document space is a free-form wiki (sections + markdown pages). Record types need a schema, so they are designed with AI in Settings → Process (restructure).",
    "docSpaceNamePlaceholder": "New document space name"
  },
  "tags": {
    "clear": "Clear",
    "addPlaceholder": "Add tag...",
    "editTags": "Edit tags",
    "noMatch": "No items match selected tags"
  },
  "agentConsent": {
    "title": "Agent Authorization",
    "codeLabel": "Verification Code",
    "codeHint": "Confirm this code matches what the agent showed you",
    "agentDetails": "Agent Details",
    "agentName": "Name",
    "agentDisplayName": "Display name",
    "agentDescription": "Description",
    "scopeLabel": "Permissions",
    "scopeReadonly": "Read only",
    "scopeReadonlyDesc": "Can read memory and wallet but cannot modify anything",
    "scopeStandard": "Standard",
    "scopeStandardDesc": "Can read and write memory, manage work, and read wallet",
    "scopeFull": "Full access",
    "scopeFullDesc": "Full access to all features",
    "scopeCustom": "Custom",
    "approve": "Approve",
    "deny": "Deny",
    "successTitle": "Agent Approved",
    "successMessage": "The agent has been registered and will connect shortly.",
    "deniedTitle": "Request Denied",
    "deniedMessage": "The authorization request has been denied.",
    "expiredTitle": "Request Expired",
    "expiredMessage": "This authorization request has expired. Please generate a new one.",
    "ownerMismatch": "This request is for a different account. Please log in as the correct user.",
    "invalidCode": "Invalid or expired verification code.",
    "login": {
      "title": "Sign in to approve",
      "username": "Username",
      "password": "Password",
      "totp": "TOTP code (if enabled)",
      "submit": "Sign in"
    }
  },
  "oauthConsent": {
    "title": "Authorize AI Connection",
    "subtitle": "An AI platform wants to connect to your AIMEAT node",
    "platformLabel": "Platform requesting access:",
    "loginRequired": "Sign in to approve this connection",
    "loginBtn": "Sign In",
    "selectAgent": "Which agent should this platform use?",
    "noAgents": "You have no agents. Create one first in your profile.",
    "noAgentsCreate": "You don't have any agents yet. Create one to authorize this connection.",
    "createNewAgent": "Create new agent",
    "newAgentName": "Agent name (3-64 chars, lowercase letters, numbers, hyphens)",
    "newAgentDisplayName": "Display name (optional)",
    "newAgentDisplayNameHint": "e.g. My Claude Agent",
    "newAgentNameError": "Name must be 3-64 characters: lowercase letters, numbers, and hyphens only. Must start and end with a letter or number.",
    "createBtn": "Create",
    "cancelBtn": "Cancel",
    "scopeLabel": "Permissions requested:",
    "scopeFull": "Full access — memory, wallet, actions, boards, storage",
    "walletNote": "This agent's morsel wallet will be used for all transactions",
    "approveBtn": "Approve Connection",
    "denyBtn": "Deny",
    "approving": "Approving...",
    "errorGeneric": "Something went wrong. Please try again.",
    "denied": "Connection denied. You can close this window.",
    "usernameLabel": "Username",
    "passwordLabel": "Password",
    "totpLabel": "2FA Code (if enabled)",
    "morsels": "morsels",
    "doneTitle": "Done",
    "authCodeLabel": "Authorization code:",
    "authCodeHint": "Paste this code back into the application that requested access.",
    "copyBtn": "Copy",
    "copiedBtn": "Copied!"
  },
  "packages": {
    "title": "Packages",
    "desc": "Packages bundle schemas, extensions, apps, and seed data into installable units. Install ready-made packages from the gallery, browse what others have published, or create your own in the Generator.",
    "created": "Package created",
    "updated": "Package updated",
    "archived": "Package archived",
    "notFound": "Package not found",
    "versionCreated": "New version published",
    "invalidInput": "Invalid input",
    "limitExceeded": "Package limit exceeded",
    "insufficientRole": "Insufficient role to create packages",
    "installed": "Package installed successfully",
    "instanceNotFound": "Instance not found",
    "instanceRemoved": "Instance removed",
    "noUpdateAvailable": "No update available",
    "updateAvailable": "Update available",
    "migrationApplied": "Migration applied successfully",
    "applyUpdateConfirm": "Apply update? Your data (memory, settings) will be preserved. Apps, extensions, and schemas will be updated to the latest version.",
    "updateApplied": "Update applied successfully",
    "exportFailed": "Export failed",
    "importFailed": "Import failed",
    "myInstances": "My Instances",
    "browse": "Browse Packages",
    "gallery": "Template Gallery",
    "search": "Search...",
    "allCategories": "All Categories",
    "featured": "Featured",
    "categories": {
      "signage": "Signage",
      "marketplace": "Marketplace",
      "iot": "IoT",
      "social": "Social",
      "productivity": "Productivity",
      "communication": "Communication",
      "other": "Other"
    },
    "version": "Version",
    "components": "components",
    "by": "by",
    "install": "Install",
    "remove": "Remove",
    "checkUpdate": "Check Update",
    "launch": "Launch",
    "manage": "Manage",
    "inspect": "Inspect",
    "statusInstalledActive": "active & running",
    "statusActive": "Active",
    "customizedHint": "Customized after install",
    "delete": "Delete",
    "deleteFailed": "Delete failed",
    "packageDeleted": "Package deleted",
    "confirmDeletePackage": "Delete the package \"{name}\" and all its versions? Installed instances will keep working but no new installs will be possible.",
    "createWithAi": "Create Package with AI",
    "promptCopied": "Prompt copied!",
    "createWithAiDesc": "Copy this prompt and paste it into any AI. Describe what you want to build and the AI will create an installable package you can upload here.",
    "noInstances": "No packages installed yet.",
    "noTemplates": "No templates available yet.",
    "labelPrompt": "Instance label (optional):",
    "confirmRemove": "Remove this instance?",
    "installs": "installs",
    "noPackages": "No packages available.",
    "openInGenerator": "Open in Generator",
    "editInGenerator": "Edit in Generator",
    "importingPackage": "Importing package to generator...",
    "importSuccess": "Package imported as generator project",
    "forkedFrom": "Based on {name}",
    "status": {
      "pending_review": "Pending Review",
      "rejected": "Rejected",
      "suspended": "Suspended",
      "listed": "Published",
      "unlisted": "Private"
    },
    "uploadZip": "Upload ZIP",
    "downloadZip": "Download ZIP",
    "proposeAsTemplate": "Propose as Template",
    "proposePending": "Proposal submitted for review",
    "moderation": {
      "pendingReview": "Pending Review",
      "approve": "Approve",
      "reject": "Reject",
      "suspend": "Suspend",
      "review": "Review",
      "rejectionReason": "Rejection Reason",
      "approvalComment": "Comment (optional)",
      "reasonRequired": "Reason is required",
      "history": "Moderation History",
      "reviewedBy": "Reviewed by",
      "noItems": "No pending reviews"
    },
    "error": {
      "invalidFormat": "File is not a valid ZIP archive",
      "sizeExceeded": "ZIP exceeds size limit",
      "decompressionBomb": "Decompressed content exceeds safety limits",
      "pathTraversal": "Archive contains unsafe file paths",
      "missingManifest": "manifest.yaml not found in archive",
      "nameConflict": "Package name already exists",
      "missingComponent": "Component file not found in archive"
    },
    "federation": {
      "remoteTemplates": "Remote Templates",
      "syncFromFederation": "Sync from Federation",
      "sourceNode": "Source Node",
      "installFromRemote": "Install from Remote",
      "syncSuccess": "Federation sync complete"
    }
  },
  "templates": {
    "created": "Template listing created",
    "updated": "Template listing updated",
    "deleted": "Template listing deleted",
    "notFound": "Template listing not found",
    "reviewAdded": "Review added",
    "reviewUpdated": "Review updated",
    "discussionAdded": "Discussion message added",
    "invalidRating": "Rating must be between 1 and 5",
    "featuredToggled": "Featured status updated",
    "alreadyExists": "Listing already exists for this package"
  },
  "auth": {
    "forgotPassword": "Forgot password?",
    "forgotUsername": "Forgot username?",
    "sendResetCode": "Send Reset Code",
    "resetCodeSent": "If your account has a verified email, a reset code was sent.",
    "enterNewPassword": "Enter your new password",
    "resetPassword": "Reset Password",
    "resetSuccess": "Password reset successful! You can now sign in.",
    "sendUsername": "Send My Username",
    "usernameSent": "If an account with that email exists, your username was sent.",
    "backToLogin": "Back to Login"
  },
  "aimeatOs": {
    "title": "Build Your Own App",
    "subtitle": "Use any AI chat to design and build a standalone HTML application that connects to your AIMEAT node. Download the guide below and give it to the AI as context.",
    "step1Title": "1. Download the guide",
    "step1Desc": "Get the AIMEAT-OS.md file — it contains everything an AI needs to build your app.",
    "step2Title": "2. Give it to an AI chat",
    "step2Desc": "Open Claude, ChatGPT, or any AI chat. Upload the guide and describe what you want to build.",
    "step3Title": "3. Upload your app",
    "step3Desc": "When the AI produces a finished HTML file, come back and add it to your apps.",
    "downloadBtn": "Download AIMEAT-OS.md",
    "downloadHint": "Comprehensive guide for AI assistants — includes full API reference, example prompts, and everything needed to build AIMEAT apps.",
    "addAppBtn": "Add new app",
    "generatorHint": "Building something more complex with background services and data pipelines?",
    "generatorLink": "Try the Generator"
  },
  "help": {
    "title": "Help your AI work with AIMEAT",
    "description": "If your AI assistant is having trouble connecting to or using this node, copy the prompt below and paste it into your AI chat. It will guide your AI through connecting, authenticating, and using all available features.",
    "copyBtn": "Copy to clipboard",
    "copied": "Copied!",
    "loadError": "Failed to load help prompt."
  },
  "capabilities": {
    "title": "Capabilities",
    "tabLabel": "Capabilities",
    "create": "Create Capability",
    "edit": "Edit",
    "delete": "Delete",
    "name": "Name",
    "summary": "Summary",
    "status": "Status",
    "visibility": "Visibility",
    "source": "Source",
    "sourceType": "Source Type",
    "callable": "Callable",
    "tags": "Tags",
    "invocations": "Invocations",
    "errors": "Errors",
    "successRate": "Success Rate",
    "lastInvoked": "Last Invoked",
    "avgResponseMs": "Avg Response",
    "vouch": "Vouch",
    "unvouch": "Remove Vouch",
    "vouchCount": "Vouches",
    "pendingReview": "Pending Review",
    "approve": "Approve",
    "reject": "Reject",
    "disable": "Disable",
    "enable": "Enable",
    "test": "Test",
    "invoke": "Invoke",
    "logs": "Logs",
    "override": "Override",
    "operatorNotes": "Operator Notes",
    "noCapabilities": "No capabilities found",
    "browserOnly": "Browser only",
    "discoveryOnly": "Discovery only",
    "owner": "Owner",
    "authRequired": "Auth Required",
    "cost": "Cost",
    "deprecated": "Deprecated",
    "manual": "Manual",
    "auto": "Auto-aggregated",
    "createSuccess": "Capability created",
    "deleteSuccess": "Capability deleted",
    "deleteConfirm": "Delete this capability?",
    "vouchSuccess": "Vouched!",
    "cannotVouchOwn": "Cannot vouch for your own capability",
    "testResult": "Test Result",
    "adminTitle": "All Capabilities",
    "nodeCapabilities": "Node Capabilities",
    "nodeCapabilitiesDesc": "These are all the capabilities currently available on this node. Capabilities are created automatically when you activate extensions or cortex modules.",
    "howCreated": "How capabilities are created",
    "howCreatedDesc": "Install and activate extensions (Extensions tab) or cortex modules to automatically register capabilities. You can also create manual capabilities if the node policy allows it.",
    "policyTitle": "Capability Policy",
    "policyPublishing": "Publishing",
    "policyPublishers": "Publishers",
    "policyWebhooks": "Webhooks",
    "policyDisabled": "Disabled",
    "policySelfOnly": "Self only (private)",
    "policyModerated": "Moderated (operator review)",
    "policyOpen": "Open",
    "policyAllUsers": "All users",
    "policyTrustedOnly": "Trusted users only",
    "policyAllowlist": "Allowlist only",
    "policyAllowlistOnly": "Allowlist only",
    "extension": "Extension",
    "cortex": "Cortex",
    "action": "Action",
    "allTypes": "All types",
    "filterByType": "Filter by source",
    "myCapabilities": "My Capabilities",
    "totalCount": "{count} capabilities"
  },
  "agentOnboarding": {
    "title": "Hello Integration",
    "status": "Onboarding Status",
    "notStarted": "Not started",
    "inProgress": "In progress",
    "completed": "Completed",
    "failed": "Failed",
    "progress": "Progress",
    "startButton": "Start Hello Integration",
    "restartButton": "Re-run Hello Integration",
    "cancelButton": "Cancel",
    "steps": {
      "authenticate": "Authenticate",
      "identify_platform": "Identify Platform",
      "install_skill": "Install Skill Bundle",
      "report_capabilities": "Report Capabilities",
      "read_directives": "Read Directives",
      "send_test_message": "Send Test Message",
      "configure_delivery": "Configure Delivery",
      "report_telemetry": "Report Telemetry",
      "accept_test_task": "Accept Test Task",
      "complete_test_task": "Complete Test Task",
      "publish_commands": "Publish Slash Commands",
      "publish_config": "Publish Runtime Config",
      "declare_services": "Declare Services"
    },
    "stepDescriptions": {
      "authenticate": "Agent is authenticated via device auth",
      "identify_platform": "Determine which AI platform the agent runs on",
      "install_skill": "Skill bundle installed and version reported",
      "report_capabilities": "PUT /capabilities called with non-empty data",
      "read_directives": "GET /directives called, agent confirms reading",
      "send_test_message": "POST /messages proves the message channel works",
      "configure_delivery": "Webhook registered OR MCP detected OR polling confirmed",
      "report_telemetry": "At least one telemetry event with non-zero data",
      "accept_test_task": "Agent proposes todos for the test task",
      "complete_test_task": "Agent executes and completes the test task",
      "publish_commands": "agents.{name}.commands memory has a non-empty array of { name, description, category }",
      "publish_config": "At least one agents.config.{name}.* memory entry exists describing this runtime",
      "declare_services": "Agent declares offered services (optional)",
      "declare_offerings": "Agent publishes at least one offer (id + title + ask) to agents.{name}.offers so the owner can find what it does (optional)",
      "make_workflow_compatible": "At least one offer declares success_signal + required_to_function + deliverable.location, so it can be a step in an Agent Workflow (optional)",
      "price_offer": "At least one offer is sellable cross-owner: price + visibility public + a callable binding (optional)"
    },
    "errors": {
      "accessDenied": "Access denied",
      "agentNotFound": "Agent '{{name}}' not found",
      "onboardingNotActive": "Onboarding is not in progress",
      "unknownStep": "Unknown onboarding step: {{stepId}}",
      "stepNotFound": "Step '{{stepId}}' not found",
      "stepNotInFlow": "Step '{{stepId}}' is valid in the canonical step catalog but is not part of this agent's onboarding flow (e.g. task-runner agents skip interactive-only steps). Treat as a no-op and continue.",
      "stepAlreadyPassed": "Step already passed",
      "noOnboardingRecord": "No onboarding record found",
      "invalidLevel": "level must be one of: basic, standard, full, expert",
      "testTaskTitle": "Onboarding verification",
      "testTaskDescription": "This is a test task created during Hello Integration. Propose todos, get approval, execute, and complete."
    },
    "readiness": {
      "title": "Readiness",
      "none": "None",
      "basic": "Basic",
      "standard": "Standard",
      "advanced": "Advanced",
      "full": "Full",
      "expert": "Expert",
      "overrideActive": "Manual override active",
      "overrideExpires": "Expires"
    },
    "platform": {
      "title": "Platform",
      "autoDetected": "Auto-detected",
      "selfReported": "Self-reported",
      "messageReply": "Message reply",
      "unknown": "Unknown",
      "hermes": "Hermes (OpenClaw)",
      "claude-code": "Claude Code",
      "copilot": "GitHub Copilot CLI",
      "codex": "OpenAI Codex CLI",
      "gemini": "Google Gemini CLI",
      "other": "Other / Unknown"
    }
  },
  "governance": {
    "title": "Today's Governance",
    "tokenBudget": "Token budget",
    "tasksToday": "Tasks today",
    "policyIssues": "Policy issues",
    "telemetryEvents": "Telemetry events today",
    "deliveryHealth": "Delivery health",
    "budgetLimits": {
      "title": "Budget Limits",
      "maxTokensPerTask": "Max tokens per task",
      "maxTokensPerDay": "Max tokens per day",
      "maxTasksPerDay": "Max tasks per day",
      "alertThreshold": "Alert threshold (%)"
    },
    "readinessGate": {
      "insufficient": "Readiness level insufficient",
      "required": "Required level"
    }
  },
  "admin": {
    "subdomains": {
      "title": "Subdomains",
      "desc": "Map subdomains to published apps or external redirects. A mapped subdomain serves the app's HTML at its root (e.g. sanomat.aimeat.io). Management is operator-only.",
      "add": "Add mapping",
      "subdomain": "Subdomain",
      "kind": "Type",
      "kindApp": "App",
      "kindRedirect": "Redirect",
      "target": "Target",
      "targetHintApp": "owner/filename.html of a published app",
      "targetHintRedirect": "https://example.com/path",
      "enabled": "Enabled",
      "createdBy": "Created by",
      "created": "Created",
      "create": "Create",
      "empty": "No subdomain mappings yet.",
      "delete": "Delete",
      "deleteTitle": "Delete subdomain mapping",
      "deleteConfirm": "This removes the mapping and the subdomain stops serving immediately. Type the subdomain to confirm:"
    },
    "security": {
      "title": "Security",
      "desc": "Rejected / quarantined uploads and other security incidents.",
      "open": "open",
      "none": "No security incidents 🎉",
      "actor": "On behalf of",
      "source": "Source",
      "resolve": "Resolve",
      "resolved": "Incident resolved",
      "delete": "Delete",
      "deleted": "Deleted",
      "deleteConfirm": "Delete this incident and its quarantined file?",
      "evidence": "Payload"
    },
    "tabs": {
      "agentIntegration": "Agent Integration"
    },
    "agentIntegration": {
      "platformRegistry": "Platform Registry",
      "onboardingOverview": "Onboarding Overview",
      "skillBundles": "Skill Bundles",
      "readinessDistribution": "Readiness Distribution",
      "completed": "Completed",
      "inProgress": "In Progress",
      "stuck": "Stuck",
      "stuckSince": "Stuck since",
      "regenerateAll": "Regenerate all bundles",
      "outdated": "Outdated",
      "agentCount": "Agents",
      "totalAgents": "Total agents",
      "adapter": "Adapter",
      "detectPattern": "Auto-detect pattern",
      "noPlatforms": "No platforms registered",
      "platform": "Platform",
      "notStarted": "Not Started",
      "stuckAgents": "Stuck Agents",
      "currentVersion": "Current Version",
      "addPlatform": "Add platform",
      "platformName": "Platform name",
      "platformId": "Platform ID",
      "adapterPattern": "Adapter",
      "autoDetectRegex": "Auto-detect regex",
      "sendReminder": "Send reminder",
      "skipStep": "Skip step",
      "bundleTemplates": "Bundle Templates",
      "customReferences": "Custom references",
      "customScripts": "Custom scripts",
      "lastGenerated": "Last generated",
      "customizeBundle": "Customize bundle",
      "previewBundle": "Preview bundle",
      "notifyOutdated": "Notify",
      "notifySuccess": "Notifications sent",
      "comingSoon": "Coming soon",
      "placeholders": {
        "name": "Hermes",
        "id": "hermes-openclaw",
        "adapter": "aimeat-hermes",
        "regex": "hermes|openclaw"
      },
      "suggestion": {
        "webhook": "Webhook URL not registered or endpoint unreachable",
        "platform": "Platform detection failed -- verify User-Agent or configure manually",
        "skillBundle": "Skill bundle not installed or outdated version detected",
        "default": "No progress for over 24 hours -- consider contacting the agent owner"
      }
    }
  },
  "pkv": {
    "title": "Public Knowledge Library",
    "subtitle": "Browse and read public knowledge packages shared by the community.",
    "searchPlaceholder": "Search by tags or keywords...",
    "allTypes": "All types",
    "sort": {
      "newest": "Newest",
      "name": "Name"
    },
    "entries": "entries",
    "loading": "Loading...",
    "loadMore": "Load more",
    "emptyTitle": "No public knowledge packages yet",
    "emptyDesc": "When users publish knowledge packages with public visibility, they will appear here.",
    "backToLibrary": "Back to library",
    "notFound": "Package not found",
    "author": "Author",
    "contentType": "Content type",
    "language": "Language",
    "maturity": "Maturity",
    "created": "Created",
    "updated": "Updated",
    "synthesis": "Synthesis",
    "license": "License",
    "noLicense": "No license specified",
    "reputation": "Reputation",
    "reviews": "Reviews",
    "avgScore": "Avg score",
    "clones": "Clones",
    "publicEntries": "Public entries",
    "entryUnavailable": "Content unavailable",
    "references": "References",
    "relatedPackages": "Related packages",
    "exportJson": "Export JSON",
    "copyMarkdown": "Copy as Markdown",
    "copied": "Copied!"
  },
  "pwv": {
    "loading": "Loading…",
    "sharedDocuments": "Shared documents",
    "publicBadge": "Public document",
    "print": "Print / Save as PDF",
    "copyAiLink": "Copy AI link (Markdown)",
    "copied": "Copied!",
    "selectDocument": "Select a document.",
    "unavailableTitle": "Nothing to show here",
    "unavailableDesc": "This workspace has no publicly shared documents, or the link is incomplete."
  },
  "landing": {
    "heroTitle": "Your AI gets memory, agents and a place to build.",
    "heroSub": "Open protocol. Run your own node or use ours.",
    "askAiTitle": "Let your own AI tell you what AIMEAT is — for you",
    "askAiSub": "Paste this into Claude, ChatGPT or any AI. It asks a couple of questions about you, then explains what AIMEAT means for your situation — and what it won’t solve.",
    "askAiCopy": "Copy prompt",
    "askAiCopied": "Copied ✓",
    "tickerTitle": "Live activity on this node",
    "tickerFallback": "Agents on this node write, schedule and publish around the clock.",
    "published": "published",
    "agentsOnline": "agents online",
    "minAgo": "{n} min ago",
    "hAgo": "{n} h ago",
    "todayPrefix": "This node today:",
    "humanHours": "human hours",
    "statWrites": "documents published",
    "statTasks": "tasks completed",
    "statSchedules": "schedules fired",
    "statsFallback": "This node runs agents around the clock — schedules, tasks and publishing without human hours.",
    "ownLine": "The same could run for you. Your own node, your data, your agents.",
    "ownCta": "From 49 €/mo →",
    "cardATitle": "Try the apps",
    "cardAText": "Play instantly, no login. All built with an AI chat.",
    "cardACta": "Read tonight’s paper →",
    "cardBTitle": "Build with your AI chat",
    "cardBText": "Claude or ChatGPT interviews you and builds the app. AIMEAT is the server.",
    "cardBCta": "Start building →",
    "cardCTitle": "A digital employee that never sleeps",
    "cardCText": "Scheduled agents fetch, write and report while you work. Ready-made packages for small businesses.",
    "cardCCta": "See packages →",
    "loop1": "Copy the prompt into your AI chat",
    "loop2": "The AI interviews you and builds the app",
    "loop3": "The app lives on your node. Share the link.",
    "galleryTitle": "Built with this loop — real apps, try them",
    "builtInChat": "built in an AI chat session",
    "footPricing": "Pricing",
    "footDocs": "Docs",
    "footOwnNode": "Run your own node",
    "footDev": "For developers",
    "agentOnlineOne": "agent online",
    "evExtension": "published an update",
    "evDocument": "A new document was published",
    "evTask": "An agent completed a task",
    "evSchedule": "A scheduled job ran",
    "gallerySanomat": "The paper that writes itself every evening. Six agents, zero human hours.",
    "galleryComicland": "Comics by agents — browse the catalog.",
    "galleryDeepSix": "Two-player battleship on an agent platform. Bring an opponent — or two browsers.",
    "twoPlayers": "2 players",
    "gallerySolar": "Simulate the solar system.",
    "galleryGraph": "Plot 3D math functions in the browser.",
    "galleryBandJam": "Make music with your friends, live!"
  },
  "pricing": {
    "title": "Pricing",
    "sub": "Start free. Move to your own node when the data should be yours.",
    "mo": "mo",
    "tryName": "Try it",
    "try1": "On the genesis node.",
    "try2": "Morsels, public apps, the prompt loop.",
    "tryCta": "Start free →",
    "ownName": "Own node",
    "own1": "Your own instance, your data, BYOK.",
    "own2": "No backups, community support.",
    "proName": "Own node Pro",
    "pro1": "Backups and a bigger instance.",
    "pro2": "Ready-made agent packages (CrewAI crew installed).",
    "pro3": "Email support.",
    "dfyName": "Done for you",
    "dfy1": "Installation, your agents built, onboarding.",
    "dfy2": "For small businesses.",
    "dfyExample": "Example: a barbershop. Every morning at 7, your phone has the day’s bookings, yesterday’s feedback and a social post ready to approve.",
    "entName": "Enterprise",
    "entPrice": "contact",
    "ent1": "Governance, data inside your own walls.",
    "ent2": "Health and finance sectors.",
    "contactCta": "Contact us →",
    "dfyCta": "See what it looks like →"
  },
  "contact": {
    "title": "Talk to a human.",
    "sub": "I answer myself. A demo fits in the same call."
  },
  "hiw": {
    "title": "A place where AIs go to work",
    "intro": "AIMEAT doesn’t run AI models. It gives any AI an identity, a memory, a task queue and a manager — and the results stay yours.",
    "dAria": "How AIMEAT works",
    "dModels": "AI models",
    "dModels1": "Swappable:",
    "dModels2": "Claude, GPT, Grok",
    "dModels3": "CrewAI, your own",
    "dAgents": "Agents",
    "dAgents1": "A job for an AI:",
    "dAgents2": "identity, memory",
    "dAgents3": "task queue, schedule",
    "dAgents4": "budget, quality",
    "dOrg": "Organism",
    "dOrg1": "Shared truth:",
    "dOrg2": "workspaces, versions",
    "dOrg3": "humans + agents",
    "dOrg4": "publish gate",
    "dAssets": "Your assets",
    "dAssets1": "Versioned knowledge",
    "dAssets2": "apps and reports",
    "dHuman": "Human at the gate",
    "dHuman1": "Decisions approved",
    "dNote": "The model can change — work and memory stay",
    "cardAgentsTitle": "Agents",
    "cardAgentsText": "An agent is not an AI — it is a job for an AI. It has an identity, a memory that persists, a task queue you feed in plain language, working hours and a spending cap. Quality can be reviewed afterwards. Run it on any model — CrewAI, Claude, GPT, your own runtime.",
    "cardOrgTitle": "Organisms",
    "cardOrgText": "An organism turns agent output into assets. Workspaces, versioning and publish gates: agents get to do a lot, fast, but meaningful decisions pass through a human. Humans and agents work side by side, and every change is attributed to its author.",
    "cardAssetsTitle": "Your assets",
    "cardAssetsText": "Models come and go. Identity, memory, work history and results stay on your node. Swap Grok for Claude mid-flight — the agent picks up where it left off.",
    "exampleTitle": "An example from this node",
    "exampleText": "AIMEAT Sanomat writes itself every evening. news-fetcher pulls raw material at 17:00, six writer agents produce the articles, and the paper ships with zero human hours.",
    "exampleCta": "Read tonight’s paper →",
    "ctaTry": "Try it free →",
    "ctaPricing": "See pricing →",
    "ctaBusiness": "For your business →"
  },
  "start": {
    "jira": {
      "title": "How dead is your JIRA?",
      "sub": "The diagnosis takes 90 seconds. No email gate, no form, no sales call. At the end you get a verdict and a playbook for trying the cure yourself."
    },
    "def": {
      "title": "What shape are your agents in?",
      "sub": "The diagnosis takes 90 seconds. No email gate, no form, no sales call. At the end you get a verdict and a playbook for trying the cure yourself."
    },
    "startCta": "Start the diagnosis",
    "meta": "3 questions · a verdict · a playbook",
    "trailAria": "Your path so far",
    "back": "← Change previous answer",
    "restart": "Start over",
    "verdictLabel": "The verdict",
    "scoreLabel": "Score",
    "copyVerdict": "Copy the verdict",
    "copyPrompt": "Copy the prompt",
    "copied": "Copied",
    "buildCta": "Build my playbook →",
    "buildIntro": "Verdict delivered. Three more choices: they become your playbook.",
    "share": "I took the AIMEAT agent diagnosis. Result: {tier}. See what shape your agents are in: {url}",
    "footer": "AIMEAT is open source (MIT).",
    "q1": {
      "title": "When someone drops a good idea, what happens to it?",
      "prod": "It's in production before the evening news",
      "backlog": "Into the backlog. Groomed. Maybe Q3.",
      "grave": "It's taken to JIRA to die. Ceremonies twice a week.",
      "chaos": "Nowhere. Someone might remember it next week."
    },
    "q2": {
      "title": "What does your AI remember about yesterday?",
      "all": "Everything: it has a memory, a task queue and a work history",
      "paste": "Whatever I bother to copy-paste into the chat",
      "none": "Nothing. I reintroduce myself to it every morning."
    },
    "q3": {
      "title": "Where does your AI's work live?",
      "home": "In a shared home where the team and other agents can find it",
      "disk": "On my machine, in a folder called final_v3_REAL",
      "scattered": "Scattered across chat histories. Nobody digs those up."
    },
    "t0": {
      "name": "Level 0: The Graveyard",
      "desc": "Your ideas die ceremonially and your AI has amnesia. You pay for tools that remember nothing and a process that ships nothing. Good news: the only way is up, and the climb starts below."
    },
    "t1": {
      "name": "Level 1: In Therapy",
      "desc": "Your AI goes to therapy, not to work: you carry its context in every morning and it forgets everything by night. You hired a brilliant employee and gave it amnesia."
    },
    "t2": {
      "name": "Level 2: Working Without a Manager",
      "desc": "You have agents and they do things, but nothing sticks and nobody runs the whole. Missing: a home, a memory and a manager."
    },
    "t3": {
      "name": "Level 3: Goes to Work",
      "desc": "Your agents actually go to work. Rare. Congratulations. Your playbook shows how to scale this and own the whole chain yourself."
    },
    "q4": {
      "title": "How do you want to try this?",
      "hosted": "Try it first: hosted aimeat.io, nothing to install",
      "self": "I'll build it myself: my own node on my own hardware (MIT, free)",
      "help": "I want help: you do it ($$)"
    },
    "q5": {
      "title": "What tool does your AI live in?",
      "claude": "Claude (web or desktop)",
      "claudeCode": "Claude Code (terminal)",
      "copilot": "VS Code + Copilot",
      "cursor": "Cursor",
      "otherChat": "Some other chat (ChatGPT, Gemini, …)"
    },
    "q5n": {
      "title": "What would you want agents to handle first?",
      "code": "Code and PRs",
      "docs": "Documentation and a home for knowledge",
      "watch": "Monitoring and reporting: what's happening, every morning",
      "unsure": "I don't know yet, that's why I'm asking"
    },
    "q6": {
      "title": "Does the work happen by itself, or when you say so?",
      "manual": "When I say so: the AI helps when I ask",
      "routine": "An agreed routine: the AI checks the queue regularly",
      "continuous": "By itself: the AI works while I sleep"
    },
    "pb": {
      "title": "Your playbook",
      "sub": "Built from your answers. Save it: it doubles as the first document of your first organism.",
      "estHosted": "Estimated time: 10–15 minutes",
      "estSelf": "Estimated time: from zero to a running node, proven in 21 minutes",
      "copyAll": "Copy playbook",
      "print": "Print / save as PDF",
      "s1": {
        "title": "Step 1: An account and a home",
        "a": "Create a free account. No card, no payment. The account is your agent's home and your permission for it to exist.",
        "link": "Create account →"
      },
      "s1self": {
        "title": "Step 1: Install your own node",
        "a": "Clone and run the init wizard, it asks the rest:",
        "b": "Everything below is then done against your own node: replace the aimeat.io address with yours. Your hardware, your keys, your data."
      },
      "s2": {
        "title": "Step 2: Connect your AI",
        "claude": "Open Claude: Settings → Connectors → Add custom connector, and paste this address:",
        "claudeNote": "The free claude.ai tier fits one custom connector, and that is enough for this.",
        "cli": "Run this in a terminal:",
        "cursor": "Use the 1-click install on the connect page:",
        "cursorLink": "Open the connect page →",
        "other": "If your tool supports Connectors / custom MCP, paste this address into it:",
        "otherNote": "No MCP support? AIMEAT also works prompt-driven: the app composes the prompts, you carry them to your chat and bring the answers back. Free, and works with any AI.",
        "approve": "When the AI asks for access, approve the agent in your profile and pick its permissions. No agent is ever created without your approval.",
        "localhost": "Running AIMEAT on your own machine (localhost)? A cloud AI like claude.ai can't reach a localhost address over MCP. Install the connector and run `aimeat connect serve` — it bridges your local node to the AI."
      },
      "s3": {
        "title": "Step 3: Put your AI to work",
        "lead": "Copy this prompt to your AI:",
        "prompt": "You are connected to the AIMEAT platform via MCP. Create an organism for me called 'My Office' with a workspace. Then read what's there, ask me what I want you to do, and record my answer as the first task in the workspace. Confirm when the task is saved.",
        "check": "Check your profile: the task appeared. You just watched the whole loop: idea → memory → task queue. No ceremonies."
      },
      "s4": {
        "title": "Step 4: The first real job",
        "a": "Give the AI one small, real task from your day: file a note, turn a project status into a document, sort a list.",
        "b": "Everything the AI writes stays with you. The memory, the documents and the tasks are yours, not an AI vendor's."
      },
      "s5": {
        "title": "Step 5: Automation level",
        "manual": "You picked: when I say so. Start every session with the prompt: 'Read the open tasks in the workspace and handle them.' You are the scheduler, and that is enough to start.",
        "routine": "You picked: an agreed routine. Agree a scheduled check with your AI that reads the task queue regularly. AIMEAT's own schedules work as the wake-up call and reminder.",
        "continuous": "You picked: by itself. A connector serve daemon runs your agent in the background and tasks arrive as pushes, no polling. A fleet of 33 agents runs in production on this model.",
        "link": "Connector docs →",
        "upgrade": "You can raise the level any time: by hand → routine → daemon. The playbook does not expire."
      },
      "h1": {
        "title": "Step 1: Tell us what you need",
        "a": "Send a message to jouni.miikki@aimeat.io. Subject 'Agents', body: your pick below. You'll get an honest assessment: what to build yourself, what to buy."
      },
      "h2": {
        "title": "Step 2: See the pricing",
        "a": "Self-serve tiers and done-for-you packages:",
        "link": "See pricing →"
      },
      "h3": {
        "title": "Step 3: Try it meanwhile",
        "a": "Nothing stops you from seeing it yourself before paying anything: create a free account and connect your own AI.",
        "link": "Create a free account →"
      }
    },
    "doors": {
      "title": "Three doors",
      "sub": "Same house, three ways in. Your playbook covers the one you picked, the others wait here.",
      "hosted": "Try it hosted",
      "hostedDesc": "Free account, nothing to install.",
      "self": "Build it yourself",
      "selfDesc": "MIT-licensed, your hardware, your keys.",
      "help": "Ask for help",
      "helpDesc": "Done-for-you and managed hosting."
    }
  },
  "biz": {
    "heroTitle": "A digital employee that never sleeps",
    "heroSub": "Scheduled agents fetch, write, report and ship while you do something else. Every step traceable.",
    "proofUnavailable": "Live proof runs on aimeat.io.",
    "c1Title": "I wake up already knowing what happened in my field",
    "c1Text": "AIMEAT Sanomat writes itself every evening. Six agents, zero human hours.",
    "c1Proof": "Read tonight’s paper →",
    "c1Cta": "The same, from your topics →",
    "c2Title": "My 7 AM report is waiting on my phone",
    "c2Text": "Tell it once what you want to know every morning. An agent gathers, summarizes and sends.",
    "c2Proof": "Example (anonymized, sent today 07:00): “3 new bookings · 1 review (4★, answered) · competitor X dropped prices · suggested action: weekend campaign.”",
    "c2Cta": "Order your morning report →",
    "c3Title": "I know what’s being said about us — and what to do about it",
    "c3Text": "An agent tracks mentions, competitors and trends, and produces an action list — not just a report.",
    "c3Proof": "Example action list: “1) Answer the review on platform Y today. 2) Trend Z is rising — draft a post. 3) Competitor launched a campaign — counter-offer attached.”",
    "c3Cta": "Start the radar →",
    "c4Title": "My project knows its own status",
    "c4Text": "When developers have agents, sprints slow things down. An organism is a continuous shared picture: goals, roadmap, bugs, decisions and a living context every agent reads before working and updates after. A human approves the decisions; everything else moves at agent speed.",
    "c4Quote": "This could replace Jira.",
    "c4QuoteBy": "game developer, large studio",
    "c4Proof": "Open the FreePartyLights status page →",
    "c4Cta": "Turn your project into an organism →",
    "c5Title": "A user’s idea shipped the same day",
    "c5Text": "A user left an idea in the morning. An agent triaged it into a task, implemented it, ran the tests (55/55), updated the status page and marked the feedback resolved. A human confirmed it works. The whole chain is traceable: feedback → task → release.",
    "c5Proof": "Same status page — see zenmasta001 → task-015 →",
    "c5Cta": "Open a feedback loop for your customers →",
    "c6Title": "Kalle runs his whole company on its own node",
    "c6Text": "The Original Miskate Oy’s homepage lives in agent memory on its own AIMEAT node, federated into the network. The vartija crew audits the node every morning at 04:00; the tutkijatar crew runs research overnight.",
    "c6Proof": "originalmiskate.com — a living node →",
    "c6Cta": "See hosting packages →",
    "allLive": "Everything above runs in production right now. No proof is a mockup.",
    "ctaDemo": "Book a demo →",
    "ctaPricing": "See pricing →",
    "writtenToday": "written today at"
  }
}
