后端:
- 新增 PUT /api/skills/custom/{name}/state 与 /pinned 软归档/恢复 + 钉选 API
- skill_manage 工具: agent 创建写 DB 归属; 删除清理 .usage.json + DB row + cascade 引用; 加 ownership 预校验
- curator 全部软归档(文件保留在 custom/), 加 reason 必填(中文), 修 user_context 跨线程传播 / 协程泄漏 / archive 文件不再移动
- LLM 评审接 ToolErrorHandlingMiddleware, 工具异常自动重试不中止本轮; 替换 create_react_agent 为 create_agent
- skill_list 按当前 agent config.yaml 的 skills 字段过滤(custom agent), lead agent 仍可见全部
- 自我进化提示词对齐 Hermes 风格: 主动询问保存, reason 强制中文且面向用户
- 控制台日志增强: 自动归档/标过时/LLM 合并/删减建议 都按条目输出原因
前端:
- 技能管理页 Tab 改「全部 / 我的」, 正确包含他人发布的 custom 技能(修复 isCustom 互斥 bug)
- 新增「过时 N / 归档 N」右侧抽屉(恢复/查看/立即归档 ⋯ 菜单)
- 新增徽章: 钉选 / 来源(Agent 创建 / 用户上传) / 使用次数展示
- 内置技能徽章修复(原 isBuiltin && isCustom 永远 false)
- 自我进化日志 run_started sentinel 在前端展示为中文分隔条
- 移除冗余 enabled 开关(归档已覆盖此能力, 减少术语)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
637 lines
23 KiB
TypeScript
637 lines
23 KiB
TypeScript
import {
|
|
CompassIcon,
|
|
GraduationCapIcon,
|
|
ImageIcon,
|
|
MicroscopeIcon,
|
|
PenLineIcon,
|
|
ShapesIcon,
|
|
SparklesIcon,
|
|
VideoIcon,
|
|
} from "lucide-react";
|
|
|
|
import type { Translations } from "./types";
|
|
|
|
export const enUS: Translations = {
|
|
// Locale meta
|
|
locale: {
|
|
localName: "English",
|
|
},
|
|
|
|
// Common
|
|
common: {
|
|
home: "Home",
|
|
settings: "Settings",
|
|
delete: "Delete",
|
|
edit: "Edit",
|
|
rename: "Rename",
|
|
share: "Share",
|
|
openInNewWindow: "Open in new window",
|
|
close: "Close",
|
|
more: "More",
|
|
search: "Search",
|
|
download: "Download",
|
|
thinking: "Thinking",
|
|
artifacts: "Artifacts",
|
|
public: "Public",
|
|
custom: "Custom",
|
|
notAvailableInDemoMode: "Not available in demo mode",
|
|
loading: "Loading...",
|
|
version: "Version",
|
|
lastUpdated: "Last updated",
|
|
code: "Code",
|
|
preview: "Preview",
|
|
cancel: "Cancel",
|
|
save: "Save",
|
|
install: "Install",
|
|
create: "Create",
|
|
import: "Import",
|
|
export: "Export",
|
|
exportAsMarkdown: "Export as Markdown",
|
|
exportAsJSON: "Export as JSON",
|
|
exportSuccess: "Conversation exported",
|
|
},
|
|
|
|
// Home
|
|
home: {
|
|
docs: "Docs",
|
|
blog: "Blog",
|
|
},
|
|
|
|
// Welcome
|
|
welcome: {
|
|
greeting: "Hello, again!",
|
|
description:
|
|
"Welcome to CM Assistant. With built-in and custom skills, CM Assistant helps you search on the web, analyze data, and generate artifacts like slides, web pages and do almost anything.",
|
|
|
|
createYourOwnSkill: "Create Your Own Skill",
|
|
createYourOwnSkillDescription:
|
|
"Create your own skill to release the power of CM Assistant. With customized skills,\nCM Assistant can help you search on the web, analyze data, and generate\n artifacts like slides, web pages and do almost anything.",
|
|
},
|
|
|
|
// Clipboard
|
|
clipboard: {
|
|
copyToClipboard: "Copy to clipboard",
|
|
copiedToClipboard: "Copied to clipboard",
|
|
failedToCopyToClipboard: "Failed to copy to clipboard",
|
|
linkCopied: "Link copied to clipboard",
|
|
},
|
|
|
|
// Input Box
|
|
inputBox: {
|
|
placeholder: "How can I assist you today?",
|
|
createSkillPrompt:
|
|
"We're going to build a new skill step by step with `skill-creator`. To start, what do you want this skill to do?",
|
|
addAttachments: "Add attachments",
|
|
mode: "Mode",
|
|
flashMode: "Flash",
|
|
flashModeDescription: "Fast and efficient, but may not be accurate",
|
|
reasoningMode: "Reasoning",
|
|
reasoningModeDescription:
|
|
"Reasoning before action, balance between time and accuracy",
|
|
proMode: "Pro",
|
|
proModeDescription:
|
|
"Reasoning, planning and executing, get more accurate results, may take more time",
|
|
ultraMode: "Ultra",
|
|
ultraModeDescription:
|
|
"Pro mode with subagents to divide work; best for complex multi-step tasks",
|
|
reasoningEffort: "Reasoning Effort",
|
|
reasoningEffortMinimal: "Minimal",
|
|
reasoningEffortMinimalDescription: "Retrieval + Direct Output",
|
|
reasoningEffortLow: "Low",
|
|
reasoningEffortLowDescription: "Simple Logic Check + Shallow Deduction",
|
|
reasoningEffortMedium: "Medium",
|
|
reasoningEffortMediumDescription:
|
|
"Multi-layer Logic Analysis + Basic Verification",
|
|
reasoningEffortHigh: "High",
|
|
reasoningEffortHighDescription:
|
|
"Full-dimensional Logic Deduction + Multi-path Verification + Backward Check",
|
|
searchModels: "Search models...",
|
|
surpriseMe: "Surprise",
|
|
surpriseMePrompt: "Surprise me",
|
|
followupLoading: "Generating follow-up questions...",
|
|
followupConfirmTitle: "Send suggestion?",
|
|
followupConfirmDescription:
|
|
"You already have text in the input. Choose how to send it.",
|
|
followupConfirmAppend: "Append & send",
|
|
followupConfirmReplace: "Replace & send",
|
|
suggestions: [
|
|
{
|
|
suggestion: "Write",
|
|
prompt: "Write a blog post about the latest trends on [topic]",
|
|
icon: PenLineIcon,
|
|
},
|
|
{
|
|
suggestion: "Research",
|
|
prompt:
|
|
"Conduct a deep dive research on [topic], and summarize the findings.",
|
|
icon: MicroscopeIcon,
|
|
},
|
|
{
|
|
suggestion: "Collect",
|
|
prompt: "Collect data from [source] and create a report.",
|
|
icon: ShapesIcon,
|
|
},
|
|
{
|
|
suggestion: "Learn",
|
|
prompt: "Learn about [topic] and create a tutorial.",
|
|
icon: GraduationCapIcon,
|
|
},
|
|
],
|
|
suggestionsCreate: [
|
|
{
|
|
suggestion: "Webpage",
|
|
prompt: "Create a webpage about [topic]",
|
|
icon: CompassIcon,
|
|
},
|
|
{
|
|
suggestion: "Image",
|
|
prompt: "Create an image about [topic]",
|
|
icon: ImageIcon,
|
|
},
|
|
{
|
|
suggestion: "Video",
|
|
prompt: "Create a video about [topic]",
|
|
icon: VideoIcon,
|
|
},
|
|
{
|
|
type: "separator",
|
|
},
|
|
{
|
|
suggestion: "Skill",
|
|
prompt:
|
|
"We're going to build a new skill step by step with `skill-creator`. To start, what do you want this skill to do?",
|
|
icon: SparklesIcon,
|
|
},
|
|
],
|
|
},
|
|
|
|
// Sidebar
|
|
sidebar: {
|
|
newChat: "New chat",
|
|
chats: "Chats",
|
|
recentChats: "Recent chats",
|
|
demoChats: "Demo chats",
|
|
agents: "Agents",
|
|
users: "Users",
|
|
},
|
|
|
|
// Agents
|
|
agents: {
|
|
title: "Agents",
|
|
description:
|
|
"Create and manage custom agents with specialized prompts and capabilities.",
|
|
newAgent: "New Agent",
|
|
emptyTitle: "No custom agents yet",
|
|
emptyDescription:
|
|
"Create your first custom agent with a specialized system prompt.",
|
|
chat: "Chat",
|
|
delete: "Delete",
|
|
deleteConfirm:
|
|
"Are you sure you want to delete this agent? This action cannot be undone.",
|
|
deleteSuccess: "Agent deleted",
|
|
newChat: "New chat",
|
|
createPageTitle: "Design your Agent",
|
|
createPageSubtitle:
|
|
"Describe the agent you want — I'll help you create it through conversation.",
|
|
nameStepTitle: "Name your new Agent",
|
|
nameStepHint:
|
|
"Letters, digits, and hyphens only — stored lowercase (e.g. code-reviewer)",
|
|
nameStepPlaceholder: "e.g. code-reviewer",
|
|
nameStepContinue: "Continue",
|
|
nameStepInvalidError:
|
|
"Invalid name — use only letters, digits, and hyphens",
|
|
nameStepAlreadyExistsError: "An agent with this name already exists",
|
|
nameStepNetworkError:
|
|
"Network request failed — check your network or backend connection",
|
|
nameStepCheckError: "Could not verify name availability — please try again",
|
|
nameStepBootstrapMessage:
|
|
"The new custom agent name is {name}. Let's bootstrap it's **SOUL**.",
|
|
save: "Save agent",
|
|
saving: "Saving agent...",
|
|
saveRequested:
|
|
"Save requested. CM Assistant is generating and saving an initial version now.",
|
|
saveHint:
|
|
"You can save this agent at any time from the top-right menu, even if this is only a first draft.",
|
|
saveCommandMessage:
|
|
"Please save this custom agent now based on everything we have discussed so far. Treat this as my explicit confirmation to save. If some details are still missing, make reasonable assumptions, generate a concise first SOUL.md in English, and call setup_agent immediately without asking me for more confirmation.",
|
|
agentCreatedPendingRefresh:
|
|
"The agent was created, but CM Assistant could not load it yet. Please refresh this page in a moment.",
|
|
more: "More actions",
|
|
agentCreated: "Agent created!",
|
|
startChatting: "Start chatting",
|
|
backToGallery: "Back to Gallery",
|
|
},
|
|
|
|
// Breadcrumb
|
|
breadcrumb: {
|
|
workspace: "Workspace",
|
|
chats: "Chats",
|
|
},
|
|
|
|
// Workspace
|
|
workspace: {
|
|
officialWebsite: "CM Assistant's official website",
|
|
githubTooltip: "CM Assistant on Github",
|
|
settingsAndMore: "Settings and more",
|
|
visitGithub: "CM Assistant on GitHub",
|
|
reportIssue: "Report a issue",
|
|
contactUs: "Contact us",
|
|
about: "About CM Assistant",
|
|
},
|
|
|
|
// Conversation
|
|
conversation: {
|
|
noMessages: "No messages yet",
|
|
startConversation: "Start a conversation to see messages here",
|
|
},
|
|
|
|
// Chats
|
|
chats: {
|
|
searchChats: "Search chats",
|
|
},
|
|
|
|
// Page titles (document title)
|
|
pages: {
|
|
appName: "CM Assistant",
|
|
brandSubtitle: "Smart CM Platform",
|
|
chats: "Chats",
|
|
newChat: "New chat",
|
|
untitled: "Untitled",
|
|
},
|
|
|
|
// Tool calls
|
|
toolCalls: {
|
|
moreSteps: (count: number) => `${count} more step${count === 1 ? "" : "s"}`,
|
|
lessSteps: "Less steps",
|
|
executeCommand: "Execute command",
|
|
presentFiles: "Present files",
|
|
needYourHelp: "Need your help",
|
|
useTool: (toolName: string) => `Use "${toolName}" tool`,
|
|
searchFor: (query: string) => `Search for "${query}"`,
|
|
searchForRelatedInfo: "Search for related information",
|
|
searchForRelatedImages: "Search for related images",
|
|
searchForRelatedImagesFor: (query: string) =>
|
|
`Search for related images for "${query}"`,
|
|
searchOnWebFor: (query: string) => `Search on the web for "${query}"`,
|
|
viewWebPage: "View web page",
|
|
listFolder: "List folder",
|
|
readFile: "Read file",
|
|
writeFile: "Write file",
|
|
clickToViewContent: "Click to view file content",
|
|
writeTodos: "Update to-do list",
|
|
skillInstallTooltip: "Install skill and make it available to CM Assistant",
|
|
},
|
|
|
|
// Subtasks
|
|
uploads: {
|
|
uploading: "Uploading...",
|
|
uploadingFiles: "Uploading files, please wait...",
|
|
},
|
|
|
|
subtasks: {
|
|
subtask: "Subtask",
|
|
executing: (count: number) =>
|
|
`Executing ${count === 1 ? "" : count + " "}subtask${count === 1 ? "" : "s in parallel"}`,
|
|
in_progress: "Running subtask",
|
|
completed: "Subtask completed",
|
|
failed: "Subtask failed",
|
|
},
|
|
|
|
// Token Usage
|
|
tokenUsage: {
|
|
title: "Token Usage",
|
|
label: "Tokens",
|
|
input: "Input",
|
|
output: "Output",
|
|
total: "Total",
|
|
unavailable:
|
|
"No token usage yet. Usage appears only after a successful model response when the provider returns usage_metadata.",
|
|
unavailableShort: "No usage returned",
|
|
},
|
|
|
|
// Shortcuts
|
|
shortcuts: {
|
|
searchActions: "Search actions...",
|
|
noResults: "No results found.",
|
|
actions: "Actions",
|
|
keyboardShortcuts: "Keyboard Shortcuts",
|
|
keyboardShortcutsDescription:
|
|
"Navigate CM Assistant faster with keyboard shortcuts.",
|
|
openCommandPalette: "Open Command Palette",
|
|
toggleSidebar: "Toggle Sidebar",
|
|
},
|
|
|
|
// Settings
|
|
settings: {
|
|
title: "Settings",
|
|
description: "Adjust how CM Assistant looks and behaves for you.",
|
|
sections: {
|
|
appearance: "Appearance",
|
|
memory: "Memory",
|
|
tools: "Tools",
|
|
skills: "Skills",
|
|
notification: "Notification",
|
|
about: "About",
|
|
},
|
|
memory: {
|
|
title: "Memory",
|
|
description:
|
|
"CM Assistant automatically learns from your conversations in the background. These memories help CM Assistant understand you better and deliver a more personalized experience.",
|
|
empty: "No memory data to display.",
|
|
rawJson: "Raw JSON",
|
|
exportButton: "Export memory",
|
|
exportSuccess: "Memory exported",
|
|
importButton: "Import memory",
|
|
importConfirmTitle: "Import memory?",
|
|
importConfirmDescription:
|
|
"This will overwrite your current memory with the selected JSON backup.",
|
|
importFileLabel: "Selected file",
|
|
importInvalidFile:
|
|
"Failed to read the selected memory file. Please choose a valid JSON export.",
|
|
importSuccess: "Memory imported",
|
|
manualFactSource: "Manual",
|
|
addFact: "Add fact",
|
|
addFactTitle: "Add memory fact",
|
|
editFactTitle: "Edit memory fact",
|
|
addFactSuccess: "Fact created",
|
|
editFactSuccess: "Fact updated",
|
|
clearAll: "Clear all memory",
|
|
clearAllConfirmTitle: "Clear all memory?",
|
|
clearAllConfirmDescription:
|
|
"This will remove all saved summaries and facts. This action cannot be undone.",
|
|
clearAllSuccess: "All memory cleared",
|
|
factDeleteConfirmTitle: "Delete this fact?",
|
|
factDeleteConfirmDescription:
|
|
"This fact will be removed from memory immediately. This action cannot be undone.",
|
|
factDeleteSuccess: "Fact deleted",
|
|
factContentLabel: "Content",
|
|
factCategoryLabel: "Category",
|
|
factConfidenceLabel: "Confidence",
|
|
factContentPlaceholder: "Describe the memory fact you want to save",
|
|
factCategoryPlaceholder: "context",
|
|
factConfidenceHint: "Use a number between 0 and 1.",
|
|
factSave: "Save fact",
|
|
factValidationContent: "Fact content cannot be empty.",
|
|
factValidationConfidence: "Confidence must be a number between 0 and 1.",
|
|
noFacts: "No saved facts yet.",
|
|
summaryReadOnly:
|
|
"Summary sections are read-only for now. You can currently add, edit, or delete individual facts, or clear all memory.",
|
|
memoryFullyEmpty: "No memory saved yet.",
|
|
factPreviewLabel: "Fact to delete",
|
|
searchPlaceholder: "Search memory",
|
|
filterAll: "All",
|
|
filterFacts: "Facts",
|
|
filterSummaries: "Summaries",
|
|
noMatches: "No matching memory found.",
|
|
markdown: {
|
|
overview: "Overview",
|
|
userContext: "User context",
|
|
work: "Work",
|
|
personal: "Personal",
|
|
topOfMind: "Top of mind",
|
|
historyBackground: "History",
|
|
recentMonths: "Recent months",
|
|
earlierContext: "Earlier context",
|
|
longTermBackground: "Long-term background",
|
|
updatedAt: "Updated at",
|
|
facts: "Facts",
|
|
empty: "(empty)",
|
|
table: {
|
|
category: "Category",
|
|
confidence: "Confidence",
|
|
confidenceLevel: {
|
|
veryHigh: "Very high",
|
|
high: "High",
|
|
normal: "Normal",
|
|
unknown: "Unknown",
|
|
},
|
|
content: "Content",
|
|
source: "Source",
|
|
createdAt: "CreatedAt",
|
|
view: "View",
|
|
},
|
|
},
|
|
},
|
|
appearance: {
|
|
themeTitle: "Theme",
|
|
themeDescription:
|
|
"Choose how the interface follows your device or stays fixed.",
|
|
system: "System",
|
|
light: "Light",
|
|
dark: "Dark",
|
|
systemDescription: "Match the operating system preference automatically.",
|
|
lightDescription: "Bright palette with higher contrast for daytime.",
|
|
darkDescription: "Dim palette that reduces glare for focus.",
|
|
languageTitle: "Language",
|
|
languageDescription: "Switch between languages.",
|
|
},
|
|
tools: {
|
|
title: "Tools",
|
|
description: "Manage the configuration and enabled status of MCP tools.",
|
|
},
|
|
skills: {
|
|
title: "Agent Skills",
|
|
description:
|
|
"Manage the configuration and enabled status of the agent skills.",
|
|
createSkill: "Create skill",
|
|
installSkill: "Install skill",
|
|
goToEvolution: "Skill evolution",
|
|
emptyTitle: "No agent skill yet",
|
|
emptyDescription:
|
|
"Put your agent skill folders under the `/skills/custom` folder under the root folder of CM Assistant.",
|
|
emptyButton: "Create Your First Skill",
|
|
badgeBuiltin: "Built-in",
|
|
badgeMine: "Mine",
|
|
badgeFromOthers: "From others",
|
|
badgeFromOthersTitle: "Owned by user {user_id}",
|
|
badgePublished: "Published",
|
|
badgePublishedTitle: "Visible to all users",
|
|
badgeStale: "Stale",
|
|
badgeStaleTitle: "Idle for a long time — flagged by the curator",
|
|
badgeArchived: "Archived",
|
|
badgeArchivedTitle: "Archived — recoverable from the archive drawer",
|
|
badgePinned: "Pinned",
|
|
badgePinnedTitle: "Pinned — the curator will never auto-archive this skill",
|
|
badgeSourceAgent: "Agent-created",
|
|
badgeSourceAgentTitle: "Auto-generated by an agent during a conversation",
|
|
badgeSourceUpload: "Uploaded",
|
|
badgeSourceUploadTitle: "Manually uploaded or edited by a user",
|
|
tabAll: "All",
|
|
tabMine: "Mine",
|
|
entryStale: "Stale {count}",
|
|
entryArchived: "Archived {count}",
|
|
useCountInline: "Used {count} times",
|
|
useCountInlineZero: "Not used yet",
|
|
publishAction: "Publish",
|
|
unpublishAction: "Unpublish",
|
|
publishSuccess: "Skill published",
|
|
unpublishSuccess: "Skill unpublished",
|
|
pinAction: "Pin (prevent auto-archive)",
|
|
unpinAction: "Unpin",
|
|
pinSuccess: "Pinned",
|
|
unpinSuccess: "Unpinned",
|
|
deleteAction: "Delete skill",
|
|
deleteConfirm:
|
|
"Delete skill \"{name}\"? This cannot be undone and the skill will be removed from any agent that referenced it.",
|
|
deleteSuccess: "Skill deleted",
|
|
stateSheet: {
|
|
archivedTitle: "Archived skills",
|
|
archivedDescription:
|
|
"These skills have been archived by you or the curator and can be restored at any time.",
|
|
staleTitle: "Stale skills",
|
|
staleDescription:
|
|
"These skills have been idle for a while and were flagged by the curator. Using one again will auto-revive it; you can also act on them here.",
|
|
empty: "Nothing here",
|
|
actionRestore: "Restore",
|
|
actionArchiveNow: "Archive now",
|
|
actionView: "View",
|
|
actionPin: "Pin",
|
|
actionUnpin: "Unpin",
|
|
actionDelete: "Delete permanently",
|
|
moreMenu: "More",
|
|
archivedAt: "Archived {when}",
|
|
lastUsedAt: "Last used {when}",
|
|
neverUsed: "Never used",
|
|
restoreSuccess: "Restored",
|
|
archiveSuccess: "Archived",
|
|
pinSuccess: "Pinned",
|
|
unpinSuccess: "Unpinned",
|
|
},
|
|
viewDialog: {
|
|
title: "Skill details",
|
|
descriptionLabel: "Description",
|
|
stateLabel: "State",
|
|
sourceLabel: "Source",
|
|
useCountLabel: "Use count",
|
|
lastUsedLabel: "Last used",
|
|
close: "Close",
|
|
},
|
|
installDialog: {
|
|
title: "Install skill",
|
|
dropHint: "Drop a .zip or .skill archive here, or",
|
|
chooseFile: "Choose file",
|
|
validating: "Validating archive…",
|
|
installing: "Installing…",
|
|
replace: "Replace existing",
|
|
install: "Install",
|
|
cancel: "Cancel",
|
|
nameLabel: "Name",
|
|
descriptionLabel: "Description",
|
|
licenseLabel: "License",
|
|
toolsLabel: "Allowed tools",
|
|
warningsLabel: "Warnings",
|
|
conflictCustom:
|
|
"A custom skill named '{name}' is already installed. Use 'Replace existing' to overwrite (its enabled state will be kept).",
|
|
conflictPublic:
|
|
"A built-in public skill named '{name}' already exists and cannot be overwritten.",
|
|
conflictPublicAdminHint:
|
|
"A built-in public skill named '{name}' exists. Switch to 'Built-in' and click 'Replace existing' to overwrite.",
|
|
installSuccess: "Skill '{name}' installed.",
|
|
installSuccessReplaced: "Skill '{name}' replaced.",
|
|
rejectInvalidExt: "Only .zip or .skill files are accepted.",
|
|
targetCategoryLabel: "Install to",
|
|
categoryCustom: "Custom skill",
|
|
categoryPublic: "Built-in (admin)",
|
|
},
|
|
},
|
|
skillEvolution: {
|
|
title: "Skill Evolution",
|
|
description:
|
|
"Manage the skill curator: let the agent age out, archive, and consolidate its self-created skills in the background.",
|
|
backToSkills: "Back to skills",
|
|
status: {
|
|
title: "Status",
|
|
enabled: "Enabled",
|
|
disabled: "Disabled",
|
|
paused: "Paused",
|
|
runCount: "Total runs",
|
|
runCountUnit: "",
|
|
lastRunAt: "Last run",
|
|
lastRunNever: "Never",
|
|
lastRunSummary: "Last summary",
|
|
lastRunSummaryEmpty: "—",
|
|
skillCounts: "Skills",
|
|
active: "Active",
|
|
stale: "Stale",
|
|
archived: "Archived",
|
|
total: "Total",
|
|
runNow: "Run now",
|
|
runStarted: "Background run started",
|
|
},
|
|
config: {
|
|
title: "Configuration",
|
|
description:
|
|
"Saves to skill_evolution.json and hot-reloads — no restart required.",
|
|
enabledLabel: "Enable skill evolution",
|
|
enabledHelper:
|
|
"When off, the agent cannot create or modify skills under custom/.",
|
|
curatorEnabledLabel: "Curator runs automatically",
|
|
curatorEnabledHelper:
|
|
"When off, the curator only runs when triggered from this page.",
|
|
intervalHoursLabel: "Run interval (hours)",
|
|
intervalHoursHelper:
|
|
"Minimum hours between automatic curator runs.",
|
|
staleAfterDaysLabel: "Stale threshold (days)",
|
|
staleAfterDaysHelper:
|
|
"Skills inactive for this many days are flagged stale.",
|
|
archiveAfterDaysLabel: "Archive threshold (days)",
|
|
archiveAfterDaysHelper:
|
|
"Stale skills inactive for this many additional days are archived.",
|
|
moderationModelLabel: "Moderation model (optional)",
|
|
moderationModelHelper:
|
|
"Leave blank to use the default chat model.",
|
|
save: "Save changes",
|
|
saveSuccess: "Configuration updated",
|
|
reset: "Reset",
|
|
},
|
|
logs: {
|
|
title: "Recent run logs",
|
|
description:
|
|
"Latest curator run only; cleared on backend restart.",
|
|
empty: "No logs yet. Clicking 'Run now' will populate this panel.",
|
|
autoRefresh: "Auto-refresh (2s)",
|
|
refresh: "Refresh now",
|
|
},
|
|
},
|
|
notification: {
|
|
title: "Notification",
|
|
description:
|
|
"CM Assistant only sends a completion notification when the window is not active. This is especially useful for long-running tasks so you can switch to other work and get notified when done.",
|
|
requestPermission: "Request notification permission",
|
|
deniedHint:
|
|
"Notification permission was denied. You can enable it in your browser's site settings to receive completion alerts.",
|
|
testButton: "Send test notification",
|
|
testTitle: "CM Assistant",
|
|
testBody: "This is a test notification.",
|
|
notSupported: "Your browser does not support notifications.",
|
|
disableNotification: "Disable notification",
|
|
},
|
|
acknowledge: {
|
|
emptyTitle: "Acknowledgements",
|
|
emptyDescription: "Credits and acknowledgements will show here.",
|
|
},
|
|
},
|
|
|
|
adminUsers: {
|
|
title: "User Management",
|
|
description: "View all registered users and their associated skill and agent counts.",
|
|
email: "Email",
|
|
role: "Role",
|
|
userId: "User ID",
|
|
skillCount: "Skills",
|
|
agentCount: "Agents",
|
|
roleAdmin: "Admin",
|
|
roleUser: "User",
|
|
empty: "No users found",
|
|
},
|
|
|
|
notifications: {
|
|
title: "Notifications",
|
|
bellAria: "Open notifications",
|
|
unreadShort: "{count} unread",
|
|
markAllRead: "Mark all read",
|
|
empty: "No notifications",
|
|
deleteAria: "Delete notification",
|
|
},
|
|
};
|