Ship Cursor-only MCP admin and modular Admin/Chat UI.

Plugins/Skills install and edit via mcpServers JSON, with clearer row actions, soft reloads, and instant loading placeholders; also drop MCP market and harden related scheduler/logging/exec guards.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-08-12 19:38:26 +08:00
parent 2aff012b48
commit f6f129931f
61 changed files with 18057 additions and 16327 deletions

View file

@ -0,0 +1,40 @@
import messagesZh from "./messages-zh.js";
import messagesEn from "./messages-en.js";
import { state } from "../state.js";
export const I18N = {
zh: messagesZh,
en: messagesEn,
};
export const LANG_KEY = "ops_admin_lang";
export function t(key) {
return (I18N[state.currentLang] && I18N[state.currentLang][key]) || (I18N.en && I18N.en[key]) || key;
}
export function tf(key, vars = {}) {
const template = t(key);
return template.replace(/\{(\w+)\}/g, (_, k) => String(vars[k] ?? ""));
}
export function applyI18nStatic() {
document.documentElement.lang = state.currentLang === "zh" ? "zh-CN" : "en";
document.querySelectorAll("[data-i18n]").forEach((node) => {
const key = node.getAttribute("data-i18n");
node.textContent = t(key);
});
const langBtn = document.getElementById("btnLang");
if (langBtn) langBtn.textContent = t("lang.switch");
const themeSel = document.getElementById("adminThemeSelect");
if (themeSel && window.OclawAdminTheme) {
try {
themeSel.value = OclawAdminTheme.currentAdminTheme();
} catch (_) {}
}
}
export function toggleLang() {
state.currentLang = state.currentLang === "zh" ? "en" : "zh";
localStorage.setItem(LANG_KEY, state.currentLang);
}

View file

