@geminilight/mindos 0.5.20 → 0.5.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/app/api/ask/route.ts +343 -178
- package/app/app/api/monitoring/route.ts +95 -0
- package/app/components/SettingsModal.tsx +58 -58
- package/app/components/settings/AgentsTab.tsx +240 -0
- package/app/components/settings/AiTab.tsx +4 -25
- package/app/components/settings/AppearanceTab.tsx +31 -13
- package/app/components/settings/KnowledgeTab.tsx +13 -28
- package/app/components/settings/McpAgentInstall.tsx +227 -0
- package/app/components/settings/McpServerStatus.tsx +172 -0
- package/app/components/settings/McpSkillsSection.tsx +583 -0
- package/app/components/settings/McpTab.tsx +17 -959
- package/app/components/settings/MonitoringTab.tsx +202 -0
- package/app/components/settings/PluginsTab.tsx +4 -27
- package/app/components/settings/Primitives.tsx +69 -0
- package/app/components/settings/ShortcutsTab.tsx +2 -4
- package/app/components/settings/SyncTab.tsx +8 -24
- package/app/components/settings/types.ts +116 -2
- package/app/instrumentation.ts +7 -2
- package/app/lib/agent/context.ts +151 -87
- package/app/lib/agent/index.ts +5 -3
- package/app/lib/agent/log.ts +1 -0
- package/app/lib/agent/model.ts +76 -10
- package/app/lib/agent/skill-rules.ts +70 -0
- package/app/lib/agent/stream-consumer.ts +73 -77
- package/app/lib/agent/to-agent-messages.ts +106 -0
- package/app/lib/agent/tools.ts +260 -266
- package/app/lib/api.ts +12 -3
- package/app/lib/core/csv.ts +2 -1
- package/app/lib/core/fs-ops.ts +7 -6
- package/app/lib/core/index.ts +1 -1
- package/app/lib/core/lines.ts +7 -6
- package/app/lib/core/search-index.ts +174 -0
- package/app/lib/core/search.ts +30 -1
- package/app/lib/core/security.ts +6 -3
- package/app/lib/errors.ts +108 -0
- package/app/lib/fs.ts +6 -3
- package/app/lib/i18n-en.ts +523 -0
- package/app/lib/i18n-zh.ts +548 -0
- package/app/lib/i18n.ts +4 -963
- package/app/lib/metrics.ts +81 -0
- package/app/next-env.d.ts +1 -1
- package/app/next.config.ts +1 -1
- package/app/package-lock.json +3258 -3093
- package/app/package.json +6 -3
- package/bin/cli.js +7 -4
- package/package.json +4 -1
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
import type { en } from './i18n-en';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 💡 SUGGESTION #3: Recursively widen literal string types to `string` so zh values can differ from en.
|
|
5
|
+
*
|
|
6
|
+
* Without Widen<T>, TypeScript would require zh strings to be the *exact* literal values from en.
|
|
7
|
+
* E.g., if en has `common: { hello: "hello" as const }`, zh would be required to also have "hello".
|
|
8
|
+
*
|
|
9
|
+
* This type converts all string literals to generic `string`, allowing Chinese translations to use
|
|
10
|
+
* completely different values while maintaining structure compatibility.
|
|
11
|
+
*
|
|
12
|
+
* Example:
|
|
13
|
+
* ```
|
|
14
|
+
* en = { msg: "Hello" as const } // string literal "Hello"
|
|
15
|
+
* zh_without = { msg: "你好" } satisfies typeof en // ❌ ERROR: "你好" not assignable to "Hello"
|
|
16
|
+
* zh_with = { msg: "你好" } satisfies Widen<typeof en> // ✅ OK: string satisfies string
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
type Widen<T> =
|
|
20
|
+
T extends string ? string :
|
|
21
|
+
T extends readonly (infer U)[] ? readonly Widen<U>[] :
|
|
22
|
+
T extends (...args: infer A) => infer R ? (...args: A) => Widen<R> :
|
|
23
|
+
T extends object ? { [K in keyof T]: Widen<T[K]> } :
|
|
24
|
+
T;
|
|
25
|
+
|
|
26
|
+
export const zh = {
|
|
27
|
+
common: {
|
|
28
|
+
relatedFiles: '关联视图',
|
|
29
|
+
},
|
|
30
|
+
app: {
|
|
31
|
+
tagline: '个人知识操作系统 — 浏览、编辑并查询你的第二大脑。',
|
|
32
|
+
footer: 'MindOS · 个人知识操作系统',
|
|
33
|
+
},
|
|
34
|
+
home: {
|
|
35
|
+
recentlyModified: '最近修改',
|
|
36
|
+
continueEditing: '继续编辑',
|
|
37
|
+
newNote: '新建笔记',
|
|
38
|
+
plugins: '插件',
|
|
39
|
+
showMore: '查看更多',
|
|
40
|
+
showLess: '收起',
|
|
41
|
+
createToActivate: '创建 {file} 以启用此插件',
|
|
42
|
+
shortcuts: {
|
|
43
|
+
searchFiles: '搜索文件',
|
|
44
|
+
askAI: '问 AI',
|
|
45
|
+
editFile: '编辑文件',
|
|
46
|
+
save: '保存',
|
|
47
|
+
settings: '设置',
|
|
48
|
+
},
|
|
49
|
+
relativeTime: {
|
|
50
|
+
justNow: '刚刚',
|
|
51
|
+
minutesAgo: (n: number) => `${n} 分钟前`,
|
|
52
|
+
hoursAgo: (n: number) => `${n} 小时前`,
|
|
53
|
+
daysAgo: (n: number) => `${n} 天前`,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
sidebar: {
|
|
57
|
+
searchTitle: '搜索 (⌘K)',
|
|
58
|
+
askTitle: '问 AI (⌘/)',
|
|
59
|
+
settingsTitle: '设置 (⌘,)',
|
|
60
|
+
collapseTitle: '收起侧栏',
|
|
61
|
+
expandTitle: '展开侧栏',
|
|
62
|
+
sync: {
|
|
63
|
+
synced: '已同步',
|
|
64
|
+
unpushed: '待推送',
|
|
65
|
+
unpushedHint: '个提交尚未推送到远程 — 将自动同步',
|
|
66
|
+
conflicts: '冲突',
|
|
67
|
+
conflictsHint: '个文件存在合并冲突 — 前往 设置 > 同步 解决',
|
|
68
|
+
syncError: '同步出错',
|
|
69
|
+
syncOff: '同步关闭',
|
|
70
|
+
syncing: '同步中...',
|
|
71
|
+
syncNow: '立即同步',
|
|
72
|
+
syncDone: '同步完成',
|
|
73
|
+
syncFailed: '同步失败',
|
|
74
|
+
syncRestored: '同步已恢复',
|
|
75
|
+
enableSync: '启用同步',
|
|
76
|
+
enableHint: '设置跨设备同步',
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
search: {
|
|
80
|
+
placeholder: '搜索文件...',
|
|
81
|
+
noResults: '没有找到结果',
|
|
82
|
+
prompt: '输入关键词搜索所有文件',
|
|
83
|
+
navigate: '上下导航',
|
|
84
|
+
open: '打开',
|
|
85
|
+
close: '关闭',
|
|
86
|
+
},
|
|
87
|
+
ask: {
|
|
88
|
+
title: 'MindOS Agent',
|
|
89
|
+
placeholder: '输入问题,或输入 @ 添加附件文件',
|
|
90
|
+
emptyPrompt: '可以问任何关于知识库的问题',
|
|
91
|
+
send: '发送',
|
|
92
|
+
attachFile: '附加文件',
|
|
93
|
+
attachCurrent: '附加当前文件',
|
|
94
|
+
stopTitle: '停止',
|
|
95
|
+
connecting: '正在与你的心智一起思考...',
|
|
96
|
+
thinking: '思考中...',
|
|
97
|
+
thinkingLabel: '思考中',
|
|
98
|
+
searching: '正在搜索知识库...',
|
|
99
|
+
generating: '正在生成回复...',
|
|
100
|
+
stopped: '已停止生成。',
|
|
101
|
+
errorNoResponse: 'AI 未返回响应,请检查 API Key 和服务商设置。',
|
|
102
|
+
suggestions: [
|
|
103
|
+
'总结这篇文档',
|
|
104
|
+
'列出所有待办事项',
|
|
105
|
+
'这篇文档的核心要点是什么?',
|
|
106
|
+
'查找与这个主题相关的笔记',
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
fileTree: {
|
|
110
|
+
newFileTitle: '在此目录新建文件',
|
|
111
|
+
rename: '重命名',
|
|
112
|
+
delete: '删除',
|
|
113
|
+
create: '创建',
|
|
114
|
+
enterFileName: '请输入文件名',
|
|
115
|
+
failed: '操作失败',
|
|
116
|
+
confirmDelete: (name: string) => `确定删除「${name}」?此操作不可撤销。`,
|
|
117
|
+
},
|
|
118
|
+
dirView: {
|
|
119
|
+
gridView: '网格视图',
|
|
120
|
+
listView: '列表视图',
|
|
121
|
+
emptyFolder: '此目录为空。',
|
|
122
|
+
fileCount: (n: number) => `${n} 个文件`,
|
|
123
|
+
newFile: '新建文件',
|
|
124
|
+
},
|
|
125
|
+
findInPage: {
|
|
126
|
+
placeholder: '在文档中查找…',
|
|
127
|
+
matchCount: (current: number, total: number) => `${current} / ${total}`,
|
|
128
|
+
noResults: '无结果',
|
|
129
|
+
},
|
|
130
|
+
settings: {
|
|
131
|
+
title: '设置',
|
|
132
|
+
tabs: { ai: 'AI', appearance: '外观', knowledge: '知识库', sync: '同步', mcp: 'MCP', plugins: '插件', shortcuts: '快捷键', monitoring: '监控', agents: 'Agents' },
|
|
133
|
+
ai: {
|
|
134
|
+
provider: '服务商',
|
|
135
|
+
model: '模型',
|
|
136
|
+
apiKey: 'API 密钥',
|
|
137
|
+
baseUrl: '接口地址',
|
|
138
|
+
baseUrlHint: '可选。用于代理或 OpenAI 兼容 API。',
|
|
139
|
+
keyHint: '本地存储于 ~/.mindos/config.json',
|
|
140
|
+
envHint: '标有 env 的字段存在环境变量值。你可以在此覆盖,或一键恢复为环境变量默认值。',
|
|
141
|
+
envFieldNote: (key: string) => `环境变量 ${key} 已设置。清空此字段将回退到环境变量值。`,
|
|
142
|
+
resetToEnv: '恢复为环境变量',
|
|
143
|
+
restoreFromEnv: '从环境变量恢复',
|
|
144
|
+
noApiKey: 'API 密钥未设置,AI 功能暂不可用,请在此填写。',
|
|
145
|
+
testKey: '测试',
|
|
146
|
+
testKeyTesting: '测试中...',
|
|
147
|
+
testKeyOk: (ms: number) => `\u2713 ${ms}ms`,
|
|
148
|
+
testKeyAuthError: 'API Key 无效',
|
|
149
|
+
testKeyModelNotFound: '模型不存在',
|
|
150
|
+
testKeyRateLimited: '请求频率限制,稍后重试',
|
|
151
|
+
testKeyNetworkError: '网络错误',
|
|
152
|
+
testKeyNoKey: '未配置 API Key',
|
|
153
|
+
testKeyUnknown: '测试失败',
|
|
154
|
+
},
|
|
155
|
+
agent: {
|
|
156
|
+
title: 'Agent 行为',
|
|
157
|
+
maxSteps: '最大步数',
|
|
158
|
+
maxStepsHint: '每次请求的最大工具调用步数(1-30)',
|
|
159
|
+
contextStrategy: '上下文策略',
|
|
160
|
+
contextStrategyHint: '自动:上下文填满时摘要早期消息。关闭:不进行摘要(紧急裁剪仍会生效)。',
|
|
161
|
+
contextStrategyAuto: '自动(压缩 + 裁剪)',
|
|
162
|
+
contextStrategyOff: '关闭',
|
|
163
|
+
thinking: '深度思考',
|
|
164
|
+
thinkingHint: '显示 Claude 的推理过程(消耗更多 token)',
|
|
165
|
+
thinkingBudget: '思考预算',
|
|
166
|
+
thinkingBudgetHint: '推理最大 token 数(1000-50000)',
|
|
167
|
+
},
|
|
168
|
+
appearance: {
|
|
169
|
+
readingFont: '正文字体',
|
|
170
|
+
contentWidth: '内容宽度',
|
|
171
|
+
colorTheme: '颜色主题',
|
|
172
|
+
dark: '深色',
|
|
173
|
+
light: '浅色',
|
|
174
|
+
language: '语言',
|
|
175
|
+
browserNote: '外观设置保存在浏览器本地。',
|
|
176
|
+
fontPreview: '人之初,性本善;性相近,习相远。',
|
|
177
|
+
},
|
|
178
|
+
knowledge: {
|
|
179
|
+
sopRoot: '知识库根目录',
|
|
180
|
+
sopRootHint: '笔记目录的绝对路径,修改后需要重启服务器。',
|
|
181
|
+
sopRootEnvHint: (key: string) => `MIND_ROOT 环境变量已设置为 "${key}",填写上方路径可覆盖它。`,
|
|
182
|
+
envNote: 'MIND_ROOT 环境变量已设置。填写上方路径后,你的值优先生效。',
|
|
183
|
+
webPassword: '网页访问密码',
|
|
184
|
+
webPasswordHint: '设置后访问浏览器 UI 需要登录,留空则关闭密码保护。下次刷新页面后生效。',
|
|
185
|
+
webPasswordClear: '清除密码',
|
|
186
|
+
authToken: 'MCP / API 访问令牌',
|
|
187
|
+
authTokenHint: 'Agent 和 MCP 客户端使用的 Bearer Token,浏览器访问无需此项。',
|
|
188
|
+
authTokenNone: '未设置令牌 — API 对所有请求开放。',
|
|
189
|
+
authTokenCopy: '复制',
|
|
190
|
+
authTokenCopied: '已复制!',
|
|
191
|
+
authTokenReset: '重新生成',
|
|
192
|
+
authTokenClear: '清除令牌',
|
|
193
|
+
authTokenResetConfirm: '重新生成令牌?所有 MCP 客户端配置都需要更新。',
|
|
194
|
+
authTokenMcpPort: 'MCP 端口',
|
|
195
|
+
},
|
|
196
|
+
sync: {
|
|
197
|
+
emptyTitle: '跨设备同步',
|
|
198
|
+
emptyDesc: '通过 Git 自动同步知识库到所有设备。',
|
|
199
|
+
featureAutoCommit: '保存时自动提交',
|
|
200
|
+
featureAutoPull: '自动拉取远程更新',
|
|
201
|
+
featureConflict: '冲突检测',
|
|
202
|
+
featureMultiDevice: '多设备同步',
|
|
203
|
+
remoteUrl: 'Git 远程仓库 URL',
|
|
204
|
+
invalidUrl: '无效的 Git URL — 请使用 HTTPS (https://...) 或 SSH (git@...) 格式',
|
|
205
|
+
sshHint: 'SSH URL 需要在本机配置 SSH 密钥。推荐使用 HTTPS + Token。',
|
|
206
|
+
accessToken: '访问令牌',
|
|
207
|
+
optional: '(可选,私有仓库需要)',
|
|
208
|
+
tokenHint: 'GitHub: Settings → Developer settings → Personal access tokens → repo scope',
|
|
209
|
+
branchLabel: '分支',
|
|
210
|
+
connectButton: '连接并开始同步',
|
|
211
|
+
connecting: '连接中...',
|
|
212
|
+
},
|
|
213
|
+
plugins: {
|
|
214
|
+
title: '已安装渲染器',
|
|
215
|
+
builtinBadge: '内置',
|
|
216
|
+
enabled: '已启用',
|
|
217
|
+
disabled: '已禁用',
|
|
218
|
+
matchHint: '自动匹配',
|
|
219
|
+
coreHint: '核心渲染器 — 始终启用',
|
|
220
|
+
noPlugins: '暂无渲染器。',
|
|
221
|
+
comingSoon: '插件市场即将上线。',
|
|
222
|
+
},
|
|
223
|
+
mcp: {
|
|
224
|
+
serverTitle: 'MindOS MCP 服务',
|
|
225
|
+
status: '状态',
|
|
226
|
+
running: '运行中',
|
|
227
|
+
stopped: '已停止',
|
|
228
|
+
transport: '传输方式',
|
|
229
|
+
endpoint: '端点',
|
|
230
|
+
tools: '工具',
|
|
231
|
+
toolsRegistered: (n: number) => `已注册 ${n} 个`,
|
|
232
|
+
auth: '认证',
|
|
233
|
+
authSet: '已设置 Token',
|
|
234
|
+
authNotSet: '未设置',
|
|
235
|
+
copyEndpoint: '复制端点',
|
|
236
|
+
copyConfig: '复制配置',
|
|
237
|
+
copied: '已复制!',
|
|
238
|
+
agentsTitle: 'Agent 配置',
|
|
239
|
+
agent: 'Agent',
|
|
240
|
+
scope: '范围',
|
|
241
|
+
project: '项目',
|
|
242
|
+
global: '全局',
|
|
243
|
+
installed: '已安装',
|
|
244
|
+
notInstalled: '未安装',
|
|
245
|
+
detected: '已检测',
|
|
246
|
+
notFound: '未找到',
|
|
247
|
+
transportStdio: 'stdio(推荐)',
|
|
248
|
+
transportHttp: 'http',
|
|
249
|
+
transportAuto: '自动(推荐)',
|
|
250
|
+
httpUrl: 'MCP URL',
|
|
251
|
+
httpToken: '认证 Token',
|
|
252
|
+
installSelected: '安装选中',
|
|
253
|
+
installing: '安装中...',
|
|
254
|
+
installSuccess: (n: number) => `已配置 ${n} 个 agent`,
|
|
255
|
+
installFailed: '安装失败',
|
|
256
|
+
portLabel: 'MCP 端口',
|
|
257
|
+
portHint: '修改后需重启服务',
|
|
258
|
+
skillsTitle: 'Skills',
|
|
259
|
+
skillAutoLoaded: '每次请求自动加载',
|
|
260
|
+
skillSource: '来源',
|
|
261
|
+
skillBuiltin: '内置',
|
|
262
|
+
skillUser: '自定义',
|
|
263
|
+
addSkill: '+ 添加 Skill',
|
|
264
|
+
deleteSkill: '删除',
|
|
265
|
+
editSkill: '编辑',
|
|
266
|
+
saveSkill: '保存',
|
|
267
|
+
cancelSkill: '取消',
|
|
268
|
+
skillName: '名称',
|
|
269
|
+
skillDesc: '描述',
|
|
270
|
+
skillContent: '内容',
|
|
271
|
+
skillNameConflict: '同名 skill 已存在',
|
|
272
|
+
skillDeleteConfirm: (name: string) => `确定删除「${name}」?此操作不可撤销。`,
|
|
273
|
+
skillLanguage: 'Skill 语言',
|
|
274
|
+
skillLangEn: 'English',
|
|
275
|
+
skillLangZh: '中文',
|
|
276
|
+
searchSkills: '搜索 Skill...',
|
|
277
|
+
customGroup: '自定义',
|
|
278
|
+
builtinGroup: '内置',
|
|
279
|
+
noSkillsMatch: (query: string) => `没有匹配「${query}」的 Skill`,
|
|
280
|
+
skillTemplate: '模板',
|
|
281
|
+
skillTemplateGeneral: '通用',
|
|
282
|
+
skillTemplateToolUse: '工具调用',
|
|
283
|
+
skillTemplateWorkflow: '工作流',
|
|
284
|
+
selectDetected: '选择已检测',
|
|
285
|
+
clearSelection: '清除',
|
|
286
|
+
quickSetup: '快速配置',
|
|
287
|
+
configureFor: '配置目标',
|
|
288
|
+
configPath: '配置路径',
|
|
289
|
+
},
|
|
290
|
+
monitoring: {
|
|
291
|
+
system: '系统',
|
|
292
|
+
heapMemory: '堆内存',
|
|
293
|
+
rss: 'RSS',
|
|
294
|
+
uptime: '运行时间',
|
|
295
|
+
nodeVersion: 'Node',
|
|
296
|
+
application: '应用',
|
|
297
|
+
requests: '请求数',
|
|
298
|
+
toolCalls: '工具调用',
|
|
299
|
+
avgResponse: '平均响应',
|
|
300
|
+
tokens: 'Token',
|
|
301
|
+
errors: '错误',
|
|
302
|
+
knowledgeBase: '知识库',
|
|
303
|
+
files: '文件数',
|
|
304
|
+
totalSize: '总大小',
|
|
305
|
+
rootPath: '根目录',
|
|
306
|
+
mcpStatus: '状态',
|
|
307
|
+
mcpRunning: '运行中',
|
|
308
|
+
mcpStopped: '已停止',
|
|
309
|
+
mcpPort: '端口',
|
|
310
|
+
autoRefresh: '每 5 秒自动刷新',
|
|
311
|
+
fetchError: '加载监控数据失败',
|
|
312
|
+
},
|
|
313
|
+
agents: {
|
|
314
|
+
mcpServer: 'MCP 服务器',
|
|
315
|
+
running: '运行中',
|
|
316
|
+
stopped: '未运行',
|
|
317
|
+
onPort: (port: number) => `端口 :${port}`,
|
|
318
|
+
refresh: '刷新',
|
|
319
|
+
refreshing: '刷新中...',
|
|
320
|
+
connected: '已连接',
|
|
321
|
+
connectedCount: (n: number) => `已连接 (${n})`,
|
|
322
|
+
detectedNotConfigured: '已检测未配置',
|
|
323
|
+
detectedCount: (n: number) => `已检测未配置 (${n})`,
|
|
324
|
+
notDetected: '未检测到',
|
|
325
|
+
notDetectedCount: (n: number) => `未检测到 (${n})`,
|
|
326
|
+
showAll: '显示全部',
|
|
327
|
+
hideAll: '收起',
|
|
328
|
+
connect: '连接',
|
|
329
|
+
noAgents: '本机未检测到任何 Agent。',
|
|
330
|
+
fetchError: '加载 Agent 数据失败',
|
|
331
|
+
autoRefresh: '每 30 秒自动刷新',
|
|
332
|
+
},
|
|
333
|
+
save: '保存',
|
|
334
|
+
saved: '已保存',
|
|
335
|
+
saveFailed: '保存失败',
|
|
336
|
+
reconfigure: '重新配置',
|
|
337
|
+
},
|
|
338
|
+
onboarding: {
|
|
339
|
+
subtitle: '知识库为空,选择一个模板快速开始。',
|
|
340
|
+
templates: {
|
|
341
|
+
en: { title: 'English', desc: '预置 Profile、Notes、Projects 等英文目录结构。' },
|
|
342
|
+
zh: { title: '中文', desc: '预置画像、笔记、项目等中文目录结构。' },
|
|
343
|
+
empty: { title: '空白', desc: '仅包含 README、CONFIG 和 INSTRUCTION 基础文件。' },
|
|
344
|
+
},
|
|
345
|
+
importHint: '已有笔记?在设置中将 MIND_ROOT 指向已有目录即可。',
|
|
346
|
+
syncHint: '需要跨设备同步?完成初始化后在终端运行',
|
|
347
|
+
syncHintSuffix: '即可。',
|
|
348
|
+
},
|
|
349
|
+
shortcuts: [
|
|
350
|
+
{ keys: ['⌘', 'K'], description: '搜索' },
|
|
351
|
+
{ keys: ['⌘', '/'], description: '问 AI' },
|
|
352
|
+
{ keys: ['⌘', ','], description: '设置' },
|
|
353
|
+
{ keys: ['E'], description: '编辑当前文件' },
|
|
354
|
+
{ keys: ['⌘', 'S'], description: '保存' },
|
|
355
|
+
{ keys: ['Esc'], description: '取消编辑 / 关闭弹窗' },
|
|
356
|
+
{ keys: ['@'], description: '在 AI 对话中添加附件' },
|
|
357
|
+
],
|
|
358
|
+
login: {
|
|
359
|
+
tagline: '人类在此思考,Agent 依此行动。',
|
|
360
|
+
subtitle: '请输入密码以继续',
|
|
361
|
+
passwordLabel: '密码',
|
|
362
|
+
passwordPlaceholder: '输入密码',
|
|
363
|
+
signIn: '登录',
|
|
364
|
+
signingIn: '登录中…',
|
|
365
|
+
incorrectPassword: '密码错误,请重试。',
|
|
366
|
+
connectionError: '连接错误,请重试。',
|
|
367
|
+
},
|
|
368
|
+
notFound: {
|
|
369
|
+
title: '文件未找到',
|
|
370
|
+
description: '该文件不存在于你的知识库中。',
|
|
371
|
+
createButton: '创建此文件',
|
|
372
|
+
creating: '创建中...',
|
|
373
|
+
goToParent: '返回上级目录',
|
|
374
|
+
goHome: '首页',
|
|
375
|
+
},
|
|
376
|
+
updateBanner: {
|
|
377
|
+
newVersion: (latest: string, current: string) => `MindOS v${latest} 可用(当前 v${current})`,
|
|
378
|
+
runUpdate: '终端运行',
|
|
379
|
+
orSee: '或',
|
|
380
|
+
releaseNotes: '查看更新说明',
|
|
381
|
+
},
|
|
382
|
+
setup: {
|
|
383
|
+
stepTitles: ['知识库', 'AI 服务商', '端口', '安全', 'Agent 工具', '确认'],
|
|
384
|
+
// Step 1
|
|
385
|
+
kbPath: '知识库路径',
|
|
386
|
+
kbPathHint: '笔记目录的绝对路径。',
|
|
387
|
+
kbPathDefault: '~/MindOS/mind',
|
|
388
|
+
kbPathUseDefault: (path: string) => `使用 ${path}`,
|
|
389
|
+
kbPathHasFiles: (n: number) => `该目录已有 ${n} 个文件。可以跳过模板,或选择合并(已有文件不会被覆盖)。`,
|
|
390
|
+
kbTemplateSkip: '跳过模板',
|
|
391
|
+
kbTemplateMerge: '选择模板合并',
|
|
392
|
+
template: '初始模板',
|
|
393
|
+
templateSkip: '跳过(目录已有文件)',
|
|
394
|
+
// Step 2
|
|
395
|
+
aiProvider: 'AI 服务商',
|
|
396
|
+
aiProviderHint: '选择你偏好的 AI 服务。',
|
|
397
|
+
aiSkip: '跳过 — 稍后配置',
|
|
398
|
+
apiKey: 'API 密钥',
|
|
399
|
+
apiKeyExisting: '已配置密钥。留空即保持不变。',
|
|
400
|
+
model: '模型',
|
|
401
|
+
baseUrl: '接口地址',
|
|
402
|
+
baseUrlHint: '可选。用于代理或 OpenAI 兼容 API。',
|
|
403
|
+
// Step 3
|
|
404
|
+
webPort: 'Web UI 端口',
|
|
405
|
+
mcpPort: 'MCP 服务端口',
|
|
406
|
+
portHint: '有效范围:1024–65535',
|
|
407
|
+
portRestartWarning: '完成配置后,服务将以这些端口启动。',
|
|
408
|
+
portInUse: (p: number) => `端口 ${p} 已被占用。`,
|
|
409
|
+
portSuggest: (p: number) => `使用 ${p}`,
|
|
410
|
+
portChecking: '检测中…',
|
|
411
|
+
portSelf: '当前端口',
|
|
412
|
+
portConflict: 'Web UI 端口和 MCP 端口不能相同。',
|
|
413
|
+
portVerifyHint: '点击输入框外部验证,或等待自动检测。',
|
|
414
|
+
// Step 4
|
|
415
|
+
authToken: 'Auth Token',
|
|
416
|
+
authTokenHint: 'MCP / API 客户端使用的 Bearer Token,自动生成。',
|
|
417
|
+
authTokenUsage: '用于 MCP 连接和 API 客户端身份验证。配置 Agent 时会自动写入,无需手动填写。',
|
|
418
|
+
authTokenUsageWhat: '这是什么?',
|
|
419
|
+
authTokenSeed: '自定义种子(可选)',
|
|
420
|
+
authTokenSeedHint: '输入口令短语生成确定性 Token。',
|
|
421
|
+
generateToken: '生成',
|
|
422
|
+
copyToken: '复制',
|
|
423
|
+
copiedToken: '已复制!',
|
|
424
|
+
webPassword: '网页访问密码',
|
|
425
|
+
webPasswordHint: '可选。设置后浏览器访问需要登录。',
|
|
426
|
+
// Step 5 — Agent Tools
|
|
427
|
+
agentToolsTitle: 'Agent 工具',
|
|
428
|
+
agentToolsHint: '选择要与 MindOS MCP 配置的 AI Agent。标注「未安装」的 agent 可以先行配置,安装应用后即可生效。',
|
|
429
|
+
agentTransport: '传输方式',
|
|
430
|
+
agentScope: '范围',
|
|
431
|
+
agentToolsLoading: '正在加载 Agent…',
|
|
432
|
+
agentToolsEmpty: '未检测到受支持的 Agent。',
|
|
433
|
+
agentNoneSelected: '未选择 agent — 可稍后在 设置 → MCP 中配置。',
|
|
434
|
+
agentSkipLater: '跳过 — 稍后在 设置 > MCP 中安装',
|
|
435
|
+
agentSelectDetected: '选择已检测到的 Agent',
|
|
436
|
+
agentNoneDetected: '未在系统中检测到已安装的 Agent。',
|
|
437
|
+
agentShowMore: (n: number) => `显示另外 ${n} 个 Agent`,
|
|
438
|
+
agentAdvanced: '高级选项',
|
|
439
|
+
agentScopeGlobal: '为所有项目安装',
|
|
440
|
+
agentScopeProject: '仅当前项目',
|
|
441
|
+
badgeInstalled: '已安装',
|
|
442
|
+
badgeDetected: '已检测到',
|
|
443
|
+
badgeNotFound: '未找到',
|
|
444
|
+
agentNotInstalled: '未安装',
|
|
445
|
+
agentDetected: '已检测到',
|
|
446
|
+
agentNotFound: '未找到',
|
|
447
|
+
agentStatusOk: '已配置',
|
|
448
|
+
agentStatusError: '失败',
|
|
449
|
+
agentInstalling: '配置中…',
|
|
450
|
+
agentTransportAuto: '自动(推荐)',
|
|
451
|
+
agentTransportLabel: '传输方式',
|
|
452
|
+
agentVerified: '已验证',
|
|
453
|
+
agentUnverified: '未验证',
|
|
454
|
+
agentVerifyNote: 'stdio agent 需重启后验证',
|
|
455
|
+
// Skill auto-install
|
|
456
|
+
skillWhat: 'Skill 教 AI Agent 如何使用你的知识库 — 包括笔记的读取、写入和整理规则。',
|
|
457
|
+
skillAutoHint: (name: string) => `根据您选择的模板,将向选中的 Agent 安装「${name}」Skill。`,
|
|
458
|
+
skillLabel: 'Skill',
|
|
459
|
+
skillInstalling: '正在安装 Skill…',
|
|
460
|
+
skillInstalled: 'Skill 已安装',
|
|
461
|
+
skillFailed: 'Skill 安装失败',
|
|
462
|
+
// Step 2 — AI skip card
|
|
463
|
+
aiSkipTitle: '暂时跳过',
|
|
464
|
+
aiSkipDesc: '稍后可在 设置 → AI 中添加 API 密钥。',
|
|
465
|
+
// Step 6 — Review
|
|
466
|
+
reviewHint: '确认设置无误后,点击完成。',
|
|
467
|
+
reviewInstallResults: 'Agent 配置结果:',
|
|
468
|
+
phaseSaving: '正在保存配置…',
|
|
469
|
+
phaseAgents: '正在配置 Agent…',
|
|
470
|
+
phaseSkill: '正在安装 Skill…',
|
|
471
|
+
phaseDone: '设置完成!',
|
|
472
|
+
retryAgent: '重试',
|
|
473
|
+
agentFailedCount: (n: number) => `${n} 个 Agent 配置失败`,
|
|
474
|
+
agentCountSummary: (n: number) => `${n} 个 Agent`,
|
|
475
|
+
agentFailureNote: 'Agent 安装失败不影响进入 MindOS — 可稍后在 设置 → MCP 中重试。',
|
|
476
|
+
portAvailable: '可用',
|
|
477
|
+
portChanged: '端口已变更 — 请重启服务以使其生效。',
|
|
478
|
+
restartRequired: '以下变更需要重启服务后生效。',
|
|
479
|
+
restartNow: '立即重启',
|
|
480
|
+
restarting: '重启中…',
|
|
481
|
+
restartDone: '服务正在重启,稍后自动跳转…',
|
|
482
|
+
restartManual: '手动重启命令:',
|
|
483
|
+
// Buttons
|
|
484
|
+
back: '上一步',
|
|
485
|
+
next: '下一步',
|
|
486
|
+
complete: '完成设置',
|
|
487
|
+
skip: '跳过',
|
|
488
|
+
// Status
|
|
489
|
+
completing: '保存中...',
|
|
490
|
+
completeDone: '设置完成!',
|
|
491
|
+
completeFailed: '设置失败,请重试。',
|
|
492
|
+
// Welcome banner
|
|
493
|
+
welcomeTitle: '欢迎使用 MindOS!',
|
|
494
|
+
welcomeDesc: '初始化完成。可以开始向 AI 提问、浏览知识库,或配置 MCP Agent。',
|
|
495
|
+
welcomeLinkReconfigure: '重新配置',
|
|
496
|
+
welcomeLinkAskAI: '问 AI',
|
|
497
|
+
welcomeLinkMCP: 'MCP 设置',
|
|
498
|
+
},
|
|
499
|
+
guide: {
|
|
500
|
+
title: '开始使用 MindOS',
|
|
501
|
+
showGuide: '显示新手引导',
|
|
502
|
+
close: '关闭',
|
|
503
|
+
skip: '跳过',
|
|
504
|
+
kb: {
|
|
505
|
+
title: '探索你的知识库',
|
|
506
|
+
cta: '开始',
|
|
507
|
+
fullDesc: '你的知识库有 6 个区域,试试点开看看:',
|
|
508
|
+
dirs: {
|
|
509
|
+
profile: '你是谁、偏好、目标',
|
|
510
|
+
notes: '日常捕捉:想法、会议、待办',
|
|
511
|
+
connections: '你的人脉关系网',
|
|
512
|
+
workflows: '可复用的工作流程 SOP',
|
|
513
|
+
resources: '结构化数据:产品库、工具库',
|
|
514
|
+
projects: '项目计划和进展',
|
|
515
|
+
},
|
|
516
|
+
instructionHint: '点击 INSTRUCTION.md 看看 AI 的行为规则。',
|
|
517
|
+
emptyDesc: '你的知识库有 3 个核心文件:',
|
|
518
|
+
emptyFiles: {
|
|
519
|
+
instruction: 'INSTRUCTION.md — 所有 AI Agent 遵循的规则',
|
|
520
|
+
readme: 'README.md — 目录索引和导航',
|
|
521
|
+
config: 'CONFIG.json — 机器可读的配置偏好',
|
|
522
|
+
},
|
|
523
|
+
emptyHint: '你可以随时创建自己的目录结构。',
|
|
524
|
+
progress: (n: number) => `已浏览 ${n}/1 个文件`,
|
|
525
|
+
done: '完成',
|
|
526
|
+
},
|
|
527
|
+
ai: {
|
|
528
|
+
title: '和 AI 对话',
|
|
529
|
+
cta: '开始',
|
|
530
|
+
prompt: '读一下我的知识库,帮我把自我介绍写进 Profile。',
|
|
531
|
+
promptEmpty: '帮我设计一个适合我的知识库目录结构',
|
|
532
|
+
},
|
|
533
|
+
sync: {
|
|
534
|
+
title: '配置同步',
|
|
535
|
+
optional: '可选',
|
|
536
|
+
cta: '设置',
|
|
537
|
+
},
|
|
538
|
+
done: {
|
|
539
|
+
title: '你已准备好使用 MindOS',
|
|
540
|
+
titleFinal: '你已掌握 MindOS 核心用法',
|
|
541
|
+
steps: [
|
|
542
|
+
{ hint: '下一步:试试把一篇文章存进来 →', prompt: '帮我把这篇文章的要点整理到 MindOS 里。' },
|
|
543
|
+
{ hint: '下一步:试试在另一个 Agent 里调用知识库 →', prompt: '帮我按 MindOS 里的方案开始写代码。' },
|
|
544
|
+
{ hint: '下一步:试试把经验沉淀为 SOP →', prompt: '帮我把这次对话的经验沉淀到 MindOS,形成可复用的工作流。' },
|
|
545
|
+
],
|
|
546
|
+
},
|
|
547
|
+
},
|
|
548
|
+
} as const satisfies Widen<typeof en>;
|