mirror of
https://gitee.com/mateos/mateclaw.git
synced 2026-09-15 20:08:18 +08:00
2136 lines
82 KiB
TypeScript
2136 lines
82 KiB
TypeScript
export default {
|
||
app: {
|
||
title: 'MateClaw - AI Assistant',
|
||
},
|
||
common: {
|
||
save: 'Save',
|
||
cancel: 'Cancel',
|
||
reset: 'Reset',
|
||
edit: 'Edit',
|
||
delete: 'Delete',
|
||
create: 'Create',
|
||
update: 'Update',
|
||
loading: 'Loading...',
|
||
enabled: 'Enabled',
|
||
disabled: 'Disabled',
|
||
default: 'Default',
|
||
view: 'View',
|
||
copy: 'Copy',
|
||
copied: 'Copied',
|
||
confirm: 'Confirm',
|
||
close: 'Close',
|
||
add: 'Add',
|
||
search: 'Search',
|
||
clear: 'Clear',
|
||
expandSidebar: 'Expand sidebar',
|
||
collapseSidebar: 'Collapse sidebar',
|
||
manageWorkspaces: 'Manage Workspaces',
|
||
show: 'Show',
|
||
hide: 'Hide',
|
||
on: 'On',
|
||
off: 'Off',
|
||
yes: 'Yes',
|
||
no: 'No',
|
||
configure: 'Configure',
|
||
enable: 'Enable',
|
||
disable: 'Disable',
|
||
},
|
||
auth: {
|
||
changePassword: 'Change Password',
|
||
oldPassword: 'Current Password',
|
||
newPassword: 'New Password',
|
||
confirmPassword: 'Confirm New Password',
|
||
fieldsRequired: 'Please enter current and new password',
|
||
passwordMismatch: 'New passwords do not match',
|
||
passwordChanged: 'Password changed successfully',
|
||
passwordChangeFailed: 'Failed to change password',
|
||
},
|
||
chat: {
|
||
status: {
|
||
idle: 'Ready',
|
||
streaming: 'Generating...',
|
||
error: 'Disconnected',
|
||
},
|
||
thinking: 'Thinking',
|
||
thinkingInProgress: 'Thinking...',
|
||
stopped: 'Generation stopped',
|
||
interrupted: 'Interrupted',
|
||
expandLines: 'Show more ({hidden} more lines)',
|
||
collapse: 'Show less',
|
||
failed: 'Generation failed',
|
||
compressionSummary: 'Previous conversations summarized',
|
||
compressionWithCount: '{count} previous messages summarized',
|
||
loadingOlder: 'Loading older messages...',
|
||
loadOlderMessages: 'Click to load older messages',
|
||
retry: 'Retry',
|
||
errorCode: 'Error code',
|
||
error: {
|
||
rate_limit: {
|
||
title: 'Too many requests',
|
||
description: 'You\'ve exceeded the rate limit. The server is temporarily unable to process your request.',
|
||
action: 'Please wait a moment before retrying, or reduce consecutive submissions.',
|
||
},
|
||
auth_expired: {
|
||
title: 'Session expired',
|
||
description: 'Your login session has expired and you need to sign in again.',
|
||
action: 'You will be redirected to the login page.',
|
||
},
|
||
provider_auth_error: {
|
||
title: 'Model authentication failed',
|
||
description: 'The current model\'s API key is invalid or has expired. This is unrelated to your login session.',
|
||
action: 'Open Settings → Models to check and update the API key.',
|
||
},
|
||
forbidden: {
|
||
title: 'Access denied',
|
||
description: 'You don\'t have permission to perform this action.',
|
||
action: 'Please contact the administrator for access.',
|
||
},
|
||
bad_request: {
|
||
title: 'Invalid request',
|
||
description: 'The request was malformed and could not be processed by the server.',
|
||
action: 'Please check your input and try again. If the problem persists, contact the administrator.',
|
||
},
|
||
server_error: {
|
||
title: 'Server error',
|
||
description: 'The server encountered an error while processing your request.',
|
||
action: 'Please try again later. If the problem persists, contact the administrator.',
|
||
},
|
||
service_unavailable: {
|
||
title: 'Service unavailable',
|
||
description: 'The service is currently under maintenance or temporarily overloaded.',
|
||
action: 'Please try again later.',
|
||
},
|
||
timeout: {
|
||
title: 'Request timed out',
|
||
description: 'The server did not respond within the expected time. This may be due to network issues or high server load.',
|
||
action: 'Please check your network connection and try again.',
|
||
},
|
||
network: {
|
||
title: 'Network error',
|
||
description: 'Unable to connect to the server. Please check your network connection.',
|
||
action: 'Verify your network is working and try again.',
|
||
},
|
||
unknown: {
|
||
title: 'Unexpected error',
|
||
description: 'An unexpected problem occurred during the request.',
|
||
action: 'Please try again. If the problem persists, contact the administrator.',
|
||
},
|
||
},
|
||
copy: 'Copy',
|
||
copied: 'Copied',
|
||
regenerate: 'Regenerate',
|
||
ttsPlay: 'Read Aloud',
|
||
ttsStop: 'Stop Reading',
|
||
conversations: 'Conversations',
|
||
newChat: 'New Chat',
|
||
loadingAgents: 'Loading agents...',
|
||
selectAgent: 'Please select an agent',
|
||
noConversations: 'No conversations yet',
|
||
startNewChat: 'Start a new chat above',
|
||
messages: '{count} messages',
|
||
configModel: 'Configure Model',
|
||
clearMessages: 'Clear Messages',
|
||
goToModelSettings: 'Go to Model Settings',
|
||
configModelFirst: 'Please configure a model first',
|
||
modelUnavailable: 'Current model is unavailable',
|
||
noActiveModel: 'No active model. Go to Model Management to select an available model before chatting.',
|
||
providerNotReady: 'The active model belongs to {name}, but this provider is not fully configured. Please complete the API Key or Base URL in Model Management.',
|
||
noAvailableModel: 'No available model.',
|
||
loadAgentsFailed: 'Failed to load agents',
|
||
loadModelFailed: 'Failed to load model state',
|
||
loadConversationsFailed: 'Failed to load conversations',
|
||
loadMessagesFailed: 'Failed to load messages',
|
||
deleteConversationFailed: 'Failed to delete conversation',
|
||
deleteConfirm: 'Delete this conversation? This cannot be undone.',
|
||
switchModelFailed: 'Failed to switch model',
|
||
searchModel: 'Search models…',
|
||
noMatchModel: 'No matching models',
|
||
// RFC-073: liveness hints shown in the model dropdown header
|
||
modelLivenessUnprobed: 'Checking availability',
|
||
modelLivenessCooldown: 'In cooldown ({seconds}s remaining)',
|
||
// RFC-074 PR-2: empty-state inside the model dropdown
|
||
noProvidersConfigured: 'No models available yet',
|
||
goConfigure: 'Configure',
|
||
uploadFailed: 'File upload failed',
|
||
dropToUpload: 'Drop files or folders here',
|
||
copyFailed: 'Copy failed',
|
||
dateToday: 'Today',
|
||
dateYesterday: 'Yesterday',
|
||
dateLast7Days: 'Last 7 Days',
|
||
dateEarlier: 'Earlier',
|
||
suggestionIntro: 'Remember I hate cilantro and love iced Americanos — remind me when ordering',
|
||
suggestionPoem: 'Search for today\'s biggest tech news and summarize it in one sentence',
|
||
suggestionCode: 'Ask the writer agent to polish a draft I\'m about to send you',
|
||
suggestionWeather: 'What skills and tools do you have right now? Show me how to add more',
|
||
approvalRequired: 'Approval Required',
|
||
approve: 'Approve',
|
||
deny: 'Deny',
|
||
approvalHint: 'or type <code>/approve</code> / <code>/deny</code>',
|
||
approved: '✅ Approved',
|
||
denied: '⛔ Denied',
|
||
approvalWaiting: 'Awaiting confirmation below...',
|
||
pendingApprovalPlaceholder: 'Type /approve or /deny to respond...',
|
||
messagePlaceholder: 'Type a message... (Enter to send, Shift+Enter for new line)',
|
||
thinkingOn: 'Deep thinking enabled',
|
||
thinkingOff: 'Click to enable deep thinking',
|
||
thinkingUnsupported: 'Current model does not support deep thinking',
|
||
subtitle: 'Your intelligent AI assistant powered by Spring AI Alibaba',
|
||
// Queue related
|
||
queuedSending: 'Sending queued message...',
|
||
queuedWillSend: 'Queued, will send after current step',
|
||
queuedCancel: 'Cancel',
|
||
queuedReplace: 'Message queued. Press Enter to replace...',
|
||
queuedBadge: '{count} queued',
|
||
// Stream status
|
||
streamPreparingContext: 'Preparing context...',
|
||
streamReadingMemory: 'Reading memory...',
|
||
streamReasoning: 'Analyzing...',
|
||
streamDraftingAnswer: 'Drafting answer...',
|
||
streamSummarizingObservations: 'Organizing information...',
|
||
streamThinking: 'Thinking...',
|
||
streamGenerating: 'Generating...',
|
||
streamExecutingTool: 'Executing tool...',
|
||
streamAwaitingApproval: 'Awaiting approval',
|
||
streamFinalizing: 'Finalizing...',
|
||
streamFailed: 'Interrupted',
|
||
streamInterrupting: 'Interrupting...',
|
||
streamQueued: 'Queued, waiting...',
|
||
streamReconnecting: 'Reconnecting...',
|
||
streamStopped: 'Stopped',
|
||
streamCompleted: 'Completed',
|
||
streamPreparingContextDetail: 'Collecting the current question, conversation history, and required context.',
|
||
streamReadingMemoryDetail: 'Looking up the most relevant long-term memory and recent notes for this question.',
|
||
streamReasoningDetail: 'Comparing options and organizing the answer structure based on the available information.',
|
||
streamDraftingAnswerDetail: 'The main analysis is done. Turning it into a readable answer now.',
|
||
streamSummarizingObservationsDetail: 'A larger tool result just came back. Condensing the key points before continuing.',
|
||
streamThinkingDetail: 'The model is still reasoning internally. Visible text may not appear immediately.',
|
||
streamGeneratingDetail: 'Visible output has started and more content should appear shortly.',
|
||
streamExecutingToolDetail: 'Reading files, querying data, or running the necessary operation for a more accurate answer.',
|
||
streamAwaitingApprovalDetail: 'Your confirmation is required before continuing.',
|
||
streamFinalizingDetail: 'Saving the result and closing out this response.',
|
||
streamFailedDetail: 'This run did not finish cleanly, but you can retry or keep asking follow-up questions.',
|
||
streamSlowShort: 'This step is taking a bit longer than usual, but it is still running.',
|
||
streamSlowSummarizing: 'Organizing a larger tool result. This step often takes longer.',
|
||
streamSlowReasoning: 'The model is doing heavier analysis here. This is not a frozen connection.',
|
||
streamSlowGeneral: 'Processing is still ongoing. The time is currently being spent in internal analysis.',
|
||
// Approval bar
|
||
approvalAllow: 'Allow',
|
||
approvalExecute: 'to execute?',
|
||
// Time format
|
||
timeJustNow: 'Just now',
|
||
timeMinutesAgo: '{n}m ago',
|
||
timeHoursAgo: '{n}h ago',
|
||
},
|
||
nav: {
|
||
dashboard: 'Dashboard',
|
||
chat: 'Chat',
|
||
control: 'Control',
|
||
channels: 'Channels',
|
||
sessions: 'Sessions',
|
||
agent: 'Agent',
|
||
workspace: 'Workspace',
|
||
agentContext: 'Agent Context',
|
||
skills: 'Skills',
|
||
wiki: 'Wiki KB',
|
||
tools: 'Tools',
|
||
plugins: 'Plugins',
|
||
core: 'Core',
|
||
connect: 'Connect',
|
||
system: 'System',
|
||
datasources: 'Datasources',
|
||
mcpServers: 'MCP Servers',
|
||
settingsGroup: 'Settings',
|
||
agents: 'Agents',
|
||
security: 'Security',
|
||
tokenUsage: 'Token Usage',
|
||
cronJobs: 'Cron Jobs',
|
||
settings: 'Settings',
|
||
logout: 'Logout',
|
||
memory: 'Memory',
|
||
themeLight: 'Light',
|
||
themeDark: 'Dark',
|
||
themeSystem: 'System',
|
||
themeLabel: 'Appearance',
|
||
languageLabel: 'Language',
|
||
appearance: 'Appearance & Language',
|
||
roleUser: 'User',
|
||
roleAdmin: 'Admin',
|
||
},
|
||
doctor: {
|
||
title: 'System Diagnostics',
|
||
checking: 'Checking...',
|
||
allGood: 'All systems healthy',
|
||
hasWarnings: '{count} warning(s)',
|
||
hasErrors: '{count} issue(s)',
|
||
refresh: 'Re-check',
|
||
lastChecked: 'Checked {time} ago',
|
||
diagnose: 'Diagnose',
|
||
},
|
||
settings: {
|
||
title: 'Settings',
|
||
kicker: 'Configuration',
|
||
layoutDesc: 'Tune models, system behavior, and media capabilities without letting the product collapse into a pile of controls.',
|
||
sections: {
|
||
model: 'Model Management',
|
||
system: 'System',
|
||
image: 'Image Generation',
|
||
tts: 'Text-to-Speech',
|
||
stt: 'Speech Recognition',
|
||
music: 'Music Generation',
|
||
video: 'Video Generation',
|
||
about: 'About',
|
||
advanced: 'Advanced',
|
||
},
|
||
modelTitle: 'Model Management',
|
||
modelDesc: 'Manage provider presets and default model selection',
|
||
systemTitle: 'System',
|
||
systemDesc: 'Language and runtime behavior settings',
|
||
aboutTitle: 'About MateClaw',
|
||
aboutDesc: 'Version and system information',
|
||
about: {
|
||
heroDesc: 'A personal AI operating system that places models inside a continuous loop of context, memory, execution, knowledge, and delivery.',
|
||
foundationTitle: 'Built With',
|
||
pillars: {
|
||
contextTitle: 'Keep context continuous',
|
||
contextDesc: 'Models, knowledge, workspace, and the active task live inside the same frame instead of starting over every turn.',
|
||
executionTitle: 'Make execution real',
|
||
executionDesc: 'Tools, channels, and async tasks are the real execution surface, not bolted-on extras.',
|
||
memoryTitle: 'Make memory compound',
|
||
memoryDesc: 'Memory is shaped, recalled, and turned into leverage for the next task.',
|
||
},
|
||
},
|
||
model: {
|
||
title: 'Model Management',
|
||
desc: 'Configure model providers, credentials, and model lists',
|
||
addProvider: 'Add Provider',
|
||
localProviders: 'Local Models',
|
||
cloudProviders: 'Cloud Models',
|
||
active: 'Active',
|
||
setActive: 'Set Active',
|
||
configured: 'Configured',
|
||
partial: 'Partial',
|
||
unavailable: 'Unavailable',
|
||
builtin: 'Built-in',
|
||
custom: 'Custom',
|
||
notSet: 'Not set',
|
||
noModels: 'No models',
|
||
baseUrl: 'Base URL',
|
||
apiKey: 'API Key',
|
||
apiKeyInput: 'Enter API Key',
|
||
leaveBlankKeep: 'Leave blank to keep the current value',
|
||
modelCount: '{count} models',
|
||
createTitle: 'Add Provider',
|
||
editTitle: 'Provider Settings',
|
||
manageTitle: 'Manage Models',
|
||
addModel: 'Add Model',
|
||
// Inline API Key on the provider card — primary entry point for the
|
||
// 90% case (paste a key, hit save). Modal stays for advanced fields.
|
||
inlineApiKeyTitle: 'API Key',
|
||
inlineApiKeyPlaceholder: 'Paste API key and press Enter',
|
||
inlineApiKeyMasked: 'Set ••••••••',
|
||
inlineApiKeyChange: 'Change',
|
||
inlineApiKeySaving: 'Saving…',
|
||
inlineApiKeySaved: 'API key saved',
|
||
inlineApiKeySaveFailed: 'Failed to save API key',
|
||
inlineApiKeyEnvHint: 'Or set {var} in your environment and restart',
|
||
// Headline status pill on the card — what the user reads first.
|
||
statusNotSet: 'NOT SET',
|
||
statusReady: 'READY',
|
||
statusError: 'ERROR',
|
||
modelCountAvailable: '{count} models available',
|
||
activeChanged: 'Active model updated',
|
||
providerSaved: 'Provider settings saved',
|
||
providerDeleted: 'Provider deleted',
|
||
modelAdded: 'Model added',
|
||
modelRemoved: 'Model removed',
|
||
modelAddFailed: 'Failed to add model',
|
||
modelRemoveFailed: 'Failed to remove model',
|
||
activeChangeFailed: 'Failed to change active model',
|
||
deleteConfirm: 'Delete provider "{name}"?',
|
||
removeConfirm: 'Remove model "{name}"?',
|
||
generateConfigInvalidJson: 'Generate kwargs is not valid JSON',
|
||
generateConfigMustBeObject: 'Generate kwargs must be a JSON object',
|
||
advancedSettings: 'Advanced Settings',
|
||
protocolHint: 'This selects the provider API protocol, not an internal class name.',
|
||
protocolOpenAI: 'OpenAI Compatible (Chat Completions)',
|
||
protocolAnthropic: 'Anthropic (Messages API)',
|
||
protocolGemini: 'Gemini Native',
|
||
protocolDashScope: 'DashScope Native',
|
||
advancedHint: 'Use this for generation options such as temperature, max_tokens, and top_p.',
|
||
fallbackPriorityHint: 'Pool try-order (lower wins): 0 = excluded, 1 = first in line, 2 = second, and so on. Providers sharing the same value are tried in alphabetical order of their ID.',
|
||
fallbackBadge: 'Preferred #{priority}',
|
||
fallbackBadgeTitle: 'Position in the available pool — lower numbers are tried first',
|
||
// RFC-009 Phase 4: provider pool status badges
|
||
poolBadgeInPool: 'In Pool',
|
||
poolBadgeInPoolTitle: 'Passed startup probe; participates in failover',
|
||
poolBadgeRemoved: 'Removed',
|
||
poolBadgeRemovedTitle: 'Removed from pool ({source}): {message}',
|
||
poolBadgeCooldown: 'Cooling Down',
|
||
poolBadgeCooldownTitle: 'Recent failures; recovers automatically in {seconds}s',
|
||
poolSourceAuthError: 'API key invalid',
|
||
poolSourceBilling: 'Billing/quota issue',
|
||
poolSourceModelNotFound: 'Model not found',
|
||
poolSourceInitProbe: 'Startup probe failed',
|
||
poolSourceManual: 'Manually removed',
|
||
poolReprobe: 'Reprobe',
|
||
poolReprobing: 'Probing...',
|
||
poolReprobeOk: 'Probe passed; back in the available pool',
|
||
poolReprobeFail: 'Probe failed: {error}',
|
||
// RFC-073: status-pill labels driven by Liveness
|
||
livenessLive: 'Live',
|
||
livenessCooldown: 'Cooling down',
|
||
livenessRemoved: 'Disconnected',
|
||
livenessUnprobed: 'Probing',
|
||
livenessUnprobedTooltip: 'Checking availability after startup; will refresh shortly',
|
||
livenessUnconfigured: 'Needs setup',
|
||
// RFC-074 PR-2: enable / disable / drawer
|
||
enableProviderCta: '+ Enable Provider',
|
||
addCustomProvider: '+ Custom',
|
||
enable: 'Enable',
|
||
disable: 'Disable',
|
||
alreadyEnabled: 'Enabled',
|
||
disableConfirm: 'Disable provider "{name}"? It will disappear from the dropdown but its config is kept — you can re-enable any time.',
|
||
defaultSwitchedToast: 'Default model switched to {provider} / {model}',
|
||
addProviderDrawerTitle: 'Add Provider',
|
||
addProviderDrawerSubtitle: 'Once enabled the provider appears in the model dropdown. Cloud providers still need an API key after enabling.',
|
||
catalogEmpty: 'Catalog is empty',
|
||
catalogSearchPlaceholder: 'Search providers…',
|
||
catalogSearchEmpty: 'No providers match “{query}”',
|
||
enabledToast: 'Enabled {name}',
|
||
emptyTitle: 'No providers enabled yet',
|
||
emptyDesc: 'Enable a built-in from the catalog, or create a custom provider.',
|
||
searchHint: 'When enabled, the LLM will use its built-in search engine to retrieve real-time information (DashScope/Kimi/OpenAI supported).',
|
||
searchStrategyDefault: 'Default',
|
||
oauthTitle: 'OpenAI OAuth Login',
|
||
oauthLogin: 'OAuth Login',
|
||
oauthConnected: 'Connected',
|
||
oauthDisconnected: 'Not Connected',
|
||
oauthDisconnect: 'Disconnect',
|
||
oauthHint: 'Sign in with your OpenAI account to use ChatGPT Plus/Pro member quota (not API credits).',
|
||
oauthLoginSuccess: 'OpenAI OAuth login successful',
|
||
oauthRevokeSuccess: 'OpenAI OAuth disconnected',
|
||
// RFC-062: Claude Code OAuth (subscription piggyback)
|
||
claudeCodeOauthDetect: 'Detect Claude Code Login',
|
||
claudeCodeOauthHint: 'Reuses your local Claude Code Pro/Max subscription. Sign in via the Claude Code app first, then click "Detect" to pick up the credentials.',
|
||
claudeCodeOauthInstructions: 'No Claude Code credentials found. Install Claude Code, sign in with a Pro/Max account, then click Detect again.',
|
||
claudeCodeOauthRevokeHint: 'Sign out from the Claude Code app to revoke. MateClaw does not modify Claude Code\'s on-disk credentials.',
|
||
fields: {
|
||
providerId: 'Provider ID',
|
||
providerName: 'Provider Name',
|
||
defaultBaseUrl: 'Default Base URL',
|
||
apiKeyPrefix: 'API Key Prefix',
|
||
protocol: 'Protocol',
|
||
generateKwargs: 'Generate Kwargs (JSON)',
|
||
fallbackPriority: 'Pool Try-Order',
|
||
enableSearch: 'Built-in Search',
|
||
searchStrategy: 'Search Strategy',
|
||
modelId: 'Model ID',
|
||
modelDisplayName: 'Display Name',
|
||
},
|
||
actions: {
|
||
manageModels: 'Manage Models',
|
||
providerSettings: 'Settings',
|
||
},
|
||
hints: {
|
||
openai: 'OpenAI defaults to https://api.openai.com/v1',
|
||
azureOpenai: 'Use an Azure resource endpoint such as https://<resource>.openai.azure.com/openai/v1',
|
||
anthropic: 'Anthropic defaults to https://api.anthropic.com',
|
||
ollama: 'Ollama usually runs locally at http://localhost:11434',
|
||
lmstudio: 'LM Studio usually exposes an OpenAI-compatible endpoint at http://localhost:1234/v1',
|
||
gemini: 'Gemini defaults to https://generativelanguage.googleapis.com',
|
||
openrouter: 'OpenRouter defaults to https://openrouter.ai/api/v1, aggregating multiple model providers',
|
||
zhipu: 'Zhipu AI defaults to https://open.bigmodel.cn/api/paas/v4',
|
||
zhipuIntl: 'Zhipu AI International uses https://open.z.ai/api/paas/v4',
|
||
volcengine: 'Volcano Engine (Doubao) defaults to https://ark.cn-beijing.volces.com/api/v3, requires an endpoint created on the Volcengine Ark platform',
|
||
openaiCompatible: 'OpenAI-compatible services usually use a Base URL ending with /v1',
|
||
},
|
||
discovery: {
|
||
discover: 'Discover Models',
|
||
discovering: 'Discovering...',
|
||
testConnection: 'Test Connection',
|
||
testing: 'Testing...',
|
||
testModel: 'Test',
|
||
testingModel: 'Testing...',
|
||
discoveredTitle: 'Discovered New Models',
|
||
discoveredCount: 'Found {total} models, {count} are new',
|
||
noNewModels: 'No new models found, all remote models already exist',
|
||
selectAll: 'Select All',
|
||
addSelected: 'Add Selected',
|
||
adding: 'Adding...',
|
||
addedCount: '{count} models added',
|
||
connectionOk: 'Connection successful',
|
||
connectionFail: 'Connection failed',
|
||
latency: 'Latency {ms}ms',
|
||
modelOk: 'Model available',
|
||
modelFail: 'Model unavailable',
|
||
probeVerified: 'Verified',
|
||
probeVerifiedTitle: 'Verified reachable',
|
||
probeFailedBanner: '⚠ {count} discovered model(s) failed the reachability probe and were not listed above:',
|
||
probeUnreachable: 'not reachable',
|
||
},
|
||
},
|
||
fields: {
|
||
name: 'Display Name',
|
||
provider: 'Provider',
|
||
modelName: 'Model Name',
|
||
description: 'Description',
|
||
temperature: 'Temperature',
|
||
maxTokens: 'Max Tokens',
|
||
topP: 'Top P',
|
||
language: 'Language',
|
||
streamEnabled: 'Stream Response',
|
||
debugMode: 'Debug Mode',
|
||
searchEnabled: 'Enable Search',
|
||
searchProvider: 'Search Provider',
|
||
searchFallbackEnabled: 'Fallback on Failure',
|
||
serperApiKey: 'Serper API Key',
|
||
serperBaseUrl: 'Serper Base URL',
|
||
tavilyApiKey: 'Tavily API Key',
|
||
tavilyBaseUrl: 'Tavily Base URL',
|
||
duckduckgoEnabled: 'DuckDuckGo (Keyless)',
|
||
searxngBaseUrl: 'SearXNG Base URL',
|
||
sttEnabled: 'Enable Speech Recognition',
|
||
sttProvider: 'Preferred STT Provider',
|
||
sttFallbackEnabled: 'Provider Fallback',
|
||
musicEnabled: 'Enable Music Generation',
|
||
musicProvider: 'Preferred Music Provider',
|
||
musicFallbackEnabled: 'Provider Fallback',
|
||
ttsEnabled: 'Enable Text-to-Speech',
|
||
ttsProvider: 'Preferred TTS Provider',
|
||
ttsFallbackEnabled: 'Provider Fallback',
|
||
ttsAutoMode: 'Auto Read Aloud',
|
||
ttsSpeed: 'Speed',
|
||
imageEnabled: 'Enable Image Generation',
|
||
imageProvider: 'Preferred Image Provider',
|
||
imageFallbackEnabled: 'Provider Fallback',
|
||
openaiStatus: 'OpenAI Status',
|
||
videoEnabled: 'Enable Video Generation',
|
||
videoProvider: 'Preferred Video Provider',
|
||
videoFallbackEnabled: 'Provider Fallback',
|
||
dashscopeStatus: 'DashScope Status',
|
||
zhipuApiKey: 'Zhipu API Key',
|
||
zhipuBaseUrl: 'Zhipu API Base URL',
|
||
falApiKey: 'fal.ai API Key',
|
||
klingAccessKey: 'Kling Access Key',
|
||
klingSecretKey: 'Kling Secret Key',
|
||
runwayApiKey: 'Runway API Key',
|
||
minimaxApiKey: 'MiniMax API Key',
|
||
minimaxRegion: 'MiniMax API Region',
|
||
},
|
||
hints: {
|
||
provider: 'Current implementation applies DashScope model options at runtime.',
|
||
language: 'Interface language preference stored in backend settings.',
|
||
streamEnabled: 'Controls whether chat prefers streaming output in UI settings.',
|
||
debugMode: 'Reserved for showing more execution details later.',
|
||
searchEnabled: 'When disabled, the search tool will be unavailable to agents.',
|
||
searchProvider: 'Primary search provider used when the search tool is invoked.',
|
||
searchFallbackEnabled: 'Automatically try the other provider when the primary one fails.',
|
||
serperApiKey: 'API key for Google Serper search, get it from serper.dev.',
|
||
serperBaseUrl: 'Usually no need to change unless using a custom proxy.',
|
||
tavilyApiKey: 'API key for Tavily search, get it from tavily.com.',
|
||
tavilyBaseUrl: 'Usually no need to change unless using a custom proxy.',
|
||
duckduckgoEnabled: 'Free keyless search fallback. No API key required. Enabled by default as a zero-config fallback.',
|
||
searxngBaseUrl: 'Self-hosted SearXNG instance URL. Auto-configured when deploying via Docker.',
|
||
sttEnabled: 'Enable speech-to-text for voice messages. Both providers reuse existing API keys.',
|
||
sttProvider: 'Select preferred STT provider. Auto mode picks the first available one.',
|
||
sttFallbackEnabled: 'Automatically try other configured providers if the preferred one fails.',
|
||
openaiSttInfo: 'Reuses OpenAI API Key from Model Management. Whisper model, supports multilingual auto-detection.',
|
||
dashscopeSttInfo: 'Reuses DashScope API Key from Model Management. Paraformer Realtime over WebSocket — strong Chinese recognition, sub-second latency.',
|
||
musicEnabled: 'Enable to let Agent use the music generation tool. Google Lyria reuses Google Key.',
|
||
musicProvider: 'Select preferred music provider. Auto mode prioritizes Google Lyria.',
|
||
musicFallbackEnabled: 'Automatically try other configured providers if the preferred one fails.',
|
||
googleLyriaInfo: 'Reuses Google API Key from Model Management. Lyria 3 model, supports lyrics and instrumental.',
|
||
minimaxMusicInfo: 'Reuses MiniMax API Key from video settings. music-2.5+ model, supports lyrics and instrumental.',
|
||
ttsEnabled: 'Enable to use TTS via Read Aloud button or auto mode. Edge TTS is free, no API key needed.',
|
||
ttsProvider: 'Select preferred TTS provider. Auto mode prioritizes free Edge TTS.',
|
||
ttsFallbackEnabled: 'Automatically try other configured providers if the preferred one fails.',
|
||
ttsAutoMode: 'off = manual read aloud only, always = auto-play voice for every AI reply.',
|
||
ttsSpeed: 'Speech playback speed. 1.0 is normal speed.',
|
||
edgeTtsInfo: 'Microsoft Edge built-in TTS. Free to use, supports Chinese, English, Japanese and more. Auto-detects language.',
|
||
dashscopeTtsInfo: 'Reuses DashScope API Key from Model Management. Uses CosyVoice model with multiple Chinese voices.',
|
||
openaiTtsInfo: 'Reuses OpenAI API Key from Model Management. Supports alloy, echo, nova and other voice styles.',
|
||
imageEnabled: 'Enable to let Agent use the image generation tool. Requires at least one configured image provider.',
|
||
imageProvider: 'Select preferred image provider. Auto mode picks the first available one.',
|
||
imageFallbackEnabled: 'Automatically try other configured providers if the preferred one fails.',
|
||
dashscopeImageStatus: 'Reuses the DashScope API Key configured in Model Management. No extra setup needed.',
|
||
openaiImageStatus: 'Reuses the OpenAI API Key configured in Model Management. No extra setup needed.',
|
||
zhipuImageApiKey: 'Get from bigmodel.cn. CogView-3-Flash model is free. Shared with video generation.',
|
||
falImageApiKey: 'Get from fal.ai for Flux image generation models. Shared with video generation.',
|
||
googleImagenInfo: 'Reuses Google API Key from Model Management. Supports Gemini image generation and Imagen 4.0.',
|
||
minimaxImageInfo: 'Reuses MiniMax API Key from video settings. image-01 model, multiple aspect ratios, up to 9 images.',
|
||
videoEnabled: 'Enable to let Agent use the video generation tool. Requires at least one configured video provider.',
|
||
videoProvider: 'Select preferred video provider. Auto mode picks the first available one.',
|
||
videoFallbackEnabled: 'Automatically try other configured providers if the preferred one fails.',
|
||
dashscopeVideoStatus: 'Reuses the DashScope API Key configured in Model Management. No extra setup needed.',
|
||
zhipuApiKey: 'Get from bigmodel.cn. CogVideoX-Flash model is free.',
|
||
zhipuBaseUrl: 'Usually no need to change unless using a custom proxy.',
|
||
falApiKey: 'Get from fal.ai. One key accesses Kling, Runway, Luma and more.',
|
||
klingAccessKey: 'Get from Kuaishou Open Platform for Kling video generation API.',
|
||
klingSecretKey: 'Paired with Access Key for JWT authentication.',
|
||
runwayApiKey: 'Get from runwayml.com. Supports gen4.5, gen4_turbo flagship models.',
|
||
minimaxApiKey: 'Get from minimaxi.com. Hailuo video with free quota, excellent for Chinese scenes.',
|
||
minimaxRegion: 'Choose the API host. Mainland China accounts must use the CN endpoint; others use Global.',
|
||
},
|
||
searchTitle: 'Search Service',
|
||
searchDesc: 'Configure the built-in search tool provider and API credentials',
|
||
sttTitle: 'Speech Recognition',
|
||
sttDesc: 'Configure STT speech-to-text with OpenAI Whisper and DashScope Paraformer',
|
||
sttProviderOptions: { auto: 'Auto Select' },
|
||
sttProviderTags: { reuseLlmKey: 'Reuses LLM API Key' },
|
||
musicTitle: 'Music Generation',
|
||
musicDesc: 'Configure AI music generation with Google Lyria and MiniMax Music',
|
||
musicProviderOptions: { auto: 'Auto Select' },
|
||
musicProviderTags: { reuseLlmKey: 'Reuses LLM API Key', sharedWithVideo: 'Shared with Video' },
|
||
ttsTitle: 'Text-to-Speech',
|
||
ttsDesc: 'Configure TTS with Edge TTS (free), OpenAI TTS, and DashScope CosyVoice',
|
||
ttsProviderOptions: {
|
||
auto: 'Auto Select',
|
||
},
|
||
ttsProviderTags: {
|
||
free: 'Free',
|
||
noKeyNeeded: 'No API Key Needed',
|
||
reuseLlmKey: 'Reuses LLM API Key',
|
||
},
|
||
ttsAutoModeOptions: {
|
||
off: 'Off (Manual only)',
|
||
always: 'Always Auto Read',
|
||
},
|
||
imageTitle: 'Image Generation',
|
||
imageDesc: 'Configure AI image generation with DashScope, OpenAI DALL-E, fal.ai Flux, and Zhipu CogView',
|
||
imageProviderOptions: {
|
||
auto: 'Auto Select',
|
||
},
|
||
imageProviderTags: {
|
||
reuseLlmKey: 'Reuses LLM API Key',
|
||
freeQuota: 'Free Quota Available',
|
||
configuredInModels: 'See Model Settings',
|
||
sharedWithVideo: 'Shared with Video',
|
||
},
|
||
videoTitle: 'Video Generation',
|
||
videoDesc: 'Configure AI video generation capabilities, supporting text-to-video and image-to-video',
|
||
videoProviderOptions: {
|
||
auto: 'Auto Select',
|
||
},
|
||
videoProviderTags: {
|
||
reuseLlmKey: 'Reuses LLM API Key',
|
||
freeQuota: 'Free Quota Available',
|
||
configuredInModels: 'See Model Settings',
|
||
},
|
||
minimaxRegionGlobal: 'Global (api.minimax.io)',
|
||
minimaxRegionCn: 'China (api.minimaxi.com)',
|
||
actions: {
|
||
setDefault: 'Set Default',
|
||
saveSystem: 'Save System Settings',
|
||
},
|
||
messages: {
|
||
loadFailed: 'Failed to load settings',
|
||
saveSuccess: 'Settings saved successfully',
|
||
saveFailed: 'Failed to save settings',
|
||
deleteConfirm: 'Delete this model preset?',
|
||
modelSaved: 'Model preset saved',
|
||
modelDeleted: 'Model preset deleted',
|
||
defaultChanged: 'Default model updated',
|
||
},
|
||
languageOptions: {
|
||
zhCN: 'Simplified Chinese',
|
||
enUS: 'English',
|
||
},
|
||
},
|
||
agentContext: {
|
||
kicker: 'Context Studio',
|
||
title: 'Agent Context',
|
||
desc: 'Manage prompt files and memory for agents',
|
||
selectAgent: 'Select Agent',
|
||
noAgent: 'Please select an agent first',
|
||
files: 'Files',
|
||
coreFiles: 'Core Files',
|
||
coreFilesDesc: 'Enabled files are concatenated in order as Agent system prompt',
|
||
newFile: 'New File',
|
||
noFiles: 'No files yet',
|
||
selectFile: 'Select a file from the left to view its content',
|
||
fileContent: 'Edit Markdown content here...',
|
||
preview: 'Preview',
|
||
editOnly: 'Edit',
|
||
splitView: 'Split',
|
||
modified: 'Modified',
|
||
saveSuccess: 'Saved successfully',
|
||
saveFailed: 'Failed to save',
|
||
deleteConfirm: 'Delete file "{name}"?',
|
||
deleteSuccess: 'File deleted',
|
||
deleteFailed: 'Failed to delete',
|
||
promptUpdated: 'System prompt files updated',
|
||
promptUpdateFailed: 'Failed to update system prompt files',
|
||
newFileTitle: 'New File',
|
||
newFilePlaceholder: 'Enter filename (e.g. AGENTS.md)',
|
||
newFileHint: 'Filename must end with .md',
|
||
fileExists: 'Filename already exists',
|
||
invalidFilename: 'Please enter a valid .md filename',
|
||
loadFailed: 'Failed to load file list',
|
||
loadFileFailed: 'Failed to load file content',
|
||
},
|
||
agents: {
|
||
title: 'Agent Management',
|
||
desc: 'Create, edit, and manage your AI agents',
|
||
newAgent: 'New Agent',
|
||
templates: {
|
||
title: 'Choose a Template',
|
||
desc: 'Start with a pre-configured agent, or create from scratch.',
|
||
skip: 'Start from Scratch',
|
||
applied: 'Agent created from template',
|
||
},
|
||
search: 'Search agents...',
|
||
tabs: {
|
||
all: 'All',
|
||
react: 'ReAct',
|
||
planExecute: 'Plan-Execute',
|
||
enabled: 'Enabled',
|
||
disabled: 'Disabled',
|
||
basic: 'Basic',
|
||
skills: 'Skills',
|
||
tools: 'Tools',
|
||
providers: 'Providers',
|
||
context: 'Context',
|
||
},
|
||
columns: {
|
||
name: 'Name',
|
||
description: 'Description',
|
||
agentType: 'Type',
|
||
modelName: 'Model',
|
||
tags: 'Tags',
|
||
enabled: 'Status',
|
||
updateTime: 'Updated',
|
||
actions: 'Actions',
|
||
},
|
||
status: {
|
||
enabled: 'Enabled',
|
||
disabled: 'Disabled',
|
||
},
|
||
emptyTitle: 'No Agents',
|
||
emptyDesc: 'Create your first agent to get started',
|
||
modal: {
|
||
newTitle: 'New Agent',
|
||
editTitle: 'Edit Agent',
|
||
},
|
||
fields: {
|
||
name: 'Name',
|
||
icon: 'Icon',
|
||
type: 'Type',
|
||
description: 'Description',
|
||
systemPrompt: 'System Prompt',
|
||
maxIterations: 'Max Iterations',
|
||
defaultThinkingLevel: 'Default Thinking Level',
|
||
tags: 'Tags',
|
||
enabled: 'Enabled',
|
||
},
|
||
thinkingLevels: {
|
||
auto: 'Follow Model',
|
||
off: 'Off',
|
||
low: 'Low',
|
||
medium: 'Standard',
|
||
high: 'Deep',
|
||
max: 'Maximum',
|
||
},
|
||
types: {
|
||
react: 'ReAct (Tool Calling)',
|
||
planExecute: 'Plan-and-Execute',
|
||
},
|
||
actions: {
|
||
edit: 'Edit',
|
||
delete: 'Delete',
|
||
create: 'Create',
|
||
update: 'Save',
|
||
},
|
||
placeholders: {
|
||
name: 'Agent name',
|
||
icon: 'Emoji or URL',
|
||
description: 'Brief description',
|
||
systemPrompt: 'You are a helpful AI assistant...',
|
||
tags: 'tag1,tag2',
|
||
},
|
||
messages: {
|
||
noDescription: 'No description',
|
||
deleteConfirm: 'Are you sure you want to delete this agent? This cannot be undone.',
|
||
loadFailed: 'Failed to load agents',
|
||
saveFailed: 'Failed to save agent',
|
||
saveSuccess: 'Agent saved',
|
||
deleteFailed: 'Failed to delete agent',
|
||
deleteSuccess: 'Agent deleted',
|
||
toggleFailed: 'Failed to toggle agent status',
|
||
toggleSuccess: 'Status updated',
|
||
},
|
||
binding: {
|
||
skillsHint: 'Select skills this agent can use. Leave empty to use all enabled skills.',
|
||
toolsHint: 'Select tools this agent can use. Leave empty to use all enabled tools.',
|
||
providersHint: 'Preferred provider order for this agent (lower index tried first). Leave empty to use the global available-pool order. Cooling-down or pool-removed providers are still skipped automatically.',
|
||
providersAddHint: 'Click a provider below to add it to the preference list:',
|
||
noSkills: 'No skills available',
|
||
noTools: 'No tools available',
|
||
noProviderPreferences: 'No preferences set — the agent uses the global fallback chain order.',
|
||
contextHint: 'Manage context files (e.g. AGENT.md) that define this agent\'s behavior, knowledge, and instructions.',
|
||
goToContext: 'Edit Context Files',
|
||
},
|
||
},
|
||
security: {
|
||
title: 'Security',
|
||
kicker: 'Governance',
|
||
layoutDesc: 'Boundaries, approvals, audit, and workspace governance have to speak the same language or the system will not feel trustworthy.',
|
||
sections: {
|
||
toolGuard: 'Tool Guard',
|
||
fileGuard: 'File Guard',
|
||
auditLogs: 'Audit Logs',
|
||
members: 'Members',
|
||
workspaces: 'Workspaces',
|
||
activity: 'Activity',
|
||
},
|
||
activity: {
|
||
title: 'Activity Log',
|
||
desc: 'View all create, update, and delete operations on workspace resources.',
|
||
allActions: 'All Actions',
|
||
allResources: 'All Resources',
|
||
loading: 'Loading...',
|
||
noEvents: 'No activity yet',
|
||
columns: {
|
||
time: 'Time',
|
||
user: 'User',
|
||
action: 'Action',
|
||
resource: 'Resource',
|
||
name: 'Name',
|
||
ip: 'IP',
|
||
},
|
||
},
|
||
members: {
|
||
title: 'Workspace Members',
|
||
desc: 'Manage members and roles for the current workspace.',
|
||
addMember: 'Add Member',
|
||
noMembers: 'No members found.',
|
||
loading: 'Loading...',
|
||
columns: {
|
||
user: 'User',
|
||
role: 'Role',
|
||
joined: 'Joined',
|
||
actions: 'Actions',
|
||
},
|
||
roles: {
|
||
owner: 'Owner',
|
||
admin: 'Admin',
|
||
member: 'Member',
|
||
viewer: 'Viewer',
|
||
},
|
||
addDialog: {
|
||
title: 'Add Member',
|
||
userId: 'User ID',
|
||
userIdPlaceholder: 'Enter user ID',
|
||
user: 'Select User',
|
||
userPlaceholder: 'Search username…',
|
||
username: 'Username',
|
||
usernamePlaceholder: 'Enter username',
|
||
usernameHint: 'Account will be created automatically if user does not exist',
|
||
password: 'Password',
|
||
passwordPlaceholder: 'Required for new users',
|
||
passwordHint: 'Leave empty for existing users, required for new users',
|
||
nickname: 'Nickname',
|
||
nicknamePlaceholder: 'Optional display name',
|
||
role: 'Role',
|
||
},
|
||
actions: {
|
||
remove: 'Remove',
|
||
cancel: 'Cancel',
|
||
confirm: 'Confirm',
|
||
},
|
||
messages: {
|
||
addSuccess: 'Member added successfully',
|
||
addFailed: 'Failed to add member',
|
||
updateSuccess: 'Role updated successfully',
|
||
updateFailed: 'Failed to update role',
|
||
removeConfirm: 'Are you sure you want to remove this member?',
|
||
removeSuccess: 'Member removed',
|
||
removeFailed: 'Failed to remove member',
|
||
},
|
||
},
|
||
workspaces: {
|
||
title: 'Workspaces',
|
||
desc: 'Manage workspaces for your organization.',
|
||
manage: 'Manage Workspaces',
|
||
newWorkspace: 'New Workspace',
|
||
loading: 'Loading workspaces...',
|
||
noWorkspaces: 'No workspaces found.',
|
||
current: 'Current',
|
||
columns: {
|
||
name: 'Name',
|
||
slug: 'Slug',
|
||
description: 'Description',
|
||
basePath: 'Working Directory',
|
||
created: 'Created',
|
||
actions: 'Actions',
|
||
},
|
||
createDialog: {
|
||
title: 'New Workspace',
|
||
name: 'Name',
|
||
namePlaceholder: 'e.g. Engineering',
|
||
slug: 'Slug',
|
||
slugPlaceholder: 'e.g. engineering',
|
||
slugHint: 'Slug cannot be changed after creation.',
|
||
description: 'Description',
|
||
descriptionPlaceholder: 'Optional description',
|
||
basePath: 'Working Directory',
|
||
basePathPlaceholder: 'e.g. /home/user/project or D:\\codes\\MyProject',
|
||
basePathHint: 'Restrict agent file access to this directory. Leave empty for no restriction.',
|
||
},
|
||
editDialog: {
|
||
title: 'Edit Workspace',
|
||
},
|
||
deleteDialog: {
|
||
title: 'Delete Workspace',
|
||
confirm: 'Are you sure you want to delete {name}? This will remove all resources associated with this workspace.',
|
||
},
|
||
actions: {
|
||
edit: 'Edit',
|
||
delete: 'Delete',
|
||
cancel: 'Cancel',
|
||
create: 'Create',
|
||
save: 'Save',
|
||
},
|
||
messages: {
|
||
saveSuccess: 'Workspace saved successfully',
|
||
saveFailed: 'Failed to save workspace',
|
||
deleteSuccess: 'Workspace deleted',
|
||
deleteFailed: 'Failed to delete workspace',
|
||
},
|
||
},
|
||
toolGuard: {
|
||
title: 'Tool Guard',
|
||
desc: 'Manage tool invocation security rules and global guard settings',
|
||
enabled: 'Enable Tool Guard',
|
||
enabledHint: 'When enabled, tool invocations will be checked against security rules',
|
||
guardScope: 'Guard Scope',
|
||
scopeAll: 'All Tools',
|
||
scopeSelected: 'Selected Tools',
|
||
guardedTools: 'Guarded Tools',
|
||
guardedToolsPlaceholder: 'Type tool name and press Enter',
|
||
deniedTools: 'Denied Tools',
|
||
deniedToolsPlaceholder: 'Type tool name and press Enter',
|
||
rules: 'Security Rules',
|
||
rulesDesc: 'Manage built-in and custom security rules',
|
||
addRule: 'Add Rule',
|
||
editRule: 'Edit Rule',
|
||
columns: {
|
||
name: 'Rule Name',
|
||
severity: 'Severity',
|
||
category: 'Category',
|
||
pattern: 'Pattern',
|
||
decision: 'Decision',
|
||
enabled: 'Status',
|
||
builtin: 'Type',
|
||
actions: 'Actions',
|
||
},
|
||
builtinBadge: 'Built-in',
|
||
customBadge: 'Custom',
|
||
deleteConfirm: 'Delete rule "{name}"?',
|
||
fields: {
|
||
ruleId: 'Rule ID',
|
||
name: 'Name',
|
||
description: 'Description',
|
||
toolName: 'Target Tool',
|
||
pattern: 'Regex Pattern',
|
||
excludePattern: 'Exclude Pattern',
|
||
category: 'Category',
|
||
severity: 'Severity',
|
||
decision: 'Decision',
|
||
remediation: 'Remediation',
|
||
priority: 'Priority',
|
||
},
|
||
},
|
||
fileGuard: {
|
||
title: 'File Guard',
|
||
desc: 'Manage sensitive file path protection',
|
||
enabled: 'Enable File Guard',
|
||
enabledHint: 'When enabled, sensitive file paths will be protected from unauthorized access',
|
||
sensitivePaths: 'Sensitive Paths',
|
||
sensitivePathsDesc: 'Configure file paths to protect (supports wildcards)',
|
||
addPath: 'Add Path',
|
||
pathPlaceholder: 'Type path and press Enter (e.g. ~/.ssh/)',
|
||
},
|
||
audit: {
|
||
title: 'Audit Logs',
|
||
desc: 'View tool security check records',
|
||
config: {
|
||
title: 'Audit Configuration',
|
||
enabled: 'Enable Audit Logging',
|
||
enabledHint: 'When disabled, tool invocation audit logs will not be recorded',
|
||
minSeverity: 'Minimum Severity',
|
||
minSeverityHint: 'Only record audit events at this severity level and above',
|
||
retentionDays: 'Retention Days',
|
||
retentionDaysHint: 'Audit logs older than this will be auto-cleaned (0=never)',
|
||
},
|
||
stats: {
|
||
total: 'Total Checks',
|
||
blocked: 'Blocked',
|
||
needsApproval: 'Needs Approval',
|
||
allowed: 'Allowed',
|
||
},
|
||
filters: {
|
||
toolName: 'Tool Name',
|
||
decision: 'Decision',
|
||
severity: 'Severity',
|
||
conversationId: 'Conversation ID',
|
||
},
|
||
columns: {
|
||
time: 'Time',
|
||
tool: 'Tool',
|
||
decision: 'Decision',
|
||
severity: 'Severity',
|
||
conversationId: 'Conversation',
|
||
},
|
||
noLogs: 'No audit logs yet',
|
||
expandFindings: 'Expand Details',
|
||
},
|
||
severity: {
|
||
CRITICAL: 'Critical',
|
||
HIGH: 'High',
|
||
MEDIUM: 'Medium',
|
||
LOW: 'Low',
|
||
INFO: 'Info',
|
||
},
|
||
decision: {
|
||
ALLOW: 'Allow',
|
||
NEEDS_APPROVAL: 'Needs Approval',
|
||
BLOCK: 'Block',
|
||
},
|
||
messages: {
|
||
loadFailed: 'Failed to load security config',
|
||
saveSuccess: 'Security config saved',
|
||
saveFailed: 'Failed to save security config',
|
||
ruleCreated: 'Rule created',
|
||
ruleUpdated: 'Rule updated',
|
||
ruleDeleted: 'Rule deleted',
|
||
ruleToggled: 'Rule status updated',
|
||
},
|
||
approval: {
|
||
title: 'Approval Required',
|
||
severity: 'Risk Level',
|
||
summary: 'Summary',
|
||
findings: 'Findings',
|
||
remediation: 'Remediation',
|
||
approved: 'Approved',
|
||
denied: 'Denied',
|
||
hint: 'Type /approve to allow, or /deny to reject',
|
||
},
|
||
},
|
||
tokenUsage: {
|
||
kicker: 'Runtime Cost',
|
||
title: 'Token Usage',
|
||
desc: 'View token consumption and model invocation statistics',
|
||
refresh: 'Refresh',
|
||
startDate: 'Start',
|
||
endDate: 'End',
|
||
promptTokens: 'Prompt Tokens',
|
||
completionTokens: 'Completion Tokens',
|
||
assistantMessages: 'Assistant Messages',
|
||
byModel: 'By Model',
|
||
byDate: 'By Date',
|
||
model: 'Model',
|
||
provider: 'Provider',
|
||
date: 'Date',
|
||
messageCount: 'Messages',
|
||
loadFailed: 'Failed to load token usage',
|
||
noData: 'No token usage data',
|
||
},
|
||
mcp: {
|
||
kicker: 'Capability Bridge',
|
||
title: 'MCP Server Management',
|
||
desc: 'Manage MCP (Model Context Protocol) server connections',
|
||
addServer: 'Add Server',
|
||
refreshAll: 'Refresh All',
|
||
columns: {
|
||
name: 'Name',
|
||
transport: 'Transport',
|
||
enabled: 'Status',
|
||
lastStatus: 'Connection',
|
||
lastConnectedTime: 'Last Connected',
|
||
toolCount: 'Tools',
|
||
description: 'Description',
|
||
actions: 'Actions',
|
||
},
|
||
status: {
|
||
connected: 'Connected',
|
||
disconnected: 'Disconnected',
|
||
error: 'Error',
|
||
},
|
||
transport: {
|
||
stdio: 'Stdio',
|
||
sse: 'SSE',
|
||
streamable_http: 'HTTP',
|
||
},
|
||
modal: {
|
||
newTitle: 'Add MCP Server',
|
||
editTitle: 'Edit MCP Server',
|
||
},
|
||
fields: {
|
||
name: 'Name',
|
||
description: 'Description',
|
||
transport: 'Transport',
|
||
url: 'URL',
|
||
headers: 'HTTP Headers (JSON)',
|
||
command: 'Command',
|
||
args: 'Arguments (JSON array)',
|
||
env: 'Environment Variables (JSON)',
|
||
cwd: 'Working Directory',
|
||
connectTimeout: 'Connect Timeout (seconds)',
|
||
readTimeout: 'Read Timeout (seconds)',
|
||
enabled: 'Enabled',
|
||
},
|
||
placeholders: {
|
||
name: 'Server name',
|
||
description: 'Brief description',
|
||
url: 'http://localhost:8080/sse',
|
||
headers: '',
|
||
command: 'npx',
|
||
args: '',
|
||
env: '',
|
||
cwd: '/path/to/dir',
|
||
},
|
||
actions: {
|
||
test: 'Test Connection',
|
||
testing: 'Testing...',
|
||
},
|
||
testResult: {
|
||
success: 'Connection successful',
|
||
failed: 'Connection failed',
|
||
tools: 'Discovered {count} tools',
|
||
latency: 'Latency {ms}ms',
|
||
},
|
||
messages: {
|
||
loadFailed: 'Failed to load MCP servers',
|
||
createSuccess: 'MCP server created',
|
||
updateSuccess: 'MCP server updated',
|
||
deleteSuccess: 'MCP server deleted',
|
||
deleteConfirm: 'Delete MCP server "{name}"?',
|
||
toggleSuccess: 'Status updated',
|
||
refreshSuccess: 'All servers refreshed',
|
||
saveFailed: 'Failed to save',
|
||
empty: 'No MCP servers',
|
||
emptyDesc: 'Add an MCP server to extend your agents\' capabilities',
|
||
},
|
||
},
|
||
sessions: {
|
||
title: 'Sessions',
|
||
desc: 'View and manage all conversation sessions',
|
||
search: 'Search sessions...',
|
||
columns: {
|
||
session: 'Session',
|
||
source: 'Source',
|
||
agent: 'Agent',
|
||
messages: 'Messages',
|
||
status: 'Status',
|
||
lastActive: 'Last Active',
|
||
actions: 'Actions',
|
||
},
|
||
status: {
|
||
active: 'Active',
|
||
closed: 'Closed',
|
||
},
|
||
empty: 'No sessions found',
|
||
loadFailed: 'Failed to load sessions',
|
||
deleteConfirm: 'Are you sure you want to delete this session?',
|
||
deleteTitle: 'Confirm Delete',
|
||
deleteFailed: 'Failed to delete session',
|
||
time: {
|
||
justNow: 'Just now',
|
||
minutesAgo: '{n}m ago',
|
||
hoursAgo: '{n}h ago',
|
||
},
|
||
},
|
||
tools: {
|
||
title: 'Tools',
|
||
desc: 'Manage tools available to your agents',
|
||
registerButton: 'Register Tool',
|
||
columns: {
|
||
tool: 'Tool',
|
||
beanName: 'Bean Name',
|
||
type: 'Type',
|
||
status: 'Status',
|
||
actions: 'Actions',
|
||
},
|
||
empty: 'No tools registered',
|
||
modal: {
|
||
editTitle: 'Edit Tool',
|
||
newTitle: 'Register Tool',
|
||
},
|
||
fields: {
|
||
name: 'Name',
|
||
beanName: 'Bean Name',
|
||
type: 'Type',
|
||
description: 'Description',
|
||
},
|
||
placeholders: {
|
||
name: 'Tool name',
|
||
beanName: 'Spring Bean name',
|
||
description: 'Tool description',
|
||
},
|
||
types: {
|
||
builtin: 'Built-in',
|
||
mcp: 'MCP',
|
||
custom: 'Custom',
|
||
},
|
||
messages: {
|
||
saveFailed: 'Failed to save tool',
|
||
deleteConfirm: 'Are you sure you want to delete this tool?',
|
||
deleteTitle: 'Confirm Delete',
|
||
deleteFailed: 'Failed to delete tool',
|
||
toggleFailed: 'Failed to toggle tool status',
|
||
},
|
||
},
|
||
plugins: {
|
||
title: 'Plugins',
|
||
desc: 'Manage external plugins loaded from JAR files',
|
||
refresh: 'Refresh',
|
||
type: 'Type',
|
||
author: 'Author',
|
||
status: 'Status',
|
||
tools: 'Tools',
|
||
channels: 'Channels',
|
||
provider: 'Provider',
|
||
memoryProvider: 'Memory',
|
||
noDescription: 'No description',
|
||
emptyTitle: 'No plugins installed',
|
||
emptyHint: 'Place plugin JAR files in ~/.mateclaw/plugins/ and restart the server',
|
||
loading: 'Loading plugins...',
|
||
loadFailed: 'Failed to load plugins',
|
||
enabled: '{name} enabled',
|
||
disabled: '{name} disabled',
|
||
toggleFailed: 'Failed to toggle plugin status',
|
||
},
|
||
datasources: {
|
||
kicker: 'Data Fabric',
|
||
title: 'Datasources',
|
||
desc: 'Manage external database connections for natural language queries',
|
||
addButton: 'Add Datasource',
|
||
empty: 'No datasources configured. Click Add to get started.',
|
||
columns: {
|
||
name: 'Name',
|
||
type: 'Type',
|
||
connection: 'Connection',
|
||
status: 'Status',
|
||
actions: 'Actions',
|
||
},
|
||
sections: {
|
||
basic: 'Basic Info',
|
||
connection: 'Connection',
|
||
auth: 'Authentication',
|
||
advanced: 'Advanced',
|
||
},
|
||
modal: {
|
||
editTitle: 'Edit Datasource',
|
||
newTitle: 'Add Datasource',
|
||
},
|
||
fields: {
|
||
name: 'Name',
|
||
dbType: 'Database Type',
|
||
host: 'Host',
|
||
port: 'Port',
|
||
databaseName: 'Database Name',
|
||
schemaName: 'Schema',
|
||
username: 'Username',
|
||
password: 'Password',
|
||
description: 'Description',
|
||
extraParams: 'JDBC Parameters',
|
||
},
|
||
placeholders: {
|
||
name: 'e.g. Business Database',
|
||
host: '127.0.0.1',
|
||
port: '3306',
|
||
databaseName: 'Database name',
|
||
schemaName: 'public (default)',
|
||
username: 'Database username',
|
||
password: 'Database password',
|
||
description: 'What this datasource is for (optional)',
|
||
extraParams: 'useSSL=false&serverTimezone=UTC',
|
||
},
|
||
hints: {
|
||
extraParams: 'Additional JDBC URL parameters, separated by &',
|
||
},
|
||
testButton: 'Test Connection',
|
||
messages: {
|
||
saveFailed: 'Failed to save datasource',
|
||
deleteConfirm: 'Are you sure you want to delete this datasource? The agent will no longer be able to query it.',
|
||
deleteTitle: 'Confirm Delete',
|
||
deleteFailed: 'Failed to delete datasource',
|
||
toggleFailed: 'Failed to toggle datasource status',
|
||
testSuccess: 'Connection successful',
|
||
testFailed: 'Connection failed. Please check configuration.',
|
||
},
|
||
},
|
||
wiki: {
|
||
kicker: 'Knowledge Engine',
|
||
desc: 'AI-powered structured knowledge base that digests raw materials into Wiki pages',
|
||
createKB: 'New Knowledge Base',
|
||
knowledgeBases: 'Knowledge Bases',
|
||
noKB: 'No knowledge bases yet',
|
||
selectKB: 'Select a knowledge base',
|
||
selectPage: 'Select a page from the sidebar',
|
||
pageKicker: 'Knowledge Page',
|
||
confirmDelete: 'Delete page "{title}"? This cannot be undone.',
|
||
confirmBatchDelete: 'Delete {count} pages? This cannot be undone.',
|
||
batchSelect: 'Batch select',
|
||
selectAll: 'Select all',
|
||
kbName: 'Name',
|
||
kbNamePlaceholder: 'Enter knowledge base name',
|
||
kbDescription: 'Description',
|
||
kbDescPlaceholder: 'Briefly describe the knowledge base purpose',
|
||
rawMaterials: 'Raw Materials',
|
||
pages: 'Wiki Pages',
|
||
config: 'Config',
|
||
searchPages: 'Search pages...',
|
||
dropFiles: 'Drop files here or click to upload',
|
||
dropToUpload: 'Release to upload',
|
||
uploading: 'Uploading…',
|
||
uploadFailed: 'Upload failed: {name}',
|
||
addText: 'Add Text',
|
||
noRawMaterials: 'No raw materials yet',
|
||
reprocess: 'Reprocess',
|
||
resume: 'Resume',
|
||
download: 'Download original file',
|
||
downloadFailed: 'Download failed',
|
||
processAll: 'Process All Pending',
|
||
materialTitle: 'Title',
|
||
materialContent: 'Content',
|
||
pasteContent: 'Paste or type content here...',
|
||
backlinks: 'Backlinks',
|
||
generatedByAi: 'AI generated',
|
||
editedManually: 'Manually edited',
|
||
configTitle: 'Wiki Processing Rules',
|
||
configDesc: 'Configure the rules AI follows when digesting raw materials',
|
||
configPlaceholder: 'Edit wiki processing rules here...',
|
||
pageCount: '{count} pages',
|
||
sourceCount: '{count} sources',
|
||
dirPlaceholder: 'Enter local directory path, e.g. /Users/me/docs',
|
||
scan: 'Scan',
|
||
scanning: 'Scanning...',
|
||
scanResult: 'Scanned {scanned} files, added {added}, skipped {skipped}',
|
||
saving: 'Saving...',
|
||
status: {
|
||
active: 'ACTIVE',
|
||
uploading: 'UPLOADING',
|
||
processing: 'PROCESSING',
|
||
error: 'ERROR',
|
||
pending: 'PENDING',
|
||
completed: 'COMPLETED',
|
||
partial: 'PARTIAL',
|
||
failed: 'FAILED',
|
||
},
|
||
progress: {
|
||
preparing: 'Preparing…',
|
||
uploading: 'Uploading {pct}%',
|
||
},
|
||
jobStage: {
|
||
queued: 'Queued',
|
||
routing: 'Routing',
|
||
phase_a_running: 'Analyzing',
|
||
phase_a_done: 'Analyzed',
|
||
phase_b_running: 'Generating',
|
||
enriching: 'Linking',
|
||
embedding: 'Embedding',
|
||
completed: 'Completed',
|
||
failed: 'Failed',
|
||
cancelled: 'Cancelled',
|
||
},
|
||
jobInfo: {
|
||
currentModel: 'Model',
|
||
fallbackActive: 'Fallback active',
|
||
elapsedTime: 'Elapsed',
|
||
pagesProgress: '{done}/{total} pages',
|
||
},
|
||
page: {
|
||
type: {
|
||
entity: 'Entity',
|
||
concept: 'Concept',
|
||
source: 'Source',
|
||
synthesis: 'Synthesis',
|
||
},
|
||
enriched: 'Linked',
|
||
notEnriched: 'Not linked',
|
||
enrich: 'Add cross-links',
|
||
repair: 'Repair page',
|
||
citations: '{count} source chunks',
|
||
noCitations: 'No source citations found',
|
||
citationUnknownSource: 'Unknown source',
|
||
citationChunkN: 'Chunk {n}',
|
||
citationChunkUnknown: 'Chunk unknown',
|
||
citationOffset: 'offset {start}–{end}',
|
||
},
|
||
relation: {
|
||
shared_chunk: 'Shared chunk',
|
||
shared_raw: 'Shared source',
|
||
direct_link: 'Direct link',
|
||
semantic_near: 'Semantic',
|
||
relatedPages: 'Related Pages',
|
||
explainRelation: 'Explain relation',
|
||
},
|
||
configPanel: {
|
||
embeddingModel: 'Embedding Model',
|
||
embeddingModelHint: 'Semantic search model for this KB; leave empty for system default',
|
||
ingestMode: 'Ingest Mode',
|
||
ingestModeEager: 'Eager',
|
||
ingestModeLazy: 'Lazy',
|
||
ingestModeEagerHint: 'Upload runs the full LLM pipeline to generate wiki pages immediately.',
|
||
ingestModeLazyHint: 'Upload only extracts, chunks, and embeds. No page generation; search works right away.',
|
||
modelStrategy: 'Model Strategy',
|
||
globalDefault: 'Global default',
|
||
selectModel: 'Select a model…',
|
||
otherProvider: 'Other',
|
||
searchModel: 'Search models…',
|
||
noModelMatch: 'No matching models',
|
||
addFallback: '+ Add fallback',
|
||
stepModel: {
|
||
route: 'Analysis / Routing',
|
||
create_page: 'Page Creation',
|
||
merge_page: 'Page Merge',
|
||
enrich: 'Link Annotation',
|
||
summary: 'Summary Update',
|
||
},
|
||
fallbackModels: 'Fallback Models',
|
||
searchPreview: 'Search Preview',
|
||
searchPreviewPlaceholder: 'Enter a user message to preview agent search results…',
|
||
searchPreviewRun: 'Test',
|
||
},
|
||
stats: {
|
||
enrichedRatio: '{enriched}/{total} linked',
|
||
failedJobs: '{count} failed',
|
||
},
|
||
noPages: 'No pages yet',
|
||
noResults: 'No pages match your search',
|
||
loadMore: 'Load {n} more',
|
||
filteredByRaw: 'Filtered by source material',
|
||
clearFilter: 'Clear filter',
|
||
systemPageBadge: 'System',
|
||
systemPageHint: 'overview / log are built-in system pages — they can\'t be deleted',
|
||
lockedPageBadge: 'Locked',
|
||
lockedPageHint: 'This page is locked — AI tools and batch operations skip it',
|
||
archivedSection: 'Archived',
|
||
noArchived: 'No archived pages',
|
||
unarchive: 'Restore',
|
||
pageTypes: {
|
||
concept: 'Concepts',
|
||
person: 'People',
|
||
place: 'Places',
|
||
event: 'Events',
|
||
technology: 'Technology',
|
||
organization: 'Organizations',
|
||
product: 'Products',
|
||
term: 'Terms',
|
||
process: 'Processes',
|
||
other: 'Other',
|
||
},
|
||
graph: {
|
||
tab: 'Knowledge Graph',
|
||
nodes: 'nodes',
|
||
edges: 'edges',
|
||
orphans: 'orphans',
|
||
showOrphans: 'Show orphans',
|
||
allTypes: 'All types',
|
||
resetView: 'Reset view',
|
||
fullscreen: 'Fullscreen',
|
||
exitFullscreen: 'Exit fullscreen',
|
||
linksTo: 'Links to',
|
||
openPage: 'Open page',
|
||
empty: 'No graph data — process some raw materials first',
|
||
},
|
||
},
|
||
cronJobs: {
|
||
kicker: 'Automation',
|
||
title: 'Cron Jobs',
|
||
desc: 'Schedule agents to run messages or goals on a timer',
|
||
createJob: 'New Job',
|
||
editJob: 'Edit Job',
|
||
noJobs: 'No cron jobs yet',
|
||
createFirst: 'Create your first cron job',
|
||
columns: {
|
||
name: 'Name',
|
||
agent: 'Agent',
|
||
taskType: 'Type',
|
||
cron: 'Cron Expression',
|
||
timezone: 'Timezone',
|
||
nextRun: 'Next Run',
|
||
lastRun: 'Last Run',
|
||
enabled: 'Enabled',
|
||
actions: 'Actions',
|
||
// RFC-063r §2.14: list-page "Last Delivery" column
|
||
lastDelivery: 'Last Delivery',
|
||
// RFC-063r post-deploy: channel binding columns
|
||
channel: 'Channel',
|
||
targetId: 'Delivery Target',
|
||
},
|
||
// RFC-063r §2.14: delivery_status state machine labels
|
||
lastDelivery: {
|
||
none: 'No delivery',
|
||
pending: 'In flight',
|
||
delivered: 'Delivered',
|
||
not_delivered: 'Failed',
|
||
},
|
||
taskTypes: { text: 'Text Message', agent: 'Agent Goal' },
|
||
cronTypes: { hourly: 'Hourly', daily: 'Daily', weekly: 'Weekly', custom: 'Custom' },
|
||
days: { mon: 'Mon', tue: 'Tue', wed: 'Wed', thu: 'Thu', fri: 'Fri', sat: 'Sat', sun: 'Sun' },
|
||
fields: {
|
||
name: 'Job Name',
|
||
namePlaceholder: 'Enter job name',
|
||
agent: 'Agent',
|
||
agentPlaceholder: 'Select agent',
|
||
taskType: 'Task Type',
|
||
triggerMessage: 'Trigger Message',
|
||
triggerMessagePlaceholder: 'Message to send to the agent',
|
||
requestBody: 'Goal',
|
||
requestBodyPlaceholder: 'Describe the goal for the agent',
|
||
cronFrequency: 'Frequency',
|
||
cronTime: 'Time',
|
||
cronDays: 'Days',
|
||
cronExpression: 'Custom Expression',
|
||
cronExpressionPlaceholder: 'min hour day month weekday, e.g. 0 9 * * 1-5',
|
||
timezone: 'Timezone',
|
||
enabled: 'Enable immediately',
|
||
},
|
||
actions: { runNow: 'Run Now', edit: 'Edit', delete: 'Delete' },
|
||
messages: {
|
||
createSuccess: 'Cron job created',
|
||
updateSuccess: 'Cron job updated',
|
||
deleteSuccess: 'Cron job deleted',
|
||
deleteConfirm: 'Delete job "{name}"? This cannot be undone.',
|
||
runTriggered: 'Job triggered. Check conversation "cron:{id}" for results.',
|
||
enableSuccess: 'Job enabled',
|
||
disableSuccess: 'Job disabled',
|
||
invalidCron: 'Invalid cron expression. Use 5-field format (min hour day month weekday).',
|
||
agentRequired: 'Please select an agent',
|
||
textRequired: 'Trigger message is required',
|
||
goalRequired: 'Goal is required',
|
||
},
|
||
},
|
||
login: {
|
||
kicker: 'AI Operating System',
|
||
subtitle: 'Your intelligent AI assistant',
|
||
heroTitle: 'Move beyond answers. Put AI inside a system that can keep working.',
|
||
heroDesc: 'MateClaw is not about stuffing more capability into a chat box. It is about pulling context, knowledge, execution, and memory into one reliable operating surface.',
|
||
pointContext: 'Keep context continuous',
|
||
pointKnowledge: 'Organize knowledge into use',
|
||
pointExecution: 'Turn capability into action',
|
||
cardTitle: 'Sign in to the working surface',
|
||
cardDesc: 'Enter the system where models, knowledge, workspace, and runtime state move together instead of living in separate tools.',
|
||
fields: {
|
||
username: 'Username',
|
||
password: 'Password',
|
||
},
|
||
placeholders: {
|
||
username: 'Enter username',
|
||
password: 'Enter password',
|
||
},
|
||
signIn: 'Sign In',
|
||
hint: 'Default: <code>admin</code> / <code>admin123</code>',
|
||
failed: 'Login failed. Please check your credentials.',
|
||
},
|
||
channels: {
|
||
title: 'Channels',
|
||
desc: 'Connect your agents to messaging platforms and APIs',
|
||
newChannel: 'New Channel',
|
||
addChannel: 'Add Channel',
|
||
status: {
|
||
active: 'Active',
|
||
inactive: 'Inactive',
|
||
},
|
||
configure: 'Configure',
|
||
enable: 'Enable',
|
||
disable: 'Disable',
|
||
modal: {
|
||
editTitle: 'Edit Channel',
|
||
newTitle: 'New Channel',
|
||
},
|
||
fields: {
|
||
name: 'Name',
|
||
type: 'Type',
|
||
description: 'Description',
|
||
bindAgent: 'Bind Agent',
|
||
},
|
||
placeholders: {
|
||
name: 'Channel name',
|
||
description: 'Channel description',
|
||
selectAgent: 'Select Agent...',
|
||
},
|
||
types: {
|
||
web: 'Web API',
|
||
dingtalk: 'DingTalk',
|
||
feishu: 'Feishu / Lark',
|
||
telegram: 'Telegram',
|
||
discord: 'Discord',
|
||
wecom: 'WeChat Work',
|
||
weixin: 'WeChat',
|
||
qq: 'QQ',
|
||
slack: 'Slack',
|
||
webchat: 'WebChat Embed',
|
||
webhook: 'Webhook',
|
||
},
|
||
tabs: {
|
||
form: 'Form',
|
||
json: 'Raw JSON',
|
||
},
|
||
webhook: {
|
||
url: 'Webhook URL',
|
||
copy: 'Copy',
|
||
copied: 'Copied',
|
||
copyFailed: 'Copy failed, please copy manually',
|
||
localhostWarn: 'You are running on localhost. IM platforms cannot reach localhost. Use ngrok, frp or similar tools to expose your local service to the internet, then replace the host in the URL above.',
|
||
},
|
||
weixin: {
|
||
authHint: 'Click the button below to get a WeChat login QR code. After scanning with WeChat, the Bot Token will be automatically filled in. Requires iLink Bot beta access.',
|
||
qrcodeButton: 'Get Login QR Code',
|
||
rescanButton: 'Re-scan (replaces current account)',
|
||
qrcodeLoading: 'Fetching...',
|
||
qrcodeFailed: 'Failed to get QR code. Please check your network.',
|
||
qrcodeExpired: 'QR code expired. Please get a new one.',
|
||
scanHint: 'Scan this QR code with WeChat to log in',
|
||
polling: 'Waiting for scan...',
|
||
scanned: 'Scanned, please confirm on your phone',
|
||
confirmed: 'Login successful',
|
||
expired: 'QR code expired',
|
||
loginSuccess: 'WeChat login successful, token has been filled in',
|
||
replaceWarning: 'Re-scanning will replace the currently bound WeChat account. To bind an additional account, click the button below to add a new channel.',
|
||
addNewAccount: 'Bind New WeChat Account (Add Channel)',
|
||
newAccountName: 'WeChat',
|
||
},
|
||
wecom: {
|
||
authHint: 'Click the button to open a WeChat Work QR code window. After scanning, the Bot ID and Secret will be automatically filled in.',
|
||
authButton: 'Authorize WeChat Work Bot',
|
||
authLoading: 'Loading...',
|
||
authSuccess: 'WeChat Work bot authorized successfully',
|
||
sdkFailed: 'WeChat Work SDK failed to load. Please check your network.',
|
||
windowBlocked: 'Popup blocked by browser. Please allow popups and try again.',
|
||
authCancelled: 'Authorization cancelled',
|
||
authFailed: 'Authorization failed',
|
||
},
|
||
webHint: 'Web channel uses built-in SSE communication, no additional configuration needed.',
|
||
webchatHint: 'WebChat embeds the MateClaw chat widget into external websites. Configure an API key, title, and primary color, then load the WebChat SDK on your site.',
|
||
webchatApiKeyGenerated: 'The platform will generate the API key after save. Reopen this channel to copy it.',
|
||
webchatApiKeyReadOnly: 'This API key is generated and managed by the platform. It can be copied, but not edited manually.',
|
||
webhookHint: 'Webhook channel configuration should be edited in the "Raw JSON" tab below.',
|
||
jsonHint: 'Edit the complete JSON configuration directly. Switching to "Form" tab will sync automatically.',
|
||
advanced: 'Advanced',
|
||
accessControl: {
|
||
title: 'Access Control',
|
||
dmPolicy: 'DM Policy',
|
||
dmPolicyTooltip: 'Controls whether users can chat with the bot privately',
|
||
groupPolicy: 'Group Policy',
|
||
groupPolicyTooltip: 'Controls whether the bot responds in group chats',
|
||
policyOpen: 'Open',
|
||
policyClosed: 'Closed',
|
||
allowFrom: 'Allowed Users',
|
||
allowFromTooltip: 'Comma-separated user ID whitelist, leave empty to allow all',
|
||
allowFromPlaceholder: 'Comma-separated user IDs (empty = allow all)',
|
||
denyMessage: 'Deny Message',
|
||
denyMessagePlaceholder: 'Sorry, you do not have permission',
|
||
requireMention: "Require {'@'}mention",
|
||
requireMentionTooltip: "Whether the bot requires {'@'}mention in group chats",
|
||
},
|
||
messageFilter: {
|
||
title: 'Message Filter',
|
||
filterThinking: 'Filter Thinking',
|
||
filterThinkingTooltip: 'Filter <think> tag content before sending to users',
|
||
filterToolMessages: 'Filter Tool Messages',
|
||
filterToolMessagesTooltip: 'Filter tool_call / tool_result and ReAct Action/Observation lines',
|
||
messageFormat: 'Message Format',
|
||
formatAuto: 'Auto',
|
||
formatMarkdown: 'Markdown',
|
||
formatText: 'Plain Text',
|
||
formatHtml: 'HTML',
|
||
},
|
||
feishuPermissions: {
|
||
title: 'Required Feishu Permissions',
|
||
goToPermissions: 'Go to Permission Management →',
|
||
},
|
||
connection: {
|
||
connected: 'Connected',
|
||
reconnecting: 'Reconnecting',
|
||
error: 'Disconnected',
|
||
disconnected: 'Not Connected',
|
||
outOfService: 'Not Started',
|
||
retryCount: 'Retry #{n}',
|
||
errorLabel: 'Error',
|
||
},
|
||
messages: {
|
||
loadFailed: 'Failed to load channels',
|
||
saveFailed: 'Failed to save channel',
|
||
saveSuccess: 'Channel saved',
|
||
deleteFailed: 'Failed to delete channel',
|
||
deleteConfirm: 'Are you sure you want to delete this channel?',
|
||
deleteTitle: 'Confirm Delete',
|
||
toggleFailed: 'Failed to toggle channel status',
|
||
invalidJson: 'Invalid config JSON format',
|
||
},
|
||
guide: {
|
||
dingtalk: {
|
||
step1: 'Create a bot on <a href="https://open-dev.dingtalk.com/" target="_blank" rel="noopener">DingTalk Open Platform</a>, fill in <b>AppKey</b> and <b>AppSecret</b>',
|
||
step2: 'Stream mode (recommended): Select "Stream Mode" for message receiving, no public IP required',
|
||
step3: 'Webhook mode: Select "HTTP Mode", paste the Webhook URL as the callback address',
|
||
},
|
||
feishu: {
|
||
step1: 'Go to <a href="https://open.feishu.cn/" target="_blank" rel="noopener">Feishu Open Platform</a> and create an enterprise app',
|
||
step2: 'Fill in the app\'s <b>App ID</b> and <b>App Secret</b> below',
|
||
webhookStep: 'In Feishu "Event Subscriptions", set the request URL to the Webhook URL above and subscribe to <code>im.message.receive_v1</code>',
|
||
websocketStep: 'In Feishu "Event Subscriptions", choose the "Long Connection" subscription method and subscribe to <code>im.message.receive_v1</code> (no public IP required)',
|
||
permissionStep: 'For nickname display, request <code>contact:user.base:readonly</code> permission in "Permission Management"',
|
||
},
|
||
telegram: {
|
||
step1: 'Search for <a href="https://t.me/BotFather" target="_blank" rel="noopener">{at}BotFather</a> in Telegram, send <code>/newbot</code> to create a Bot',
|
||
step2: 'Fill in the <b>Bot Token</b> returned by BotFather below',
|
||
step3: '<b>Long-Polling mode</b> (recommended): Auto-receives messages via <code>getUpdates</code> polling, <b>no public IP required</b>',
|
||
step4: '<b>Webhook mode</b>: Requires a publicly accessible callback URL, switch connection mode and fill in Webhook URL',
|
||
},
|
||
discord: {
|
||
step1: 'Go to <a href="https://discord.com/developers/applications" target="_blank" rel="noopener">Discord Developer Portal</a> and create an Application',
|
||
step2: 'Create a Bot on the Bot page and copy the <b>Bot Token</b> below',
|
||
step3: 'Enable <b>MESSAGE CONTENT Intent</b> on the Bot page (Privileged Gateway Intents section)',
|
||
step4: 'In OAuth2 → URL Generator, check <b>bot</b> scope and <b>Send Messages / Read Message History</b> permissions, generate invite link to add Bot to target server',
|
||
step5: 'Auto-receives messages via <b>Gateway WebSocket</b> after startup, <b>no public IP or callback URL required</b>',
|
||
},
|
||
wecom: {
|
||
step1: 'Go to <a href="https://work.weixin.qq.com/wework_admin/frame" target="_blank" rel="noopener">WeCom Admin Console</a>, navigate to "App Management → Smart Bot" and create a new bot',
|
||
step2: 'In bot configuration, select "<b>API Mode → Configure Long Connection</b>"',
|
||
step3: 'Record the bot\'s <b>Bot ID</b> and <b>Secret</b>, fill in below',
|
||
step4: 'After starting the channel, scan QR code in WeCom to chat with the bot, <b>no public IP or callback URL required</b>',
|
||
},
|
||
weixin: {
|
||
step1: 'Ensure you have WeChat <b>iLink Bot</b> beta access (currently invite-only)',
|
||
step2: 'Click the "Get Login QR Code" button below, scan with WeChat to log in',
|
||
step3: 'After successful scan, the system auto-fills <b>bot_token</b> into config',
|
||
step4: 'After starting the channel, auto-receives messages via <b>HTTP long polling</b>, <b>no public IP or callback URL required</b>',
|
||
},
|
||
qq: {
|
||
step1: 'Go to <a href="https://q.qq.com/" target="_blank" rel="noopener">QQ Open Platform</a> and create a bot application',
|
||
step2: 'Get <b>AppID</b> and <b>AppSecret</b> from the app management page, fill in below',
|
||
step3: "Enable required message types in \"Feature Config → Message Subscription\" (C2C, Group {'@'}, Channel messages, etc.)",
|
||
step4: 'After starting the channel, auto-receives messages via <b>WebSocket long connection</b>, <b>no public IP or callback URL required</b>',
|
||
},
|
||
},
|
||
dingtalkRegister: {
|
||
title: 'One-click DingTalk Bot Creation',
|
||
hint: 'Click the button to get a QR code. Scan it with DingTalk and approve authorization — a bot app will be created in your tenant and the Client ID / Client Secret will be auto-filled below.',
|
||
button: 'Scan to Create Bot',
|
||
buttonLoading: 'Preparing QR code…',
|
||
qrcodeLoading: 'Generating QR code',
|
||
scanHint: 'Scan the QR code above with the DingTalk app and confirm authorization',
|
||
confirmed: 'Bot created. Client ID and Secret have been auto-filled.',
|
||
expired: 'QR code expired, please try again',
|
||
denied: 'Authorization was denied',
|
||
startFailed: 'Failed to fetch QR code, please check your network',
|
||
},
|
||
feishuRegister: {
|
||
title: 'One-click Feishu App Creation',
|
||
hint: 'Click the button to get a QR code. Scan it with Feishu and confirm authorization — an in-house app will be created in your tenant and the App ID / App Secret will be auto-filled below.',
|
||
button: 'Scan to Create App',
|
||
buttonLoading: 'Preparing QR code…',
|
||
qrcodeLoading: 'Generating QR code',
|
||
scanHint: 'Scan the QR code above with the Feishu app and confirm authorization',
|
||
confirmed: 'App created. App ID and Secret have been auto-filled.',
|
||
expired: 'QR code expired, please try again',
|
||
denied: 'Authorization was denied',
|
||
error: 'Registration failed, please retry',
|
||
startFailed: 'Failed to fetch QR code, please check your network',
|
||
},
|
||
feishu: {
|
||
perm: {
|
||
message: 'Send and receive messages',
|
||
messageReason: 'Core: send and receive messages',
|
||
receive: 'Receive message events',
|
||
receiveReason: 'Core: receive user messages',
|
||
resource: 'Access message resources',
|
||
resourceReason: 'Get message content in WebSocket mode',
|
||
reactions: 'Manage message reactions',
|
||
reactionsReason: 'Message reactions: add 👍 emoji',
|
||
contact: 'Get basic user info',
|
||
contactReason: 'Nickname: display real user name',
|
||
media: 'Access message resources',
|
||
mediaReason: 'Media download: download images and files',
|
||
},
|
||
},
|
||
},
|
||
skills: {
|
||
title: 'Skills',
|
||
desc: 'Manage tools and skills available to your agents',
|
||
newSkill: 'New Skill',
|
||
importSkill: 'Import Skill',
|
||
refreshRuntime: 'Refresh Runtime',
|
||
refreshing: 'Refreshing...',
|
||
refreshSuccess: 'Active skills refreshed',
|
||
refreshFailed: 'Failed to refresh runtime',
|
||
tabs: {
|
||
all: 'All',
|
||
builtin: 'Built-in',
|
||
mcp: 'MCP',
|
||
dynamic: 'Dynamic',
|
||
},
|
||
search: {
|
||
placeholder: 'Search by name, description, or tags...',
|
||
},
|
||
filter: {
|
||
all: 'All statuses',
|
||
enabled: 'Enabled',
|
||
disabled: 'Disabled',
|
||
scanFailed: 'Scan failed',
|
||
},
|
||
security: {
|
||
scanned: 'Scanned',
|
||
scanFailed: 'Scan failed',
|
||
findingsTitle: 'Security scan failed',
|
||
rescan: 'Rescan',
|
||
rescanning: 'Scanning...',
|
||
rescanPassed: 'Rescan passed',
|
||
rescanStillFailed: 'Rescan still failed — see findings below',
|
||
rescanFailed: 'Rescan request failed',
|
||
noPersistedFindings: 'No persisted findings for this scan. Click "Rescan" to regenerate.',
|
||
fix: 'Suggested fix',
|
||
},
|
||
empty: 'No skills found',
|
||
emptyDesc: 'Add skills to enhance your agents\' capabilities',
|
||
noDescription: 'No description',
|
||
modal: {
|
||
configureTitle: 'Configure Skill',
|
||
newTitle: 'New Skill',
|
||
},
|
||
fields: {
|
||
name: 'Name',
|
||
nameZh: 'Chinese display name',
|
||
nameEn: 'English display name',
|
||
type: 'Type',
|
||
icon: 'Icon',
|
||
version: 'Version',
|
||
author: 'Author',
|
||
tags: 'Tags',
|
||
description: 'Description',
|
||
configJson: 'Configuration (JSON)',
|
||
skillContent: 'Skill Content (SKILL.md)',
|
||
sourceCode: 'Source Code / Script',
|
||
},
|
||
placeholders: {
|
||
name: 'Skill name',
|
||
nameZh: '可选 — 留空则显示原始 name',
|
||
nameEn: 'Optional — leave blank to show the slug',
|
||
icon: '🛠️ (emoji or URL)',
|
||
version: '1.0.0',
|
||
author: 'Author name',
|
||
tags: 'tag1,tag2,tag3',
|
||
description: 'What does this skill do?',
|
||
configJson: '',
|
||
sourceCode: '# Python or script content...',
|
||
},
|
||
hints: {
|
||
directorySkill: '— Directory skill: used as fallback when directory is unavailable',
|
||
primaryContent: '— Primary content for agent prompt injection',
|
||
},
|
||
types: {
|
||
builtin: 'Built-in',
|
||
mcp: 'MCP',
|
||
dynamic: 'Dynamic',
|
||
},
|
||
actions: {
|
||
configure: 'Configure',
|
||
delete: 'Delete',
|
||
saveChanges: 'Save Changes',
|
||
createSkill: 'Create Skill',
|
||
},
|
||
runtime: {
|
||
disabled: 'Disabled',
|
||
unknown: 'Unknown',
|
||
securityBlocked: 'Security Blocked',
|
||
depsMissing: 'Dependencies Missing',
|
||
directoryActive: 'Directory Active',
|
||
databaseFallback: 'Database Fallback',
|
||
databaseActive: 'Database Active',
|
||
unresolved: 'Unresolved',
|
||
},
|
||
messages: {
|
||
saveFailed: 'Failed to save skill',
|
||
deleteConfirm: 'Are you sure you want to delete this skill? This cannot be undone.',
|
||
deleteTitle: 'Confirm Delete',
|
||
deleteFailed: 'Failed to delete skill',
|
||
toggleFailed: 'Failed to toggle skill status',
|
||
},
|
||
import: {
|
||
title: 'Import Skill',
|
||
urlTab: 'From URL',
|
||
searchTab: 'Search Hub',
|
||
urlPlaceholder: 'Enter GitHub repo URL or ClawHub skill URL',
|
||
urlHint: 'Supports GitHub repositories and ClawHub marketplace links',
|
||
examples: 'Examples',
|
||
install: 'Install',
|
||
installing: 'Installing...',
|
||
installed: 'Installed successfully',
|
||
failed: 'Installation failed',
|
||
cancelled: 'Cancelled',
|
||
cancel: 'Cancel',
|
||
overwrite: 'Overwrite existing skill',
|
||
enableAfterInstall: 'Enable after install',
|
||
searchPlaceholder: 'Search ClawHub marketplace...',
|
||
search: 'Search',
|
||
searching: 'Searching...',
|
||
searchFailed: 'Search failed',
|
||
noResults: 'No matching skills found',
|
||
statusPending: 'Pending',
|
||
zipTab: 'ZIP Import',
|
||
dropHint: 'Drop .zip file here, or click to select',
|
||
zipRequirement: 'ZIP must contain a SKILL.md file',
|
||
uploading: 'Installing...',
|
||
uploadSuccess: 'Skill installed successfully',
|
||
uploadFailed: 'Installation failed',
|
||
invalidZip: 'Please select a .zip file',
|
||
tooLarge: 'File too large (max 50MB)',
|
||
},
|
||
},
|
||
onboarding: {
|
||
title: 'Welcome to MateClaw',
|
||
subtitle: 'Set up your first AI model',
|
||
stepPath: 'Choose Path',
|
||
stepConfigure: 'Configure Model',
|
||
stepVerify: 'Verify',
|
||
localTitle: 'Local Model',
|
||
localDesc: 'Ollama installed? Enable local models in one click',
|
||
localDetected: 'Detected',
|
||
cloudTitle: 'Cloud API',
|
||
cloudDesc: 'Use cloud models like OpenAI, DashScope, etc.',
|
||
selectModel: 'Select Model',
|
||
setDefault: 'Set as Default',
|
||
enterApiKey: 'Enter API Key',
|
||
testConnection: 'Test Connection',
|
||
testSuccess: 'Connection Successful',
|
||
testFailed: 'Connection Failed',
|
||
saveAndContinue: 'Save & Continue',
|
||
verifyTitle: 'Verify Your Model',
|
||
verifyMessage: 'Hello! Tell me briefly about yourself.',
|
||
send: 'Send',
|
||
startUsing: 'Start Using MateClaw',
|
||
skip: 'Skip',
|
||
back: 'Back',
|
||
},
|
||
talk: {
|
||
title: 'Talk Mode',
|
||
ready: 'Ready',
|
||
connecting: 'Connecting...',
|
||
listening: 'Listening...',
|
||
processing: 'Thinking...',
|
||
speaking: 'Speaking...',
|
||
holdToTalk: 'Hold to talk',
|
||
releaseToSend: 'Release to send',
|
||
retry: 'Tap to retry',
|
||
you: 'You',
|
||
ai: 'AI',
|
||
micError: 'Cannot access microphone',
|
||
connectionError: 'Connection error — tap the button to retry',
|
||
playbackError: 'Audio playback failed',
|
||
tooShort: 'Recording too short — hold the button while speaking',
|
||
},
|
||
browser: {
|
||
timeline: {
|
||
title: 'Browser ({count} actions)',
|
||
},
|
||
actions: {
|
||
start: 'start',
|
||
stop: 'stop',
|
||
open: 'open',
|
||
click: 'click',
|
||
type: 'type',
|
||
screenshot: 'screenshot',
|
||
},
|
||
},
|
||
dashboard: {
|
||
title: 'Dashboard',
|
||
kicker: 'Operations Pulse',
|
||
desc: 'System usage overview and runtime status',
|
||
conversations: 'Conversations',
|
||
messages: 'Messages',
|
||
tokens: 'Token Usage',
|
||
toolCalls: 'Tool Calls',
|
||
periodDesc: 'A sharper view of how your system behaves across short, medium, and monthly horizons.',
|
||
runsDesc: 'Execution history with timing, cost, and outcome at a glance.',
|
||
trend: {
|
||
title: 'Your Week',
|
||
subtitle: 'How often you and your AI have been working together.',
|
||
},
|
||
periodComparison: 'Period Comparison',
|
||
periods: {
|
||
today: 'Today',
|
||
thisWeek: 'This Week',
|
||
thisMonth: 'This Month',
|
||
},
|
||
recentRuns: 'Recent Cron Job Runs',
|
||
noRuns: 'No runs yet',
|
||
runColumns: {
|
||
time: 'Time',
|
||
job: 'Job',
|
||
status: 'Status',
|
||
trigger: 'Trigger',
|
||
duration: 'Duration',
|
||
tokens: 'Tokens',
|
||
},
|
||
},
|
||
memory: {
|
||
kicker: 'Memory',
|
||
title: 'Memory',
|
||
desc: 'What your agent thinks about, remembers, and lets go.',
|
||
selectAgent: 'Select Agent',
|
||
selectAgentHint: 'Select an agent to view its memory',
|
||
tabTimeline: 'Timeline',
|
||
tabMemory: 'Long-term',
|
||
tabFacts: 'Facts',
|
||
noReports: 'No dream reports yet',
|
||
modeFocused: 'Focused',
|
||
modeNightly: 'Nightly',
|
||
candidates: 'candidates',
|
||
loadMore: 'Load more',
|
||
retry: 'Retry',
|
||
memoryBrowser: {
|
||
header: 'Overview',
|
||
empty: 'No memory content yet',
|
||
userEdited: 'User edited',
|
||
files: {
|
||
memory: 'Memory',
|
||
profile: 'Profile',
|
||
soul: 'Soul',
|
||
userFacts: 'User facts',
|
||
references: 'References',
|
||
},
|
||
},
|
||
time: {
|
||
justNow: 'just now',
|
||
hoursAgo: '{n}h ago',
|
||
daysAgo: '{n}d ago',
|
||
},
|
||
status: {
|
||
success: 'Success',
|
||
failed: 'Failed',
|
||
skipped: 'Skipped',
|
||
running: 'Running',
|
||
pending: 'Pending',
|
||
},
|
||
report: {
|
||
mode: 'Mode',
|
||
topic: 'Topic',
|
||
status: 'Status',
|
||
time: 'Time',
|
||
candidates: 'Candidates',
|
||
promoted: 'Promoted',
|
||
rejected: 'Rejected',
|
||
trigger: 'Trigger',
|
||
reason: 'LLM Reason',
|
||
diff: 'Change Summary',
|
||
},
|
||
morningCard: {
|
||
title: 'Dream Recap',
|
||
dismiss: 'Got it',
|
||
promoted: '{count} memories consolidated',
|
||
},
|
||
hil: {
|
||
confirm: 'Confirm',
|
||
edit: 'Edit',
|
||
cancel: 'Cancel',
|
||
save: 'Save',
|
||
editPlaceholder: 'Edit memory content...',
|
||
confirmed: 'Confirmed',
|
||
saved: 'Saved to MEMORY.md',
|
||
},
|
||
facts: {
|
||
searchPlaceholder: 'Search facts…',
|
||
empty: 'No facts yet (enable fact projection)',
|
||
trust: 'Trust',
|
||
used: 'Used {n} times',
|
||
helpful: 'Helpful',
|
||
unhelpful: 'Not helpful',
|
||
forget: 'Forget',
|
||
forgotten: 'Forgotten',
|
||
resolved: 'Resolved',
|
||
contradictions: '{count} contradictions pending',
|
||
resolve: {
|
||
KEEP_A: 'Keep A',
|
||
KEEP_B: 'Keep B',
|
||
MERGE: 'Merge',
|
||
IGNORE: 'Ignore',
|
||
},
|
||
},
|
||
focused: {
|
||
desc: 'Re-organize memories around a specific topic, prioritizing related information.',
|
||
placeholder: 'Enter a topic, e.g. "architecture decisions"…',
|
||
trigger: 'Start',
|
||
success: 'Dream completed, timeline updated',
|
||
skipped: 'Nothing to consolidate',
|
||
},
|
||
},
|
||
// Tool display labels consumed by useToolLabel() — keys must mirror zh-CN.ts exactly.
|
||
// Unknown tools (MCP / custom skills) fall back to humanizeToolName() and are not listed here.
|
||
toolLabels: {
|
||
// Delegation
|
||
delegateToAgent: 'Delegate to Agent',
|
||
delegateParallel: 'Parallel Delegation',
|
||
listAvailableAgents: 'List Agents',
|
||
|
||
// Wiki
|
||
wiki_search_pages: 'Search Knowledge Base',
|
||
wiki_semantic_search: 'Semantic Search KB',
|
||
wiki_read_page: 'Read KB Page',
|
||
wiki_list_pages: 'List KB Pages',
|
||
wiki_related_pages: 'Find Related Pages',
|
||
wiki_trace_source: 'Trace Knowledge Source',
|
||
wiki_create_page: 'Create KB Page',
|
||
wiki_delete_page: 'Delete KB Page',
|
||
wiki_enrich_page: 'Enrich KB Page',
|
||
wiki_explain_relation: 'Explain Relation',
|
||
|
||
// Web search
|
||
search: 'Web Search',
|
||
|
||
// Memory
|
||
recall_structured: 'Recall Memory',
|
||
remember_structured: 'Save Memory',
|
||
forget_structured: 'Clear Memory',
|
||
fact_probe: 'Probe Facts',
|
||
fact_related: 'Query Related Facts',
|
||
fact_list_contradictions: 'Check Contradictions',
|
||
session_search: 'Search Sessions',
|
||
read_workspace_memory_file: 'Read Memory File',
|
||
write_workspace_memory_file: 'Write Memory File',
|
||
edit_workspace_memory_file: 'Edit Memory File',
|
||
list_workspace_memory_files: 'List Memory Files',
|
||
|
||
// Files & shell
|
||
read_file: 'Read File',
|
||
execute_shell_command: 'Execute Command',
|
||
extract_document_text: 'Extract Document',
|
||
extract_pdf_text: 'Extract PDF',
|
||
extract_docx_text: 'Extract Document',
|
||
detect_file_type: 'Detect File Type',
|
||
readMateClawDoc: 'Read System Docs',
|
||
|
||
// Generative
|
||
image_generate: 'Generate Image',
|
||
video_generate: 'Generate Video',
|
||
music_generate: 'Generate Music',
|
||
|
||
// Data
|
||
query_datasource: 'Query Datasource',
|
||
execute_sql: 'Execute SQL',
|
||
|
||
// Browser
|
||
browser_use: 'Browser Action',
|
||
|
||
// Cron
|
||
create_cron_job: 'Create Cron Job',
|
||
list_cron_jobs: 'List Cron Jobs',
|
||
toggle_cron_job: 'Toggle Cron Job',
|
||
delete_cron_job: 'Delete Cron Job',
|
||
|
||
// Time
|
||
getCurrentDateTime: 'Get Current Time',
|
||
getCurrentTime: 'Get Current Time',
|
||
getCurrentDate: 'Get Current Date',
|
||
|
||
// Skills
|
||
skill_manage: 'Manage Skills',
|
||
runSkillScript: 'Run Skill',
|
||
listSkillFiles: 'List Skill Files',
|
||
listAvailableSkills: 'List Skills',
|
||
readSkillFile: 'Read Skill File',
|
||
},
|
||
} as const
|