@ -0,0 +1,774 @@
export default {
"action.refresh": "Refresh",
"action.save": "Save",
"adminAudit.action": "Action",
"adminAudit.actor": "Actor",
"adminAudit.jump": "Go",
"adminAudit.jumpPlaceholder": "Page",
"adminAudit.status": "Status",
"adminAudit.title": "Admin Operation Audit",
"adminAudit.total": "Total {total}",
"apiGrants.forbidden": "Only the administrator console user with team write permission (or owner role) can manage API access grants.",
"apiGrants.intro": "Pick a profile below, then grant visibility to the whole team or specific users. Keys and URLs are still edited under Model Management; members bind roles there after they can see the profile.",
"apiGrants.noShareable": "(No shareable profiles)",
"apiGrants.openModels": "Go to Model Management",
"apiGrants.pickApi": "Profile to grant",
"apiGrants.teamHint": "Everyone in the tenant can then see this profile in their picker; endpoints and secrets stay under Model Management.",
"apiGrants.teamSection": "Grant to entire team",
"apiGrants.userHint": "Only that user sees the profile in their picker; they bind roles under Model Management.",
"apiGrants.userSection": "Grant to one user",
"attachments.archiveMaxDepth": "Archive max depth",
"attachments.archiveMaxEntryBytes": "Archive max entry uncompressed bytes",
"attachments.archiveMaxFileCount": "Archive max file count",
"attachments.archiveMaxTotalBytes": "Archive max total uncompressed bytes",
"attachments.archivePolicyHint": "Unified archive_processor budget for zip/tar/tgz/gz: limits depth, file count and uncompressed size.",
"attachments.card.archive": "Archive budget policy",
"attachments.card.media": "Image & video policy",
"attachments.card.policy": "Policy",
"attachments.card.tableMode": "Tables & tool mode",
"attachments.excelPolicy": "Excel policy",
"attachments.excelPolicyHint": "Policy for Excel/tabular attachments parsing and SQL query safeguards. Saved into oclaw.json (lower priority than env vars).",
"attachments.highPreviewWarn": "Large-table preview rows is above 200, which may significantly increase token usage. Continue?",
"attachments.imageReplayCapChars": "Image replay cap chars",
"attachments.imageReplayCapHint": "Replay cap for query_image_attachment OCR/description results in historical context. Range 600..30000, default 4000.",
"attachments.invalidNumber": "Please enter valid positive integers",
"attachments.largePreviewRows": "Large-table preview rows",
"attachments.loadError": "Load failed",
"attachments.maxCellChars": "Max chars per cell",
"attachments.maxColumns": "Max columns kept",
"attachments.maxExcelSheets": "Max Excel sheets",
"attachments.maxRowsRead": "Max rows read",
"attachments.resetDefaults": "Reset defaults",
"attachments.save": "Save",
"attachments.saved": "Saved",
"attachments.sqlTimeoutHint": "Hard wall-clock timeout. Range 100..120000, default 8000. Timeout returns structured sql_timeout error.",
"attachments.sqlTimeoutMs": "SQL timeout (ms)",
"attachments.subtitle": "Attachment limits, budgets, and replay policy",
"attachments.title": "Attachments",
"attachments.toc.archive": "Archives",
"attachments.toc.media": "Image/Video",
"attachments.toc.overview": "Overview",
"attachments.toc.table": "Tables",
"attachments.toolModeEnabled": "Enable large-table tool mode",
"attachments.toolModeMaxBytes": "Max file bytes for tool mode",
"attachments.toolModeMinRows": "Min rows to trigger tool mode",
"attachments.videoReplayCapChars": "Video replay cap chars",
"attachments.videoReplayCapHint": "Replay cap for query_video_attachment transcript results in historical context. Range 600..30000, default 4000.",
"attachments.videoTranscriptChunkHint": "Default chunk parameters used by query_video_attachment(task=transcript) when persisting transcript chunks for query_text_attachment retrieval.",
"attachments.videoTranscriptChunkOverlap": "Video transcript chunk overlap",
"attachments.videoTranscriptChunkSize": "Video transcript chunk size",
"audit.auditTable": "Audit Table",
"audit.columns": "Columns",
"audit.empty": "No data",
"audit.note": "Supports dual view: table + raw JSON.",
"audit.query": "Query",
"audit.rawJson": "Raw JSON",
"audit.result": "Result",
"audit.sessionIdPlaceholder": "session_id (optional)",
"audit.specialistSummaryHint": "Specialist-side tool execution and delivery summary (specialist -> core)",
"audit.title": "Audit & Trace",
"audit.traceTable": "Trace Table",
"auth.consoleUsernameHint": "Username and password; menus still follow your permissions.",
"auth.disabled": "Account is disabled",
"auth.invalid": "Login failed",
"auth.login": "Login",
"auth.logout": "Logout",
"auth.password": "Password",
"auth.username": "Username",
"auto.after_any_skill_tool_role_prompt_change_run_prewarm_imme": "After any skill/tool/role/prompt change, run prewarm immediately; restart for complex changes. System also auto-prewarms every 10 minutes.",
"auto.prewarm_running_in_background_refreshing_this_page_when_": "[prewarm] running in background; refreshing this page when finished…",
"boot.loadFailed": "Failed to load admin scripts",
"boot.loadFailedHint": "Confirm /admin/assets/app.js and /admin/assets/js/ are reachable.",
"boot.loading": "Loading admin console…",
"boot.loadingHint": "If this stays too long, check whether the network/proxy blocks assets.",
"brand.title": "oliver",
"chat.empty": "No messages yet",
"chat.error": "Request failed",
"chat.loading": "Loading…",
"chat.newSession": "New chat",
"chat.noSessions": "No sessions yet. Create one to start.",
"chat.placeholder": "Message…",
"chat.send": "Send",
"chat.sending": "Sending…",
"chat.sessions": "Sessions",
"common.admin": "Admin",
"common.all": "All",
"common.auto": "Auto",
"common.blacklist": "Blacklist",
"common.chinese": "Chinese",
"common.delete": "Delete",
"common.deleteFailed": "Delete failed",
"common.english": "English",
"common.error": "Error",
"common.forbidden": "You do not have access to this page.",
"common.mode": "Mode",
"common.notFound": "Not found",
"common.notLoggedIn": "Not logged in or session expired. Please log in again.",
"common.pageRemoved": "This admin page was removed in the product simplification pass.",
"common.remove": "Remove",
"common.requestFailed": "Request failed",
"common.selectType": "Please select a type",
"common.update": "Update",
"common.updateFailed": "Update failed",
"common.whitelist": "Whitelist",
"lang.switch": "中文",
"memory.applyFilters": "Apply Filters",
"memory.avgScore": "Average Score",
"memory.backend": "Backend",
"memory.cleanup": "Cleanup low-confidence",
"memory.clearFilters": "Clear Filters",
"memory.config": "Vector Config",
"memory.delete": "Delete",
"memory.enabled": "Enable vector retrieval",
"memory.filters": "Filters",
"memory.hitCount": "Hit Count",
"memory.hits": "Recent Hits",
"memory.itemCount": "Memory Items",
"memory.items": "Memory Items",
"memory.minConfidence": "Min write confidence",
"memory.noData": "No memory data",
"memory.openPlugins": "Open plugins page",
"memory.reindex": "Reindex vectors",
"memory.save": "Save Config",
"memory.stats": "Stats",
"memory.tenantId": "team ID / tenant_id (optional)",
"memory.title": "Memory Governance",
"memory.topSources": "Recent Sources",
"memory.topk": "TopK",
"memory.userId": "user_id (optional)",
"memory.wikiCard": "Wiki",
"memory.wikiPluginFound": "Installed: {name} v{version}",
"memory.wikiPluginMissing": "memory-wiki plugin not found",
"memory.wikiStatus": "Plugin status",
"memory.writerEnabled": "Enable auto write",
"models.agentBindingHelp": "Optional per-role profile; leave empty to use the global selection above.",
"models.apiKey": "API key",
"models.baseUrl": "Base URL",
"models.baseUrlPlaceholder": "Optional",
"models.bindingsExtraHint": "Profiles shared via user or team grants appear in the picker above; each member binds roles here themselves.",
"models.bindingsScopeHint": "Pickers only include built-in profiles, ones you created, and those granted by an admin (team-wide or to you)—the same set your account can see.",
"models.builtinLocked": "Built-in Ollama profile: mode is fixed; you can edit URL/model.",
"models.cannotDeleteBuiltin": "Cannot delete the built-in Ollama profile.",
"models.chatModelSelector": "Chat model selector",
"models.chatModelSelectorHint": "Control whether the model dropdown is visible on the Chat page.",
"models.createBtn": "Create",
"models.createNamePlaceholder": "Display name",
"models.dbPath": "SQLite file in use",
"models.delete": "Delete profile",
"models.deleteConfirm": "Delete this profile? This cannot be undone.",
"models.evalDownloadCsv": "Download full CSV",
"models.evalDownloadJson": "Download full JSON",
"models.evalLogs": "Recent eval logs",
"models.evalLogsPreview": "Preview",
"models.evalP95": "P95 latency",
"models.evalSuccess": "Success rate",
"models.evalToggle": "Agent Evaluation · click to expand (preview up to 100 rows)",
"models.evalTotal": "Samples",
"models.grantTenantBtn": "Entire team",
"models.grantsEmpty": "No per-user grants yet.",
"models.grantsGrantBtn": "Grant",
"models.grantsHint": "Only the administrator account can manage grants. Granted users see and can select this profile (shared API key).",
"models.grantsNavHint": "Control who can see and select shareable profiles (keys and endpoints are edited on Model Management).",
"models.grantsRevoke": "Revoke",
"models.grantsTitle": "Grant other users access to the selected profile",
"models.grantsUserHint": "Grant to one user:",
"models.labelApiProfile": "API profile",
"models.labelSpecialist": "Specialist",
"models.linkApiGrants": "Open API access grants",
"models.loadFailed": "Load failed; see error below.",
"models.membersTitle": "Model profiles visible to each member",
"models.mode": "Mode",
"models.mode.anthropic": "Anthropic",
"models.mode.google": "Google (Gemini)",
"models.mode.ollama": "Ollama",
"models.mode.openai": "OpenAI-compatible",
"models.mode.openai_responses": "OpenAI Responses",
"models.mode.rule": "Rule (no LLM)",
"models.model": "Model",
"models.newProfileDefault": "New profile",
"models.noEvalLogs": "No evaluation logs yet",
"models.noProfiles": "No LLM profiles.",
"models.ollamaHint": "Local Ollama defaults to http://127.0.0.1:11434; API key is usually empty.",
"models.openaiKeyHint": "Without a key, OPENAI_API_KEY from the environment may be used.",
"models.opsAiHint": "For v1 / expert mode: pick a specialist and bind an API profile.",
"models.opsAiTitle": "Internal API model config",
"models.phNameZh": "Chinese name (optional)",
"models.pickModel": "Profile",
"models.profileName": "Name",
"models.profileReadonlyHint": "This profile is shared by an administrator: you may select it for chat but cannot edit name, endpoint, or secret.",
"models.readonly": "Read-only: missing admin:tenant:write.",
"models.reasoningEffort": "Reasoning effort",
"models.reasoningEffortDefault": "Default",
"models.reasoningEffortHigh": "High",
"models.reasoningEffortLow": "Low",
"models.reasoningEffortMedium": "Medium",
"models.rememberKey": "Remember key (encrypted in DB)",
"models.revokeTenantGrant": "Revoke team",
"models.role.generalist": "Generalist",
"models.role.image": "Image",
"models.role.memory": "Memory Curator",
"models.role.ops": "Network ops",
"models.save": "Save",
"models.sectionActive": "Active profile",
"models.sectionApi": "API & secret",
"models.sectionBindings": "Agent ↔ profile bindings",
"models.sectionEval": "Agent Evaluation",
"models.sectionNew": "New profile",
"models.subtitle": "Model switching, bindings, and evaluation",
"models.tenantGrantOff": "Team: not granted",
"models.tenantGrantOn": "Team: granted",
"models.thinkMode": "Think mode (this API profile only)",
"models.thinkModeHint": "When on, replay full assistant reasoning_content for this profile only (default off).",
"models.toc.api": "API config",
"models.toc.bindings": "Bindings",
"models.toc.eval": "Eval",
"models.toc.opsAi": "Internal API",
"models.toc.overview": "Overview",
"models.useGlobal": "(use global)",
"models.vis.builtin": "Built-in",
"models.vis.global": "Global",
"models.vis.grantTenant": "Team grant",
"models.vis.grantUser": "User grant",
"models.vis.otherUser": "Other user",
"models.vis.owned": "Mine",
"models.warnKeyInDb": "A key exists in DB: empty field won’t overwrite until you enter a new key or uncheck remember.",
"nav.adminAudit": "Admin Audit",
"nav.apiGrants": "API access",
"nav.attachments": "Attachments",
"nav.audit": "Audit & Trace",
"nav.chat": "Chat",
"nav.group.governance": "Governance & audit",
"nav.group.models": "Models & plugins",
"nav.group.system": "System & runtime",
"nav.group.users": "Users & settings",
"nav.memory": "Memory",
"nav.models": "Models",
"nav.plugins": "Plugins",
"nav.profile": "User Info",
"nav.scheduledJobs": "Scheduled Jobs",
"nav.sessionMonitor": "Session Monitor",
"nav.skills": "Skills",
"nav.stack": "Runtime",
"nav.users": "Users",
"nav.workspacePaths": "Workspace paths",
"notice.noLogin": "v2 login enabled: internal network only",
"plugins.colBoundMcp": "Bound MCPs",
"plugins.colSpecialist": "Specialist",
"plugins.colTools": "tools (sum across servers)",
"plugins.fold.bindingDash": "[4] Specialist MCP binding board (auto)",
"plugins.fold.bindingDashHint": "Summarizes current binding draft vs installed MCP tools; specialists come from SPECIALISTS and mapping keys.",
"plugins.fold.bindingEdit": "[5] MCP specialist binding (edit)",
"plugins.fold.install": "[2] Install from Cursor JSON",
"plugins.fold.installCursor": "[2] Install from Cursor JSON",
"plugins.fold.installCursorHint": "Paste a Cursor mcp.json document with mcpServers, then Install. Export downloads the same shape for migration.",
"plugins.fold.installHint": "Paste Cursor mcpServers JSON, then Install.",
"plugins.fold.installed": "[3] Installed MCP servers ({n})",
"plugins.fold.migrateHint": "After install/config/uninstall, writes oclaw/_local/mcp_registry_migrated.json (Cursor mcpServers) for migration.",
"plugins.fold.toolPolicy": "[1] Tool policy & registered plugins ({n})",
"plugins.fold.toolPolicyHint": "Tool policy (concurrency / rounds / MCP·plugin toggles) and Python tool plugins",
"plugins.nextPage": "Next",
"plugins.noData": "No data",
"plugins.pageRange": "{start}–{end} of {total}",
"plugins.prevPage": "Prev",
"plugins.subtitle": "Grouped by feature, collapsed by default; tables paginate ({n}/page).",
"plugins.title": "Tool Plugins",
"plugins.toc.binding": "Bindings",
"plugins.toc.install": "Install",
"plugins.toc.instances": "Instances",
"plugins.toc.policy": "Policy",
"profile.avatar": "Avatar",
"profile.avatarHint": "PNG, JPEG, WebP, or GIF, up to 2 MB.",
"profile.chatPrefs": "Chat Preferences",
"profile.chooseImage": "Choose image",
"profile.createdAt": "Created at",
"profile.displayName": "Display name",
"profile.help": "Adjust display name, avatar, and account identifiers here. In chat, avatars are circular; the assistant uses the site logo.",
"profile.loadError": "Load failed",
"profile.memoryCurator": "Memory curator specialist",
"profile.memoryCuratorDisabled": "Disabled",
"profile.memoryCuratorEnabled": "Enabled",
"profile.memoryMode": "Memory mode",
"profile.memoryModeDefault": "Default (inject allowed)",
"profile.memoryModeStoreOnly": "Store only (no inject)",
"profile.openChat": "Open chat",
"profile.removeAvatar": "Remove avatar",
"profile.role": "Role",
"profile.save": "Save settings",
"profile.saved": "Saved",
"profile.tenantId": "Team ID",
"profile.uploadError": "Upload failed",
"profile.userId": "User ID",
"profile.username": "Username",
"scheduledJobs.all": "All",
"scheduledJobs.attentionTitle": "Needs attention",
"scheduledJobs.cancel": "Cancel",
"scheduledJobs.colActions": "actions",
"scheduledJobs.colDelivery": "delivery",
"scheduledJobs.colError": "error",
"scheduledJobs.colFailClass": "class",
"scheduledJobs.colFinished": "finished",
"scheduledJobs.colJob": "job",
"scheduledJobs.colLastRun": "last_run",
"scheduledJobs.colName": "name",
"scheduledJobs.colNextRun": "next_run",
"scheduledJobs.colPlaybook": "playbook",
"scheduledJobs.colRunStatus": "run status",
"scheduledJobs.colSchedule": "schedule",
"scheduledJobs.colSpecialist": "specialist",
"scheduledJobs.colStatus": "status",
"scheduledJobs.count": "{count} job(s)",
"scheduledJobs.create": "Create",
"scheduledJobs.createTitle": "Create job",
"scheduledJobs.delete": "Delete",
"scheduledJobs.deleteConfirm": "Delete this scheduled job?",
"scheduledJobs.deliveryWeixin": "WeChat",
"scheduledJobs.deliveryWhatsapp": "WhatsApp",
"scheduledJobs.edit": "Edit",
"scheduledJobs.editTitle": "Edit job",
"scheduledJobs.failClass.auth": "auth",
"scheduledJobs.failClass.cancelled": "cancelled",
"scheduledJobs.failClass.delivery": "delivery",
"scheduledJobs.failClass.mcp": "mcp/tool",
"scheduledJobs.failClass.overlap": "overlap skip",
"scheduledJobs.failClass.runtime": "runtime",
"scheduledJobs.failClass.stale": "stale clear",
"scheduledJobs.failClass.timeout": "timeout",
"scheduledJobs.fieldExpr": "Expression",
"scheduledJobs.fieldKind": "Kind",
"scheduledJobs.fieldName": "Name",
"scheduledJobs.fieldPrompt": "Prompt",
"scheduledJobs.fieldSchedule": "Schedule",
"scheduledJobs.fieldSpecialist": "Specialist",
"scheduledJobs.fieldWhatsapp": "WhatsApp chat_id",
"scheduledJobs.loading": "Loading…",
"scheduledJobs.menuTitle": "Job actions",
"scheduledJobs.noRuns": "No runs yet",
"scheduledJobs.pause": "Pause",
"scheduledJobs.phExpr": "cron / ISO time / seconds",
"scheduledJobs.phName": "Job name",
"scheduledJobs.phPrompt": "Prompt to run when due",
"scheduledJobs.phSpecialist": "e.g. generalist",
"scheduledJobs.phWhatsapp": "Optional group or DM chat_id",
"scheduledJobs.playbookNo": "reminder",
"scheduledJobs.playbookPartial": "recipe · {n} steps",
"scheduledJobs.playbookYes": "playbook · {n} steps",
"scheduledJobs.requiredFields": "name, prompt_text, and schedule_expr are required",
"scheduledJobs.resume": "Resume",
"scheduledJobs.runHistory": "Run history",
"scheduledJobs.runHistoryHint": "Recent runs (auto refresh)",
"scheduledJobs.runNow": "Run now",
"scheduledJobs.skippedOverlap": "Skipped (overlapping)",
"scheduledJobs.statsClasses": "Failure classes",
"scheduledJobs.statsFailRate": "Recent fail rate {pct}% ({failed} failed / {finished} finished)",
"scheduledJobs.statsJobsFailed": "Jobs last-failed: {n}",
"scheduledJobs.statsNone": "No failures in recent window",
"scheduledJobs.statsTitle": "Failure board",
"scheduledJobs.statusActive": "active",
"scheduledJobs.statusPaused": "paused",
"scheduledJobs.triggered": "Triggered.",
"scheduledJobs.updated": "Saved.",
"scheduledJobs.viewRuns": "View runs",
"scheduledJobs.weixinFixed": "Weixin fixed target: {id}",
"scheduledJobs.weixinMissing": "Weixin binding not found (administrator channel identity required)",
"secrets.migrateBtn": "Migrate now",
"secrets.migrateDone": "Migration done: settings={s}, profiles={p}",
"secrets.migrateForbidden": "Requires admin:tenant:write permission.",
"secrets.migrateHint": "Legacy b64-encoded secrets detected (weak protection). Set AIA_ASSISTANT_MASTER_KEY and migrate to a stronger encrypted format.",
"secrets.migrateNeedKey": "AIA_ASSISTANT_MASTER_KEY is not set; cannot migrate.",
"secrets.migrateNoop": "No legacy secrets found.",
"secrets.migrateTitle": "Secret migration",
"sessionMonitor.activeLogins30m": "Active logins (30m)",
"sessionMonitor.activeSessions30m": "Active sessions (30m)",
"sessionMonitor.closeDetail": "Close details",
"sessionMonitor.exportJson": "Export JSON",
"sessionMonitor.exportMd": "Export MD",
"sessionMonitor.filterSession": "Filter sessions",
"sessionMonitor.filterUser": "Filter users",
"sessionMonitor.messages": "Messages",
"sessionMonitor.noMessages": "No messages in this session.",
"sessionMonitor.onlyAdministrator": "This page is available to administrator only.",
"sessionMonitor.pageInfo": "Page {page} / {totalPages}",
"sessionMonitor.pageNext": "Next",
"sessionMonitor.pagePrev": "Prev",
"sessionMonitor.roleAll": "All",
"sessionMonitor.roleAssistant": "Assistant",
"sessionMonitor.roleFilter": "Role filter",
"sessionMonitor.roleTool": "Tool",
"sessionMonitor.roleUser": "User",
"sessionMonitor.selectUserFirst": "Select a user to view sessions.",
"sessionMonitor.sessions": "Sessions",
"sessionMonitor.totalTokensEst": "Total tokens (est)",
"sessionMonitor.totals": "Overview",
"sessionMonitor.userStats": "User stats",
"sessionMonitor.usersCount": "Users",
"sessionMonitor.viewAudit": "Open audit",
"sessionMonitor.viewDetail": "View details",
"skills.action.cancel": "Cancel",
"skills.action.clearCache": "Clear cache",
"skills.action.close": "Close",
"skills.action.create": "Create skill",
"skills.action.detail": "Detail",
"skills.action.disable": "Disable",
"skills.action.enable": "Enable",
"skills.action.exportSelfCheck": "Export self-check JSON",
"skills.action.exportSkillHealth": "Export skills self-check JSON",
"skills.action.failedOnly": "Only failed items",
"skills.action.install": "Install",
"skills.action.installLocal": "Install local dir",
"skills.action.installRegistry": "Install from registry",
"skills.action.installing": "Installing...",
"skills.action.latest": "Latest",
"skills.action.menuTitle": "Skill actions",
"skills.action.preview": "Preview",
"skills.action.refresh": "Refresh",
"skills.action.repairAllDeps": "Repair all deps",
"skills.action.repairDeps": "Repair deps",
"skills.action.repairing": "Repairing...",
"skills.action.retry": "Retry",
"skills.action.retryableOnly": "Only retryable failures",
"skills.action.run": "Run",
"skills.action.runSelfCheck": "Run self-check",
"skills.action.runSkillHealth": "Run skills self-check",
"skills.action.save": "Save",
"skills.action.saveBinding": "Save skill role binding",
"skills.action.saveTrace": "Save trace setting",
"skills.action.search": "Search",
"skills.action.testRun": "Test run...",
"skills.action.testRunArgs": "Test-run with args...",
"skills.action.toggleRawWired": "Toggle raw/wired",
"skills.action.traceExposure": "Trace exposure plan",
"skills.action.uninstall": "Uninstall",
"skills.col.action": "action",
"skills.col.code": "code",
"skills.col.count": "count",
"skills.col.description": "description",
"skills.col.detail": "detail",
"skills.col.details": "details",
"skills.col.directBind": "direct bind",
"skills.col.directSkills": "direct skills",
"skills.col.docsOnlyNames": "docs-only names",
"skills.col.effective": "effective",
"skills.col.enabled": "enabled",
"skills.col.errorCode": "error_code",
"skills.col.health": "health",
"skills.col.internal": "internal",
"skills.col.kind": "kind",
"skills.col.mcpConverted": "mcp converted",
"skills.col.mode": "mode",
"skills.col.name": "name",
"skills.col.namesPreview": "names preview",
"skills.col.otherTools": "other tools",
"skills.col.outputTruncated": "output_truncated",
"skills.col.parameters": "parameters",
"skills.col.path": "path",
"skills.col.raw": "raw",
"skills.col.readOnly": "read_only",
"skills.col.removedMcp": "removed mcp",
"skills.col.retry": "retry",
"skills.col.risk": "risk",
"skills.col.role": "role",
"skills.col.runtimeEntry": "runtime entry",
"skills.col.skill": "skill",
"skills.col.slug": "slug",
"skills.col.source": "source",
"skills.col.status": "status",
"skills.col.tags": "tags",
"skills.col.target": "target",
"skills.col.timestamp": "timestamp",
"skills.col.totalEffective": "total effective",
"skills.col.type": "type",
"skills.col.version": "version",
"skills.col.wired": "wired",
"skills.col.workspace": "workspace",
"skills.col.workspaceDocsOnly": "workspace docs-only",
"skills.col.workspaceResolved": "workspace resolved",
"skills.confirm.uninstall": "Uninstall skill \"{name}\"?",
"skills.docsTitle": "oclaw docs quick links:",
"skills.docsTraceTaxonomy": "- oclaw/docs/oclaw-trace-taxonomy.md (trace fields and stages)",
"skills.docsTroubleshooting": "- oclaw/docs/oclaw-skill-troubleshooting.md (install/runtime troubleshooting)",
"skills.fold.audit": "Install audit",
"skills.fold.binding": "[4] Skill role binding",
"skills.fold.bindingDash": "Role binding dashboard",
"skills.fold.bindingHint": "When enabled, the skills catalog is filtered per role: each role sees only skills bound to that role, plus skills under skills/_workspace/public/. Unbound non-public skills stay hidden.",
"skills.fold.create": "Create skill",
"skills.fold.diagnostics": "[5] Diagnostics",
"skills.fold.effective": "Effective skills (binding + MCP + tools)",
"skills.fold.health": "Skills health self-check",
"skills.fold.install": "[2] Install",
"skills.fold.installHint": "Install from ClawHub market, local dir / registry archive, or create a new skill.",
"skills.fold.installed": "[3] Installed skills ({n})",
"skills.fold.internalTools": "Internal tools preview",
"skills.fold.llmTools": "LLM tools preview",
"skills.fold.localRegistry": "Local dir / registry",
"skills.fold.market": "ClawHub market",
"skills.fold.mode": "[1] Mode",
"skills.fold.modeHint": "Prompt mode injects SKILL.md into the system prompt. Market provider is ClawHub.",
"skills.fold.toolsSelfCheck": "Tools self-check",
"skills.hint.bindingEnv": "Process env AIA_SKILL_ROLE_BINDING_ENABLED is set: it overrides the Admin/SQLite value at runtime. The checkbox reflects the effective (env) value. Remove or unset that variable on the oclaw process to use Admin only. (stored in DB: {stored}, effective: {effective}).",
"skills.hint.bindingPersist": "Checkboxes and per-role skill lists are not saved until you click Save skill role binding.",
"skills.hint.diffDiag": "Diff / diagnostics",
"skills.hint.expandToLoad": "Expand this section to load preview",
"skills.hint.expandToSelfCheck": "Expand this section to run self-check",
"skills.hint.internalTools": "Preview dynamically loaded builtin tools for a role (public shared + expert-scoped).",
"skills.hint.llmTools": "Preview the final tools injected to the model for a role (internal + MCP + role_mode + MCP specialist binding).",
"skills.hint.noSkills": "No installed skills yet.",
"skills.hint.rawWiredDiff": "raw vs wired diff (added/removed/changed)",
"skills.hint.skillHealth": "Run executable skill diagnostics and show failure code distribution.",
"skills.hint.skippedModules": "Skipped modules / factory errors",
"skills.hint.testRunArgs": "Input JSON args passed to the executable skill runtime.",
"skills.hint.toolsSelfCheck": "Run one-shot diagnostics across roles for internal/wired tools, role mode and permanent bans.",
"skills.hintLocalDir": "Local dir: directory must contain SKILL.md (absolute paths OK).",
"skills.hintRegistry": "Registry: zip/tar URL (file:// local URI supported).",
"skills.label.enableBinding": "Enable role binding (AIA_SKILL_ROLE_BINDING_ENABLED)",
"skills.label.promptMode": "Prompt mode (inject SKILL.md)",
"skills.label.role": "Role",
"skills.modal.install": "Skill installation",
"skills.modal.installFail": "Skill installation failed",
"skills.modal.installOk": "Skill installation success",
"skills.modal.testRun": "Skill test run",
"skills.modal.testRunNamed": "Test run: {name}",
"skills.ph.body": "SKILL.md body markdown",
"skills.ph.description": "description",
"skills.ph.limit": "limit",
"skills.ph.localDir": "local skill dir (contains SKILL.md)",
"skills.ph.marketSearch": "search skills (keyword)",
"skills.ph.name": "skill name",
"skills.ph.registry": "registry archive URL (zip/tar)",
"skills.subtitle": "Mode, install, installed list, role binding, and diagnostics — collapsed by default.",
"skills.title": "Skills",
"skills.toc.binding": "Binding",
"skills.toc.diagnostics": "Diagnostics",
"skills.toc.install": "Install",
"skills.toc.installed": "Installed",
"skills.toc.mode": "Mode",
"stack.alerts": "Alerts",
"stack.allRoles": "all roles",
"stack.cleanup": "Cleanup orphan workers",
"stack.cleanupDone": "Cleanup completed. Killed orphan processes: {count}",
"stack.cleanupNone": "No orphan processes found.",
"stack.clearByPolicy": "Clear by policy",
"stack.clearScanCache": "Clear scan cache",
"stack.configChangedPrewarm": "Config changed. Please run prewarm now (or restart).",
"stack.down": "stack down",
"stack.missingRequired": "Required services are not running. Start the stack first.",
"stack.missingServices": "Missing services: {services}",
"stack.mustCleanup": "Duplicate workers detected. Cleanup is required before continuing.",
"stack.noAlerts": "No anomalies detected.",
"stack.prewarmHistory": "Prewarm History (latest 20)",
"stack.prewarmNow": "Run prewarm now",
"stack.prewarmSubmitting": "[prewarm] submitting…",
"stack.prewarmTitle": "Prompt/Tool Prewarm",
"stack.prewarmedPrompts": "Prewarmed Prompts by Role",
"stack.prewarmedPromptsHint": "Shows prewarmed prompt content for specialists.",
"stack.reloadPrompts": "Reload prompts",
"stack.roleFilter": "Role filter",
"stack.scanCacheSubtitle": "{dir} · only clears history_entries_*.json and state_scan_*.json",
"stack.scanCacheTitle": "Scan cache files",
"stack.title": "Stack",
"stack.up": "stack up",
"status.running": "running",
"status.stopped": "stopped",
"table.action": "action",
"table.activeLogins30m": "active_logins(30m)",
"table.activeSessions30m": "active_sessions(30m)",
"table.channel": "channel",
"table.createdAt": "created_at",
"table.durationMs": "duration(ms)",
"table.enabled": "enabled",
"table.entryPoint": "entry_point",
"table.eventType": "event_type",
"table.externalUserId": "external_user_id",
"table.id": "id",
"table.inputAttachmentIds": "input_attachment_ids",
"table.name": "name",
"table.noOutputAttachment": "no_output_attachment",
"table.outputAttachmentIds": "output_attachment_ids",
"table.outputAttachmentUrls": "output_attachment_urls",
"table.parentSpanId": "parent_span_id",
"table.payload": "payload",
"table.pid": "pid",
"table.provider": "provider",
"table.reason": "reason",
"table.routeAttachmentIds": "route_attachment_ids",
"table.service": "service",
"table.sessionsCount": "sessions",
"table.spanId": "span_id",
"table.specialist": "specialist",
"table.status": "status",
"table.statusText": "status",
"table.timestamp": "timestamp",
"table.totalTokensEst": "total_tokens(est)",
"table.traceId": "trace_id",
"table.user": "user",
"table.userId": "user_id",
"table.username": "username",
"table.version": "version",
"tenants.allTenantsHint": "With multiple teams: “Logged-in team” is informational; the selected team in the dropdown is what you edit.",
"tenants.bindCodes": "Bind Codes",
"tenants.bindings": "Channel Bindings",
"tenants.chatLogin": "Web login",
"tenants.chatLoginNo": "No",
"tenants.chatLoginYes": "Yes (password set)",
"tenants.codeDeleteConfirm": "Delete this bind code?",
"tenants.codeDeleted": "Bind code deleted: {code}",
"tenants.codeOptional": "Code (optional, auto-generated if blank)",
"tenants.codeStatus": "Status",
"tenants.codeUnused": "Unused",
"tenants.codeUsed": "Used",
"tenants.codeUsedBy": "Used By",
"tenants.colScope": "Session marker",
"tenants.colTenantId": "Team ID",
"tenants.colTenantName": "Team name",
"tenants.create": "Create Team",
"tenants.createCode": "Create Bind Code",
"tenants.createPlaceholder": "Team name (default Team)",
"tenants.deleteCode": "Delete",
"tenants.deleteDisabledCurrent": "You cannot delete your current session team; log in with another team UUID on the login page first.",
"tenants.deleteDisabledLast": "At least one team must remain.",
"tenants.deleteTenant": "Delete team",
"tenants.deleteTenantConfirm": "Delete team “{name}”? All users, bindings, and data under it will be removed. This cannot be undone.",
"tenants.deleteUnbound": "Delete Unbound Users",
"tenants.deleteUnboundResult": "Unbound cleanup: deleted={deleted}, orphan={orphan}, bound={bound}, total={total}",
"tenants.deleted": "Deleted unbound users: {count}",
"tenants.errCannotDeleteCurrentTenant": "You cannot delete the team of your current session. Switch to another team first or use another account.",
"tenants.errLastTenant": "At least one team must remain.",
"tenants.errTenantDeleteMiss": "Delete had no effect (constraints may have blocked it). Check server logs.",
"tenants.noBindings": "No channel bindings under this team.",
"tenants.noSessionTenant": "Missing team in session. Please sign in again.",
"tenants.noTenants": "No teams found. Create one via bind flow or bootstrap script first.",
"tenants.noUsers": "No users under this team.",
"tenants.role": "Role",
"tenants.rowActions": "Actions",
"tenants.saved": "Configuration saved",
"tenants.scopeHint": "The team selector controls which team’s users, bindings, and bind codes are shown below. Accounts named administrator may switch and manage any team. The last column marks the team your login session was issued for.",
"tenants.scopeLoginHome": "Logged-in team",
"tenants.select": "Select Team",
"tenants.sessionTenantMissing": "The team for this session is not in the list. Sign in again or contact an admin.",
"tenants.sourceChannel": "Other channel",
"tenants.sourceConsole": "Console",
"tenants.sourceWecom": "WeCom",
"tenants.title": "Teams",
"tenants.userSource": "Source",
"tenants.users": "Users",
"theme.catppuccin": "Catppuccin Mocha",
"theme.deepseek": "DeepSeek",
"theme.dracula": "Dracula",
"theme.forest": "Forest",
"theme.github": "GitHub Dark",
"theme.label": "Color theme",
"theme.light": "Light",
"theme.netx": "NetX Dark",
"theme.nord": "Nord",
"title.adminAudit": "Admin Audit",
"title.apiGrants": "API access grants",
"title.attachments": "Attachments",
"title.audit": "Audit & Trace",
"title.memory": "Memory",
"title.models": "Model Management",
"title.plugins": "Plugins",
"title.profile": "User Info",
"title.scheduledJobs": "Scheduled Jobs",
"title.sessionMonitor": "Session Monitor",
"title.skills": "Skills",
"title.stack": "Runtime",
"title.users": "Users",
"title.workspacePaths": "Workspace paths (per user)",
"users.accountActions": "Account Actions",
"users.accountActive": "Active",
"users.accountDelete": "Delete Account",
"users.accountId": "Account ID",
"users.accountLoadHint": "After selecting a user, the table lists bindings and instances. Click “Load into form” to edit, then fill Bot Secret and save (no auto-fill).",
"users.accountModeExpert": "Current account mode: expert ({specialist})",
"users.accountName": "Name",
"users.accountSave": "Save Account",
"users.botIdRequired": "Bot ID is required",
"users.clearBotSecret": "Clear bot secret",
"users.colActive": "Active",
"users.colSetRole": "Set role",
"users.colUser": "User",
"users.create": "Create User",
"users.createNamePlaceholder": "Name (login id, unique)",
"users.createNameRequired": "Enter a name.",
"users.delete": "Delete",
"users.deleteConfirm": "Delete this user? This cannot be undone.",
"users.disable": "Disable",
"users.enable": "Enable",
"users.hasBotSecret": "Bot secret set",
"users.loadForm": "Load into form",
"users.needUserRead": "admin:user:read is required to view and edit the user list.",
"users.noBindingsForUser": "No WeCom binding or saved instance yet; after the user binds on WeChat, a row appears—fill secrets and save.",
"users.noTenant": "Sign in first and choose a team scope",
"users.passwordOptional": "New password (optional)",
"users.search": "Search users",
"users.title": "User Management",
"users.update": "Update",
"users.wecomAccounts": "WeCom instances (named, multiple per user)",
"users.wecomBotId": "Bot ID",
"users.wecomBotSecret": "Bot Secret",
"users.wecomInstanceName": "Instance name",
"users.wecomUserEmpty": "Click a user row in the table above",
"users.wecomUserLabel": "User",
"wa.accessHint": "Default blacklist mode: unauthorized users go to Pending; denied users go to blacklist/denied list and can be whitelisted.",
"wa.accessTitle": "WhatsApp access control",
"wa.addContact": "Add contact",
"wa.addFailed": "Add failed",
"wa.addWhitelist": "Whitelist",
"wa.alertGroupHint": "NetX key alerts go to this group; independent of chat sessions.",
"wa.alertGroupTitle": "WhatsApp alert group",
"wa.approve": "Approve",
"wa.bindFailed": "Bind failed",
"wa.bindSpecialist": "Bind specialist",
"wa.blacklistMode": "Blacklist mode (deny by default)",
"wa.channelExpertOnly": "Channels are expert-only; pick the default specialist.",
"wa.colAction": "Action",
"wa.colDeniedAt": "Denied at",
"wa.colMessage": "Message",
"wa.colName": "Name",
"wa.colPhone": "Phone",
"wa.colTime": "Time",
"wa.colType": "Type",
"wa.contactNotFound": "Contact not found",
"wa.deniedHint": "Denied users are blacklisted and listed here; use Whitelist to restore access.",
"wa.deniedTitle": "Denied / blacklist records",
"wa.deny": "Deny",
"wa.filter": "Filter",
"wa.lang": "Lang",
"wa.messageLang": "Message lang",
"wa.mode": "Mode",
"wa.namePlaceholder": "Display name (optional)",
"wa.noAlertGroup": "No alert group bound",
"wa.noContacts": "No contacts",
"wa.noneDenied": "None",
"wa.nonePending": "None",
"wa.pendingTitle": "Pending requests",
"wa.phonePlaceholder": "Phone, e.g. +8615601877957",
"wa.pickPending": "Pick from pending requests…",
"wa.saveBinding": "Save binding",
"wa.saveConfig": "Save config",
"wa.selectGroup": "Select group…",
"wa.specialist": "Specialist",
"wa.testPush": "Test push",
"wa.whitelistMode": "Whitelist mode (allow by default)",
"wecom.autoBind": "Auto bind on first message",
"wecom.autoBindRole": "Auto bind role",
"wecom.autoBindTenant": "Auto bind team",
"wecom.botId": "Bot ID",
"wecom.botSecret": "Bot Secret",
"wecom.title": "WeCom Config",
"wecom.unbind": "Unbind WeCom",
"wecom.unbindConfirm": "Clear local WeCom config and all WeCom bindings/sessions?",
"wecom.unbindDone": "WeCom unbound. identities={ident}, sessions={sess}",
"workspacePaths.allowAny": "Allow any path (high risk)",
"workspacePaths.allowAnyHint": "Applies only to built-in workspace tools (read_file / glob, etc.); it does not unlock MCP filesystem or auto-mount whole disks for MCP. List directories you need in “Extra roots” or AIA_WORKSPACE_EXTRA_ROOTS.",
"workspacePaths.allowHighTools": "Allow high-risk public tools (global)",
"workspacePaths.allowHighToolsHint": "When enabled, high-risk public tools (run_command / write_file / edit_file, etc.) become model-visible (equivalent to AIA_PUBLIC_TOOLS_ALLOW_HIGH=1).",
"workspacePaths.extraRoots": "Extra roots (| separated)",
"workspacePaths.fromDb": "Saved in database",
"workspacePaths.help": "Per-user extra absolute roots (besides AIA_WORKSPACE_ROOT / project root). Use | as separator, e.g. D:\\\\|E:\\\\repos\\\\other. Merged with gateway env AIA_WORKSPACE_EXTRA_ROOTS. These roots are enforced for built-in workspace tools and, for this user’s chat sessions, appended to the official @modelcontextprotocol/server-filesystem process argv.",
"workspacePaths.load": "Load",
"workspacePaths.save": "Save",
"workspacePaths.selfOnly": "You can only view and edit your own workspace path policy (not other users).",
"workspacePaths.status": "Status",
"workspacePaths.tenant": "Team",
"workspacePaths.user": "User",
};

View file

@ -0,0 +1,774 @@
export default {
"action.refresh": "刷新",
"action.save": "保存",
"adminAudit.action": "动作",
"adminAudit.actor": "操作者",
"adminAudit.jump": "跳转",
"adminAudit.jumpPlaceholder": "页码",
"adminAudit.status": "状态",
"adminAudit.title": "管理操作审计",
"adminAudit.total": "共 {total} 条",
"apiGrants.forbidden": "仅 administrator 账号且具备团队写权限(或 owner 角色)可管理 API 使用权。",
"apiGrants.intro": "选择下方列表中的模型配置(profile),将「使用权」授予整个团队或指定用户。密钥与 Base URL 仍在「模型管理」中配置;成员获得可见性后,在「模型管理」里为各角色绑定 profile。",
"apiGrants.noShareable": "(暂无可分享的模型配置)",
"apiGrants.openModels": "前往模型管理",
"apiGrants.pickApi": "选择要授权的 API",
"apiGrants.teamHint": "授予后,租户内所有成员在其「选用配置」列表中可见该 API;端点与密钥仍在「模型管理」中维护。",
"apiGrants.teamSection": "授权给整个团队",
"apiGrants.userHint": "仅该用户在其「选用配置」列表中可见;对方在「模型管理」里自行绑定各角色。",
"apiGrants.userSection": "授权给指定用户",
"attachments.archiveMaxDepth": "压缩包最大嵌套深度",
"attachments.archiveMaxEntryBytes": "压缩包单文件最大解压字节",
"attachments.archiveMaxFileCount": "压缩包最大文件数",
"attachments.archiveMaxTotalBytes": "压缩包总解压字节上限",
"attachments.archivePolicyHint": "archive_processor 的统一预算:支持 zip/tar/tgz/gz,限制嵌套层级、文件数与解压体积。",
"attachments.card.archive": "压缩包预算策略",
"attachments.card.media": "图像与视频策略",
"attachments.card.policy": "策略说明",
"attachments.card.tableMode": "表格与工具模式",
"attachments.excelPolicy": "Excel 策略",
"attachments.excelPolicyHint": "针对 Excel/表格附件的解析与 SQL 查询保护策略。该配置写入 oclaw.json(优先级低于环境变量)。",
"attachments.highPreviewWarn": "大表摘要预览行数超过 200,可能显著增加 token 消耗。确认继续?",
"attachments.imageReplayCapChars": "图片结果回放上限字符数",
"attachments.imageReplayCapHint": "历史轮次中,query_image_attachment 的 OCR/描述结果回放上限。范围 600..30000,默认 4000。",
"attachments.invalidNumber": "请输入有效正整数",
"attachments.largePreviewRows": "大表摘要预览行数",
"attachments.loadError": "加载失败",
"attachments.maxCellChars": "单元格最大字符数",
"attachments.maxColumns": "最大保留列数",
"attachments.maxExcelSheets": "Excel 最大 Sheet 数",
"attachments.maxRowsRead": "最大读取行数",
"attachments.resetDefaults": "恢复默认",
"attachments.save": "保存",
"attachments.saved": "已保存",
"attachments.sqlTimeoutHint": "硬超时(wall-clock)。范围 100..120000,默认 8000。命中会返回 sql_timeout 结构化错误。",
"attachments.sqlTimeoutMs": "SQL 超时(ms)",
"attachments.subtitle": "附件处理阈值、预算与回放策略配置",
"attachments.title": "附件",
"attachments.toc.archive": "压缩包",
"attachments.toc.media": "图像/视频",
"attachments.toc.overview": "说明",
"attachments.toc.table": "表格",
"attachments.toolModeEnabled": "启用大表工具模式",
"attachments.toolModeMaxBytes": "工具模式最大文件字节数",
"attachments.toolModeMinRows": "触发工具模式最小行数",
"attachments.videoReplayCapChars": "视频转写结果回放上限字符数",
"attachments.videoReplayCapHint": "历史轮次中,query_video_attachment 的 transcript 结果回放上限。范围 600..30000,默认 4000。",
"attachments.videoTranscriptChunkHint": "query_video_attachment(task=transcript) 默认使用该分块参数落库,便于后续 query_text_attachment 检索。",
"attachments.videoTranscriptChunkOverlap": "视频转写分块重叠",
"attachments.videoTranscriptChunkSize": "视频转写分块大小",
"audit.auditTable": "审计表",
"audit.columns": "显示列",
"audit.empty": "暂无数据",
"audit.note": "支持表格 + JSON 双视图。",
"audit.query": "查询",
"audit.rawJson": "原始 JSON",
"audit.result": "结果",
"audit.sessionIdPlaceholder": "session_id(可选)",
"audit.specialistSummaryHint": "专家侧工具执行与交付摘要(specialist -> core)",
"audit.title": "审计与追踪",
"audit.traceTable": "追踪表",
"auth.consoleUsernameHint": "填写用户名与密码;各菜单仍按账号权限显示。",
"auth.disabled": "账号已被禁用,请联系管理员",
"auth.invalid": "登录失败,请检查凭据",
"auth.login": "登录",
"auth.logout": "退出登录",
"auth.password": "密码",
"auth.username": "用户名",
"auto.after_any_skill_tool_role_prompt_change_run_prewarm_imme": "任何 skill/tool/角色/提示词变更后,请立即预热;复杂变更可直接重启。系统每10分钟自动异步预热一次。",
"auto.prewarm_running_in_background_refreshing_this_page_when_": "[预热] 后台执行中,完成后自动刷新本页数据(含提示词)…",
"boot.loadFailed": "无法加载管理台脚本",
"boot.loadFailedHint": "请确认 /admin/assets/app.js 与 /admin/assets/js/ 可访问。",
"boot.loading": "正在加载管理台…",
"boot.loadingHint": "若长时间停留在此,请检查网络/代理是否拦截外部资源。",
"brand.title": "oliver",
"chat.empty": "暂无消息",
"chat.error": "请求失败",
"chat.loading": "加载中…",
"chat.newSession": "新会话",
"chat.noSessions": "暂无会话,点击新建开始。",
"chat.placeholder": "输入消息…",
"chat.send": "发送",
"chat.sending": "发送中…",
"chat.sessions": "会话",
"common.admin": "管理员",
"common.all": "全部",
"common.auto": "自动",
"common.blacklist": "黑名单",
"common.chinese": "中文",
"common.delete": "删除",
"common.deleteFailed": "删除失败",
"common.english": "英文",
"common.error": "错误",
"common.forbidden": "无权访问该页面。",
"common.mode": "模式",
"common.notFound": "未找到页面",
"common.notLoggedIn": "未登录或会话已过期,请重新登录。",
"common.pageRemoved": "该管理页已在产品精简中移除。",
"common.remove": "删除",
"common.requestFailed": "操作失败",
"common.selectType": "请选择类型",
"common.update": "修改",
"common.updateFailed": "修改失败",
"common.whitelist": "白名单",
"lang.switch": "English",
"memory.applyFilters": "应用筛选",
"memory.avgScore": "平均得分",
"memory.backend": "后端",
"memory.cleanup": "清理低置信记忆",
"memory.clearFilters": "清空筛选",
"memory.config": "向量配置",
"memory.delete": "删除",
"memory.enabled": "开启向量检索",
"memory.filters": "筛选",
"memory.hitCount": "命中总数",
"memory.hits": "最近命中",
"memory.itemCount": "记忆条目数",
"memory.items": "记忆条目",
"memory.minConfidence": "最小写入置信度",
"memory.noData": "暂无记忆数据",
"memory.openPlugins": "打开插件页",
"memory.reindex": "重建向量索引",
"memory.save": "保存配置",
"memory.stats": "统计",
"memory.tenantId": "团队 ID / tenant_id(可选)",
"memory.title": "记忆治理",
"memory.topSources": "最近来源",
"memory.topk": "TopK",
"memory.userId": "user_id(可选)",
"memory.wikiCard": "Wiki",
"memory.wikiPluginFound": "已安装:{name} v{version}",
"memory.wikiPluginMissing": "未检测到 memory-wiki 插件",
"memory.wikiStatus": "插件状态",
"memory.writerEnabled": "开启自动写入",
"models.agentBindingHelp": "可为不同角色指定模型配置;留空则跟随上方全局选用。",
"models.apiKey": "API Key",
"models.baseUrl": "Base URL",
"models.baseUrlPlaceholder": "可选,留空用环境默认",
"models.bindingsExtraHint": "被定向授权或团队共享的 API 会出现在上方「选用配置」列表中;成员需在此为各角色自行选择要绑定的配置。",
"models.bindingsScopeHint": "选用与绑定下拉仅含:内置、您自建的配置,以及管理员授权给团队或您个人的配置(与当前账号可见列表一致)。",
"models.builtinLocked": "内置 Ollama 配置:模式固定为 Ollama,可改地址与模型名。",
"models.cannotDeleteBuiltin": "无法删除内置 Ollama 配置。",
"models.chatModelSelector": "聊天页模型选择器",
"models.chatModelSelectorHint": "控制 Chat 页底部的模型下拉是否显示。",
"models.createBtn": "创建",
"models.createNamePlaceholder": "配置显示名",
"models.dbPath": "当前使用的数据库文件",
"models.delete": "删除此配置",
"models.deleteConfirm": "确定删除该模型配置?此操作不可撤销。",
"models.evalDownloadCsv": "下载全量 CSV",
"models.evalDownloadJson": "下载全量 JSON",
"models.evalLogs": "最近评估日志",
"models.evalLogsPreview": "页内预览",
"models.evalP95": "P95 延迟",
"models.evalSuccess": "成功率",
"models.evalToggle": "Agent Evaluation · 点击展开(页内预览最多 100 条)",
"models.evalTotal": "样本数",
"models.grantTenantBtn": "全团队可用",
"models.grantsEmpty": "尚无定向授权用户。",
"models.grantsGrantBtn": "授权",
"models.grantsHint": "仅 administrator 可管理。被授权用户可在其模型列表中看到并选用此配置(共用密钥)。",
"models.grantsNavHint": "管理谁能看到并选用可分享的模型配置(不含在此页改密钥或端点)。",
"models.grantsRevoke": "撤销",
"models.grantsTitle": "授权其他用户使用当前配置",
"models.grantsUserHint": "定向授权给单个用户:",
"models.labelApiProfile": "API配置",
"models.labelSpecialist": "专家",
"models.linkApiGrants": "打开 API 使用授权",
"models.loadFailed": "加载失败,请展开下方错误信息。",
"models.membersTitle": "各成员可见的模型配置",
"models.mode": "模式",
"models.mode.anthropic": "Anthropic",
"models.mode.google": "Google (Gemini)",
"models.mode.ollama": "Ollama",
"models.mode.openai": "OpenAI 兼容",
"models.mode.openai_responses": "OpenAI Responses",
"models.mode.rule": "规则(无 LLM)",
"models.model": "模型名",
"models.newProfileDefault": "新配置",
"models.noEvalLogs": "暂无评估记录",
"models.noProfiles": "暂无模型配置数据。",
"models.ollamaHint": "Ollama 本地默认 http://127.0.0.1:11434;一般无需 API Key。",
"models.openaiKeyHint": "未配置密钥时,将尝试使用环境变量 OPENAI_API_KEY。",
"models.opsAiHint": "仅用于 v1 / 专家模式:选择专家并绑定 API 配置。",
"models.opsAiTitle": "内部 API模型配置",
"models.phNameZh": "中文名(可选)",
"models.pickModel": "选用配置",
"models.profileName": "配置名称",
"models.profileReadonlyHint": "当前配置为管理员授权,仅可选用与对话,不能改名称、端点或密钥。",
"models.readonly": "只读:当前账号无团队数据写权限(admin:tenant:write)。",
"models.reasoningEffort": "Reasoning 强度",
"models.reasoningEffortDefault": "默认",
"models.reasoningEffortHigh": "高",
"models.reasoningEffortLow": "低",
"models.reasoningEffortMedium": "中",
"models.rememberKey": "记住密钥(存库加密)",
"models.revokeTenantGrant": "撤销全团队",
"models.role.generalist": "通用",
"models.role.image": "图像",
"models.role.memory": "记忆整理",
"models.role.ops": "网络运维",
"models.save": "保存",
"models.sectionActive": "当前模型配置",
"models.sectionApi": "API 与密钥",
"models.sectionBindings": "智能体与模型绑定",
"models.sectionEval": "Agent Evaluation",
"models.sectionNew": "新建模型配置",
"models.subtitle": "模型切换、绑定与评估配置",
"models.tenantGrantOff": "全团队:未授权",
"models.tenantGrantOn": "全团队:已授权",
"models.thinkMode": "Think 模式(仅当前 API)",
"models.thinkModeHint": "开启后仅对此配置回放完整 reasoning_content(默认关闭)",
"models.toc.api": "API配置",
"models.toc.bindings": "绑定",
"models.toc.eval": "评估",
"models.toc.opsAi": "内部API",
"models.toc.overview": "概览",
"models.useGlobal": "(跟随全局)",
"models.vis.builtin": "内置",
"models.vis.global": "全局",
"models.vis.grantTenant": "团队共享",
"models.vis.grantUser": "定向授权",
"models.vis.otherUser": "他人配置",
"models.vis.owned": "我的",
"models.warnKeyInDb": "数据库中已有密钥:若输入框为空,保存时不会覆盖(请先填入新密钥或取消勾选「记住密钥」以清空)。",
"nav.adminAudit": "管理审计",
"nav.apiGrants": "API 使用授权",
"nav.attachments": "附件",
"nav.audit": "审计与追踪",
"nav.chat": "对话",
"nav.group.governance": "治理与审计",
"nav.group.models": "模型与插件",
"nav.group.system": "系统与运行",
"nav.group.users": "用户与配置",
"nav.memory": "记忆",
"nav.models": "模型管理",
"nav.plugins": "插件",
"nav.profile": "用户信息",
"nav.scheduledJobs": "定时任务",
"nav.sessionMonitor": "会话监控",
"nav.skills": "技能",
"nav.stack": "运行时",
"nav.users": "用户管理",
"nav.workspacePaths": "工作区路径",
"notice.noLogin": "v2 已启用登录鉴权:请仅在内网访问",
"plugins.colBoundMcp": "绑定 MCP 数",
"plugins.colSpecialist": "专家",
"plugins.colTools": "tools 数(各 server 累加)",
"plugins.fold.bindingDash": "【4】专家 MCP 绑定看板(自动)",
"plugins.fold.bindingDashHint": "按当前绑定草稿与已安装 MCP 的 tools 列表汇总;专家列表来自 SPECIALISTS 与绑定 mapping 键,随扩展自动增减。",
"plugins.fold.bindingEdit": "【5】MCP 专家绑定(编辑)",
"plugins.fold.install": "【2】从 Cursor JSON 安装",
"plugins.fold.installCursor": "【2】从 Cursor JSON 安装",
"plugins.fold.installCursorHint": "粘贴含 mcpServers 的 Cursor mcp.json,点 Install。Export 下载同结构以便迁移。",
"plugins.fold.installHint": "粘贴 Cursor mcpServers JSON,然后安装。",
"plugins.fold.installed": "【3】已安装 MCP 服务({n})",
"plugins.fold.migrateHint": "安装/改配置/卸载成功后自动写入 oclaw/_local/mcp_registry_migrated.json(Cursor mcpServers),便于换机迁移。",
"plugins.fold.toolPolicy": "【1】工具策略与已注册插件({n})",
"plugins.fold.toolPolicyHint": "Tool policy(并发 / 轮次 / MCP·插件开关)与 Python 工具插件表",
"plugins.nextPage": "下一页",
"plugins.noData": "无数据",
"plugins.pageRange": "第 {start}–{end} / 共 {total} 条",
"plugins.prevPage": "上一页",
"plugins.subtitle": "按功能分区展示,默认折叠;表格支持分页(每页 {n} 条)。",
"plugins.title": "工具插件",
"plugins.toc.binding": "专家绑定",
"plugins.toc.install": "安装",
"plugins.toc.instances": "实例",
"plugins.toc.policy": "策略",
"profile.avatar": "头像",
"profile.avatarHint": "支持 PNG、JPEG、WebP、GIF,最大 2MB。",
"profile.chatPrefs": "对话偏好",
"profile.chooseImage": "选择图片",
"profile.createdAt": "注册时间",
"profile.displayName": "显示名称",
"profile.help": "在此调整显示名称、头像及账号标识;对话页中头像为圆形,助手使用站点 Logo。",
"profile.loadError": "加载失败",
"profile.memoryCurator": "记忆整理专家",
"profile.memoryCuratorDisabled": "停用",
"profile.memoryCuratorEnabled": "启用",
"profile.memoryMode": "记忆模式",
"profile.memoryModeDefault": "默认(可注入)",
"profile.memoryModeStoreOnly": "仅记录不注入",
"profile.openChat": "打开对话",
"profile.removeAvatar": "移除头像",
"profile.role": "角色",
"profile.save": "保存设置",
"profile.saved": "已保存",
"profile.tenantId": "团队 ID",
"profile.uploadError": "上传失败",
"profile.userId": "用户 ID",
"profile.username": "用户名",
"scheduledJobs.all": "全部",
"scheduledJobs.attentionTitle": "需关注任务",
"scheduledJobs.cancel": "取消",
"scheduledJobs.colActions": "操作",
"scheduledJobs.colDelivery": "投递",
"scheduledJobs.colError": "错误",
"scheduledJobs.colFailClass": "分类",
"scheduledJobs.colFinished": "结束时间",
"scheduledJobs.colJob": "任务",
"scheduledJobs.colLastRun": "上次运行",
"scheduledJobs.colName": "名称",
"scheduledJobs.colNextRun": "下次运行",
"scheduledJobs.colPlaybook": "剧本",
"scheduledJobs.colRunStatus": "运行状态",
"scheduledJobs.colSchedule": "计划",
"scheduledJobs.colSpecialist": "专家",
"scheduledJobs.colStatus": "状态",
"scheduledJobs.count": "{count} 个任务",
"scheduledJobs.create": "创建",
"scheduledJobs.createTitle": "新建任务",
"scheduledJobs.delete": "删除",
"scheduledJobs.deleteConfirm": "确定删除该定时任务?",
"scheduledJobs.deliveryWeixin": "微信",
"scheduledJobs.deliveryWhatsapp": "WhatsApp",
"scheduledJobs.edit": "编辑",
"scheduledJobs.editTitle": "编辑任务",
"scheduledJobs.failClass.auth": "权限",
"scheduledJobs.failClass.cancelled": "取消",
"scheduledJobs.failClass.delivery": "投递",
"scheduledJobs.failClass.mcp": "MCP/工具",
"scheduledJobs.failClass.overlap": "叠跑跳过",
"scheduledJobs.failClass.runtime": "运行时",
"scheduledJobs.failClass.stale": "僵死清理",
"scheduledJobs.failClass.timeout": "超时",
"scheduledJobs.fieldExpr": "表达式",
"scheduledJobs.fieldKind": "类型",
"scheduledJobs.fieldName": "名称",
"scheduledJobs.fieldPrompt": "提示词",
"scheduledJobs.fieldSchedule": "计划",
"scheduledJobs.fieldSpecialist": "专家",
"scheduledJobs.fieldWhatsapp": "WhatsApp chat_id",
"scheduledJobs.loading": "Loading…",
"scheduledJobs.menuTitle": "任务操作",
"scheduledJobs.noRuns": "暂无运行记录",
"scheduledJobs.pause": "暂停",
"scheduledJobs.phExpr": "cron / ISO 时间 / 秒数",
"scheduledJobs.phName": "任务名称",
"scheduledJobs.phPrompt": "到期时要执行的提示词",
"scheduledJobs.phSpecialist": "例如 generalist",
"scheduledJobs.phWhatsapp": "可选,群或私聊 chat_id",
"scheduledJobs.playbookNo": "提醒",
"scheduledJobs.playbookPartial": "有 recipe · {n} 步",
"scheduledJobs.playbookYes": "playbook · {n} 步",
"scheduledJobs.requiredFields": "名称、提示词、表达式为必填",
"scheduledJobs.resume": "恢复",
"scheduledJobs.runHistory": "运行记录",
"scheduledJobs.runHistoryHint": "最近运行(自动刷新)",
"scheduledJobs.runNow": "立即运行",
"scheduledJobs.skippedOverlap": "已跳过(叠跑)",
"scheduledJobs.statsClasses": "失败分类",
"scheduledJobs.statsFailRate": "近窗失败率 {pct}%(失败 {failed} / 完成 {finished})",
"scheduledJobs.statsJobsFailed": "上次失败任务 {n}",
"scheduledJobs.statsNone": "近窗无失败",
"scheduledJobs.statsTitle": "失败看板",
"scheduledJobs.statusActive": "运行中",
"scheduledJobs.statusPaused": "已暂停",
"scheduledJobs.triggered": "已触发",
"scheduledJobs.updated": "已保存",
"scheduledJobs.viewRuns": "查看运行记录",
"scheduledJobs.weixinFixed": "微信固定投递:{id}",
"scheduledJobs.weixinMissing": "未找到微信绑定(需管理员渠道身份)",
"secrets.migrateBtn": "立即迁移",
"secrets.migrateDone": "迁移完成:settings={s},profiles={p}",
"secrets.migrateForbidden": "需要 admin:tenant:write 权限。",
"secrets.migrateHint": "检测到旧版 b64 编码的密钥(弱保护)。建议设置 AIA_ASSISTANT_MASTER_KEY 后一键迁移到更安全的加密格式。",
"secrets.migrateNeedKey": "未配置 AIA_ASSISTANT_MASTER_KEY,无法迁移。",
"secrets.migrateNoop": "未发现需要迁移的旧密钥。",
"secrets.migrateTitle": "密钥加密迁移",
"sessionMonitor.activeLogins30m": "活跃登录(30m)",
"sessionMonitor.activeSessions30m": "活跃会话(30m)",
"sessionMonitor.closeDetail": "关闭详情",
"sessionMonitor.exportJson": "导出 JSON",
"sessionMonitor.exportMd": "导出 MD",
"sessionMonitor.filterSession": "筛选会话",
"sessionMonitor.filterUser": "筛选用户",
"sessionMonitor.messages": "消息明细",
"sessionMonitor.noMessages": "该会话暂无消息。",
"sessionMonitor.onlyAdministrator": "仅 administrator 账号可访问该页面。",
"sessionMonitor.pageInfo": "第 {page} 页 / 共 {totalPages} 页",
"sessionMonitor.pageNext": "下一页",
"sessionMonitor.pagePrev": "上一页",
"sessionMonitor.roleAll": "全部",
"sessionMonitor.roleAssistant": "助手",
"sessionMonitor.roleFilter": "角色过滤",
"sessionMonitor.roleTool": "工具",
"sessionMonitor.roleUser": "用户",
"sessionMonitor.selectUserFirst": "请先选择一个用户查看会话。",
"sessionMonitor.sessions": "会话明细",
"sessionMonitor.totalTokensEst": "总 Token(估算)",
"sessionMonitor.totals": "总览统计",
"sessionMonitor.userStats": "用户统计",
"sessionMonitor.usersCount": "用户数",
"sessionMonitor.viewAudit": "查看审计",
"sessionMonitor.viewDetail": "查看详情",
"skills.action.cancel": "取消",
"skills.action.clearCache": "清除缓存",
"skills.action.close": "关闭",
"skills.action.create": "创建技能",
"skills.action.detail": "详情",
"skills.action.disable": "禁用",
"skills.action.enable": "启用",
"skills.action.exportSelfCheck": "导出工具自检 JSON",
"skills.action.exportSkillHealth": "导出技能自检 JSON",
"skills.action.failedOnly": "仅失败项",
"skills.action.install": "安装",
"skills.action.installLocal": "从本地目录安装",
"skills.action.installRegistry": "从 Registry 安装",
"skills.action.installing": "安装中...",
"skills.action.latest": "最新",
"skills.action.menuTitle": "技能操作",
"skills.action.preview": "预览",
"skills.action.refresh": "刷新",
"skills.action.repairAllDeps": "修复全部依赖",
"skills.action.repairDeps": "修复依赖",
"skills.action.repairing": "修复中...",
"skills.action.retry": "重试",
"skills.action.retryableOnly": "仅可重试失败",
"skills.action.run": "运行",
"skills.action.runSelfCheck": "运行工具自检",
"skills.action.runSkillHealth": "运行技能自检",
"skills.action.save": "保存",
"skills.action.saveBinding": "保存技能角色绑定",
"skills.action.saveTrace": "保存 trace 设置",
"skills.action.search": "搜索",
"skills.action.testRun": "试跑...",
"skills.action.testRunArgs": "带参数试跑...",
"skills.action.toggleRawWired": "切换 raw/wired",
"skills.action.traceExposure": "Trace exposure plan",
"skills.action.uninstall": "卸载",
"skills.col.action": "操作",
"skills.col.code": "code",
"skills.col.count": "count",
"skills.col.description": "描述",
"skills.col.detail": "详情",
"skills.col.details": "details",
"skills.col.directBind": "直接绑定",
"skills.col.directSkills": "直接技能数",
"skills.col.docsOnlyNames": "docs-only 名称",
"skills.col.effective": "生效",
"skills.col.enabled": "启用",
"skills.col.errorCode": "error_code",
"skills.col.health": "健康",
"skills.col.internal": "internal",
"skills.col.kind": "类型",
"skills.col.mcpConverted": "MCP 转换",
"skills.col.mode": "模式",
"skills.col.name": "名称",
"skills.col.namesPreview": "名称预览",
"skills.col.otherTools": "其他工具",
"skills.col.outputTruncated": "output_truncated",
"skills.col.parameters": "参数",
"skills.col.path": "路径",
"skills.col.raw": "raw",
"skills.col.readOnly": "只读",
"skills.col.removedMcp": "移除 MCP",
"skills.col.retry": "重试",
"skills.col.risk": "风险",
"skills.col.role": "角色",
"skills.col.runtimeEntry": "运行入口",
"skills.col.skill": "技能",
"skills.col.slug": "slug",
"skills.col.source": "来源",
"skills.col.status": "状态",
"skills.col.tags": "标签",
"skills.col.target": "目标",
"skills.col.timestamp": "时间",
"skills.col.totalEffective": "生效总数",
"skills.col.type": "类型",
"skills.col.version": "版本",
"skills.col.wired": "wired",
"skills.col.workspace": "工作区",
"skills.col.workspaceDocsOnly": "工作区 docs-only",
"skills.col.workspaceResolved": "工作区已解析",
"skills.confirm.uninstall": "卸载技能「{name}」?",
"skills.docsTitle": "oclaw 文档快捷入口:",
"skills.docsTraceTaxonomy": "- oclaw/docs/oclaw-trace-taxonomy.md(trace 字段与阶段)",
"skills.docsTroubleshooting": "- oclaw/docs/oclaw-skill-troubleshooting.md(安装与运行排障)",
"skills.fold.audit": "安装审计",
"skills.fold.binding": "【4】技能角色绑定",
"skills.fold.bindingDash": "角色绑定看板",
"skills.fold.bindingHint": "启用后按角色过滤技能目录:各角色仅见已绑定技能,以及 skills/_workspace/public/ 下的技能。未绑定的非 public 技能会被隐藏。",
"skills.fold.create": "创建技能",
"skills.fold.diagnostics": "【5】诊断",
"skills.fold.effective": "生效技能(绑定 + MCP + 工具)",
"skills.fold.health": "技能健康自检",
"skills.fold.install": "【2】安装",
"skills.fold.installHint": "从 ClawHub 市场、本地目录 / Registry 归档安装,或新建技能。",
"skills.fold.installed": "【3】已安装技能({n})",
"skills.fold.internalTools": "内部工具预览",
"skills.fold.llmTools": "LLM 工具预览",
"skills.fold.localRegistry": "本地目录 / Registry",
"skills.fold.market": "ClawHub 市场",
"skills.fold.mode": "【1】模式",
"skills.fold.modeHint": "Prompt 模式会把 SKILL.md 注入系统提示。市场提供方固定为 ClawHub。",
"skills.fold.toolsSelfCheck": "工具自检",
"skills.hint.bindingEnv": "进程环境变量 AIA_SKILL_ROLE_BINDING_ENABLED 已设置:运行时会覆盖 Admin/SQLite 值。复选框显示生效(env)值。请在 oclaw 进程上取消该变量以仅使用 Admin。(库中存储:{stored},生效:{effective})。",
"skills.hint.bindingPersist": "勾选与各角色技能列表需点击「保存技能角色绑定」后才会写入。",
"skills.hint.diffDiag": "差异 / 诊断",
"skills.hint.expandToLoad": "展开此分区以加载预览",
"skills.hint.expandToSelfCheck": "展开此分区以运行自检",
"skills.hint.internalTools": "按角色预览动态加载的内置工具(public 共享 + 专家作用域)。",
"skills.hint.llmTools": "按角色预览最终注入模型的工具(内部 + MCP + role_mode + MCP 专家绑定)。",
"skills.hint.noSkills": "尚无已安装技能。",
"skills.hint.rawWiredDiff": "raw vs wired 差异(added/removed/changed)",
"skills.hint.skillHealth": "运行可执行技能诊断并展示失败码分布。",
"skills.hint.skippedModules": "跳过的模块 / 工厂错误",
"skills.hint.testRunArgs": "传入可执行技能运行时的 JSON 参数。",
"skills.hint.toolsSelfCheck": "一次性诊断各角色的 internal/wired 工具、角色模式与永久封禁。",
"skills.hintLocalDir": "Local dir: 目录内必须包含 SKILL.md(支持绝对路径)。",
"skills.hintRegistry": "Registry: zip/tar 的 URL(支持 file:// 本地 URI)。",
"skills.label.enableBinding": "启用角色绑定(AIA_SKILL_ROLE_BINDING_ENABLED)",
"skills.label.promptMode": "Prompt 模式(注入 SKILL.md)",
"skills.label.role": "角色",
"skills.modal.install": "技能安装",
"skills.modal.installFail": "技能安装失败",
"skills.modal.installOk": "技能安装成功",
"skills.modal.testRun": "技能试跑",
"skills.modal.testRunNamed": "试跑:{name}",
"skills.ph.body": "SKILL.md 正文 markdown",
"skills.ph.description": "描述",
"skills.ph.limit": "条数",
"skills.ph.localDir": "本地技能目录(含 SKILL.md)",
"skills.ph.marketSearch": "搜索技能(关键词)",
"skills.ph.name": "技能名",
"skills.ph.registry": "Registry 归档 URL(zip/tar)",
"skills.subtitle": "模式、安装、已安装列表、角色绑定与诊断 — 默认折叠。",
"skills.title": "技能",
"skills.toc.binding": "绑定",
"skills.toc.diagnostics": "诊断",
"skills.toc.install": "安装",
"skills.toc.installed": "已安装",
"skills.toc.mode": "模式",
"stack.alerts": "异常告警",
"stack.allRoles": "全部角色",
"stack.cleanup": "清理异常进程",
"stack.cleanupDone": "清理完成,已终止异常进程数:{count}",
"stack.cleanupNone": "未发现可清理的异常进程。",
"stack.clearByPolicy": "按策略清理",
"stack.clearScanCache": "清理扫描缓存",
"stack.configChangedPrewarm": "配置已变更,请立即预热(或重启)",
"stack.down": "停止栈",
"stack.missingRequired": "关键服务未运行,请先启动栈。",
"stack.missingServices": "缺失服务:{services}",
"stack.mustCleanup": "检测到重复 worker,必须先清理再继续操作。",
"stack.noAlerts": "未发现异常。",
"stack.prewarmHistory": "预热历史(最近20次)",
"stack.prewarmNow": "立即预热",
"stack.prewarmSubmitting": "[预热] 提交中…",
"stack.prewarmTitle": "提示词/工具预热",
"stack.prewarmedPrompts": "预热后提示词(按专家)",
"stack.prewarmedPromptsHint": "展示各专家预热后的提示词内容。",
"stack.reloadPrompts": "刷新提示词",
"stack.roleFilter": "角色筛选",
"stack.scanCacheSubtitle": "{dir} · 仅清理 history_entries_*.json 与 state_scan_*.json",
"stack.scanCacheTitle": "扫描缓存文件",
"stack.title": "服务栈",
"stack.up": "启动栈",
"status.running": "运行中",
"status.stopped": "已停止",
"table.action": "动作",
"table.activeLogins30m": "活跃登录(30m)",
"table.activeSessions30m": "活跃会话(30m)",
"table.channel": "渠道",
"table.createdAt": "创建时间",
"table.durationMs": "耗时(ms)",
"table.enabled": "启用",
"table.entryPoint": "入口点",
"table.eventType": "事件类型",
"table.externalUserId": "外部用户ID",
"table.id": "ID",
"table.inputAttachmentIds": "输入附件IDs",
"table.name": "名称",
"table.noOutputAttachment": "无输出附件",
"table.outputAttachmentIds": "输出附件IDs",
"table.outputAttachmentUrls": "输出附件URLs",
"table.parentSpanId": "parent_span_id",
"table.payload": "payload",
"table.pid": "进程号",
"table.provider": "提供方",
"table.reason": "原因",
"table.routeAttachmentIds": "路由附件IDs",
"table.service": "服务",
"table.sessionsCount": "会话数",
"table.spanId": "span_id",
"table.specialist": "专家",
"table.status": "状态",
"table.statusText": "状态",
"table.timestamp": "时间",
"table.totalTokensEst": "总 Token(估算)",
"table.traceId": "trace_id",
"table.user": "用户",
"table.userId": "用户ID",
"table.username": "用户名",
"table.version": "版本",
"tenants.allTenantsHint": "多团队时:「登录所属」仅作提示;实际操作范围以「选择团队」为准。",
"tenants.bindCodes": "绑定码",
"tenants.bindings": "渠道绑定",
"tenants.chatLogin": "Web 登录",
"tenants.chatLoginNo": "否",
"tenants.chatLoginYes": "可(已设密码)",
"tenants.codeDeleteConfirm": "确认删除该绑定码?",
"tenants.codeDeleted": "已删除绑定码:{code}",
"tenants.codeOptional": "Code(可留空自动生成)",
"tenants.codeStatus": "状态",
"tenants.codeUnused": "未使用",
"tenants.codeUsed": "已使用",
"tenants.codeUsedBy": "绑定人",
"tenants.colScope": "登录标识",
"tenants.colTenantId": "团队 ID",
"tenants.colTenantName": "团队名",
"tenants.create": "新建团队",
"tenants.createCode": "生成绑定码",
"tenants.createPlaceholder": "团队名称(默认 Team)",
"tenants.deleteCode": "删除",
"tenants.deleteDisabledCurrent": "不能删除当前登录会话所属团队;请先在登录页使用另一团队的 UUID 登录后再删。",
"tenants.deleteDisabledLast": "至少需保留一个团队。",
"tenants.deleteTenant": "删除团队",
"tenants.deleteTenantConfirm": "确定删除团队「{name}」?将级联删除该团队下用户、绑定与数据,且不可恢复。",
"tenants.deleteUnbound": "删除未绑定用户",
"tenants.deleteUnboundResult": "未绑定用户清理:deleted={deleted}, orphan={orphan}, bound={bound}, total={total}",
"tenants.deleted": "已删除未绑定用户数:{count}",
"tenants.errCannotDeleteCurrentTenant": "不能删除当前登录会话所属团队,请先切换到其他团队再删,或使用其他账号。",
"tenants.errLastTenant": "至少保留一个团队,无法删除。",
"tenants.errTenantDeleteMiss": "删除未生效(可能数据库约束失败),请查看服务端日志。",
"tenants.noBindings": "该团队暂无渠道绑定。",
"tenants.noSessionTenant": "缺少会话团队信息,请重新登录。",
"tenants.noTenants": "暂无团队数据。请先通过绑定流程或初始化脚本创建团队。",
"tenants.noUsers": "该团队暂无用户。",
"tenants.role": "角色",
"tenants.rowActions": "操作",
"tenants.saved": "配置已保存",
"tenants.scopeHint": "「选择团队」决定下方用户/渠道绑定/绑定码所针对的团队。administrator 账号可切换并管理任意团队。上表最后一列标出登录会话最初绑定的团队。",
"tenants.scopeLoginHome": "登录所属",
"tenants.select": "选择团队",
"tenants.sessionTenantMissing": "当前登录会话对应的团队不在列表中,请重新登录或联系管理员。",
"tenants.sourceChannel": "其他渠道",
"tenants.sourceConsole": "控制台",
"tenants.sourceWecom": "企业微信",
"tenants.title": "团队",
"tenants.userSource": "来源",
"tenants.users": "用户",
"theme.catppuccin": "Catppuccin Mocha",
"theme.deepseek": "DeepSeek",
"theme.dracula": "Dracula",
"theme.forest": "森绿",
"theme.github": "GitHub 暗色",
"theme.label": "配色",
"theme.light": "浅色",
"theme.netx": "NetX 暗色",
"theme.nord": "Nord",
"title.adminAudit": "管理审计",
"title.apiGrants": "API 使用授权",
"title.attachments": "附件",
"title.audit": "审计与追踪",
"title.memory": "记忆",
"title.models": "模型管理",
"title.plugins": "插件",
"title.profile": "用户信息",
"title.scheduledJobs": "定时任务",
"title.sessionMonitor": "会话监控",
"title.skills": "技能",
"title.stack": "运行时",
"title.users": "用户管理",
"title.workspacePaths": "工作区路径(按用户)",
"users.accountActions": "账号操作",
"users.accountActive": "启用",
"users.accountDelete": "删除账号",
"users.accountId": "账号ID",
"users.accountLoadHint": "选中用户后,表格列出绑定与实例;需编辑时点「填入表单」,再填写 Bot Secret 等并保存(不会自动填入表单)。",
"users.accountModeExpert": "当前账号模式:专家({specialist})",
"users.accountName": "名称",
"users.accountSave": "保存账号",
"users.botIdRequired": "请先填写 Bot ID",
"users.clearBotSecret": "清除Bot密钥",
"users.colActive": "启用",
"users.colSetRole": "调整角色",
"users.colUser": "用户",
"users.create": "创建用户",
"users.createNamePlaceholder": "名称(登录名,唯一)",
"users.createNameRequired": "请填写名称。",
"users.delete": "删除",
"users.deleteConfirm": "确定删除该用户?不可恢复。",
"users.disable": "禁用",
"users.enable": "启用",
"users.hasBotSecret": "已配Bot密钥",
"users.loadForm": "填入表单",
"users.needUserRead": "需要 admin:user:read 权限以查看与编辑用户列表。",
"users.noBindingsForUser": "暂无企微绑定或已保存实例;用户在微信侧绑定后会出现行,填齐参数后保存。",
"users.noTenant": "请先登录并选择团队",
"users.passwordOptional": "新密码(可选)",
"users.search": "搜索用户",
"users.title": "用户管理",
"users.update": "更新",
"users.wecomAccounts": "企微实例(每用户多个,具名)",
"users.wecomBotId": "Bot ID",
"users.wecomBotSecret": "Bot Secret",
"users.wecomInstanceName": "实例名",
"users.wecomUserEmpty": "请在上表点击一行选中用户",
"users.wecomUserLabel": "用户",
"wa.accessHint": "默认黑名单模式:未授权用户进入待审批;拒绝后进入黑名单/已拒绝列表,可一键加白名单。",
"wa.accessTitle": "WhatsApp 访问控制",
"wa.addContact": "添加联系人",
"wa.addFailed": "添加失败",
"wa.addWhitelist": "加白名单",
"wa.alertGroupHint": "NetX 关键告警将推送到此群;与 Chat 会话删除无关。",
"wa.alertGroupTitle": "WhatsApp 告警群绑定",
"wa.approve": "通过",
"wa.bindFailed": "绑定失败",
"wa.bindSpecialist": "绑定专家",
"wa.blacklistMode": "黑名单模式(默认拒绝,白名单放行)",
"wa.channelExpertOnly": "通道统一走专家模式;选择默认专家即可。",
"wa.colAction": "操作",
"wa.colDeniedAt": "拒绝时间",
"wa.colMessage": "消息",
"wa.colName": "名称",
"wa.colPhone": "电话",
"wa.colTime": "时间",
"wa.colType": "类型",
"wa.contactNotFound": "未找到可删除的联系人",
"wa.deniedHint": "点「拒绝」后用户会进入黑名单联系人,并保留在此列表;可一键加白名单恢复访问。",
"wa.deniedTitle": "已拒绝 / 黑名单记录",
"wa.deny": "拒绝",
"wa.filter": "筛选",
"wa.lang": "语言",
"wa.messageLang": "提示语言",
"wa.mode": "模式",
"wa.namePlaceholder": "显示名(可选)",
"wa.noAlertGroup": "尚未绑定告警群",
"wa.noContacts": "暂无联系人",
"wa.noneDenied": "无已拒绝记录",
"wa.nonePending": "无待审批",
"wa.pendingTitle": "待审批请求",
"wa.phonePlaceholder": "电话,如 +8615601877957",
"wa.pickPending": "从待审批选择联系人…",
"wa.saveBinding": "保存绑定",
"wa.saveConfig": "保存配置",
"wa.selectGroup": "选择群…",
"wa.specialist": "专家",
"wa.testPush": "测试推送",
"wa.whitelistMode": "白名单模式(默认放行,黑名单拒绝)",
"wecom.autoBind": "首条消息自动绑定",
"wecom.autoBindRole": "自动绑定角色",
"wecom.autoBindTenant": "自动绑定团队",
"wecom.botId": "Bot ID",
"wecom.botSecret": "Bot Secret",
"wecom.title": "企业微信配置",
"wecom.unbind": "解绑 WeCom",
"wecom.unbindConfirm": "将清空本地 WeCom 配置和全部 WeCom 绑定/会话,确认继续?",
"wecom.unbindDone": "已解绑 WeCom。identity={ident},session={sess}",
"workspacePaths.allowAny": "允许任意路径(高风险)",
"workspacePaths.allowAnyHint": "仅作用于内置工作区工具(read_file / glob 等)的路径校验;不会放开 MCP filesystem,也不会自动把整盘写进 MCP。需要 MCP 列目录的盘符/目录请填在「额外根路径」或环境变量 AIA_WORKSPACE_EXTRA_ROOTS。",
"workspacePaths.allowHighTools": "允许高风险 Public 工具(全局)",
"workspacePaths.allowHighToolsHint": "开启后将放开 run_command / write_file / edit_file 等高风险 public 工具的模型可见性(等效 AIA_PUBLIC_TOOLS_ALLOW_HIGH=1)。",
"workspacePaths.extraRoots": "额外根路径(| 分隔)",
"workspacePaths.fromDb": "已保存到数据库",
"workspacePaths.help": "为每个用户配置除主工作区(AIA_WORKSPACE_ROOT / 项目根)外可访问的绝对路径,用竖线 | 分隔,例如 D:\\\\|E:\\\\repos\\\\other。与网关环境变量 AIA_WORKSPACE_EXTRA_ROOTS 合并生效。下方「额外根路径」会参与内置工具校验,并在用户聊天时合并进官方 MCP @modelcontextprotocol/server-filesystem 的启动参数(仅该用户)。",
"workspacePaths.load": "加载",
"workspacePaths.save": "保存",
"workspacePaths.selfOnly": "当前账号仅能查看并编辑自己的工作区路径策略(不能代他人配置)。",
"workspacePaths.status": "状态",
"workspacePaths.tenant": "团队",
"workspacePaths.user": "用户",
};