@geminilight/mindos 0.6.29 → 0.6.31

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.
Files changed (110) hide show
  1. package/README.md +10 -4
  2. package/README_zh.md +10 -4
  3. package/app/app/api/acp/config/route.ts +82 -0
  4. package/app/app/api/acp/detect/route.ts +71 -48
  5. package/app/app/api/acp/install/route.ts +51 -0
  6. package/app/app/api/acp/session/route.ts +141 -11
  7. package/app/app/api/ask/route.ts +126 -18
  8. package/app/app/api/export/route.ts +105 -0
  9. package/app/app/api/workflows/route.ts +156 -0
  10. package/app/app/globals.css +2 -2
  11. package/app/app/page.tsx +7 -2
  12. package/app/app/trash/page.tsx +7 -0
  13. package/app/app/view/[...path]/ViewPageClient.tsx +234 -2
  14. package/app/components/ActivityBar.tsx +12 -4
  15. package/app/components/AskModal.tsx +4 -1
  16. package/app/components/ExportModal.tsx +220 -0
  17. package/app/components/FileTree.tsx +42 -11
  18. package/app/components/HomeContent.tsx +92 -20
  19. package/app/components/MarkdownView.tsx +45 -10
  20. package/app/components/Panel.tsx +1 -0
  21. package/app/components/RightAskPanel.tsx +5 -1
  22. package/app/components/Sidebar.tsx +10 -1
  23. package/app/components/SidebarLayout.tsx +6 -0
  24. package/app/components/TrashPageClient.tsx +263 -0
  25. package/app/components/agents/AgentDetailContent.tsx +263 -47
  26. package/app/components/agents/AgentsContentPage.tsx +11 -0
  27. package/app/components/agents/AgentsPanelA2aTab.tsx +285 -46
  28. package/app/components/agents/AgentsPanelSessionsTab.tsx +166 -0
  29. package/app/components/agents/agents-content-model.ts +2 -2
  30. package/app/components/ask/AgentSelectorCapsule.tsx +218 -0
  31. package/app/components/ask/AskContent.tsx +197 -239
  32. package/app/components/ask/FileChip.tsx +82 -17
  33. package/app/components/ask/MentionPopover.tsx +21 -3
  34. package/app/components/ask/MessageList.tsx +30 -9
  35. package/app/components/ask/SlashCommandPopover.tsx +21 -3
  36. package/app/components/ask/ToolCallBlock.tsx +102 -18
  37. package/app/components/changes/ChangesContentPage.tsx +58 -14
  38. package/app/components/explore/ExploreContent.tsx +4 -7
  39. package/app/components/explore/UseCaseCard.tsx +18 -1
  40. package/app/components/explore/use-cases.generated.ts +76 -0
  41. package/app/components/explore/use-cases.yaml +185 -0
  42. package/app/components/panels/AgentsPanel.tsx +1 -0
  43. package/app/components/panels/AgentsPanelHubNav.tsx +9 -2
  44. package/app/components/panels/DiscoverPanel.tsx +1 -1
  45. package/app/components/panels/WorkflowsPanel.tsx +206 -0
  46. package/app/components/renderers/workflow-yaml/StepEditor.tsx +164 -0
  47. package/app/components/renderers/workflow-yaml/WorkflowEditor.tsx +211 -0
  48. package/app/components/renderers/workflow-yaml/WorkflowRunner.tsx +269 -0
  49. package/app/components/renderers/workflow-yaml/WorkflowYamlRenderer.tsx +126 -0
  50. package/app/components/renderers/workflow-yaml/execution.ts +229 -0
  51. package/app/components/renderers/workflow-yaml/index.ts +6 -0
  52. package/app/components/renderers/workflow-yaml/manifest.ts +21 -0
  53. package/app/components/renderers/workflow-yaml/parser.ts +172 -0
  54. package/app/components/renderers/workflow-yaml/selectors.tsx +574 -0
  55. package/app/components/renderers/workflow-yaml/serializer.ts +56 -0
  56. package/app/components/renderers/workflow-yaml/types.ts +46 -0
  57. package/app/components/settings/AiTab.tsx +191 -174
  58. package/app/components/settings/AppearanceTab.tsx +168 -77
  59. package/app/components/settings/KnowledgeTab.tsx +131 -136
  60. package/app/components/settings/McpTab.tsx +11 -11
  61. package/app/components/settings/Primitives.tsx +60 -0
  62. package/app/components/settings/SettingsContent.tsx +15 -8
  63. package/app/components/settings/SyncTab.tsx +12 -12
  64. package/app/components/settings/UninstallTab.tsx +8 -18
  65. package/app/components/settings/UpdateTab.tsx +82 -82
  66. package/app/components/settings/types.ts +17 -8
  67. package/app/hooks/useAcpConfig.ts +96 -0
  68. package/app/hooks/useAcpDetection.ts +69 -14
  69. package/app/hooks/useAcpRegistry.ts +46 -11
  70. package/app/hooks/useAskModal.ts +12 -5
  71. package/app/hooks/useAskPanel.ts +8 -5
  72. package/app/hooks/useAskSession.ts +19 -2
  73. package/app/hooks/useImageUpload.ts +152 -0
  74. package/app/lib/acp/acp-tools.ts +3 -1
  75. package/app/lib/acp/agent-descriptors.ts +274 -0
  76. package/app/lib/acp/bridge.ts +6 -0
  77. package/app/lib/acp/index.ts +20 -4
  78. package/app/lib/acp/registry.ts +74 -7
  79. package/app/lib/acp/session.ts +490 -28
  80. package/app/lib/acp/subprocess.ts +307 -21
  81. package/app/lib/acp/types.ts +158 -20
  82. package/app/lib/actions.ts +57 -3
  83. package/app/lib/agent/model.ts +18 -3
  84. package/app/lib/agent/stream-consumer.ts +18 -0
  85. package/app/lib/agent/to-agent-messages.ts +25 -2
  86. package/app/lib/agent/tools.ts +56 -9
  87. package/app/lib/core/export.ts +116 -0
  88. package/app/lib/core/trash.ts +241 -0
  89. package/app/lib/fs.ts +47 -0
  90. package/app/lib/hooks/usePinnedFiles.ts +90 -0
  91. package/app/lib/i18n/generated/explore-i18n.generated.ts +138 -0
  92. package/app/lib/i18n/index.ts +3 -0
  93. package/app/lib/i18n/modules/knowledge.ts +124 -6
  94. package/app/lib/i18n/modules/navigation.ts +2 -0
  95. package/app/lib/i18n/modules/onboarding.ts +2 -134
  96. package/app/lib/i18n/modules/panels.ts +146 -2
  97. package/app/lib/i18n/modules/settings.ts +12 -0
  98. package/app/lib/pi-integration/skills.ts +21 -6
  99. package/app/lib/renderers/index.ts +2 -2
  100. package/app/lib/settings.ts +10 -0
  101. package/app/lib/types.ts +12 -1
  102. package/app/next-env.d.ts +1 -1
  103. package/app/package.json +11 -3
  104. package/app/scripts/generate-explore.ts +145 -0
  105. package/package.json +1 -1
  106. package/templates/en/.mindos/workflows/Sprint Release.flow.yaml +130 -0
  107. package/templates/zh/.mindos/workflows//345/221/250/350/277/255/344/273/243/346/243/200/346/237/245.flow.yaml +84 -0
  108. package/app/components/explore/use-cases.ts +0 -58
  109. package/app/components/renderers/workflow/WorkflowRenderer.tsx +0 -409
  110. package/app/components/renderers/workflow/manifest.ts +0 -14
@@ -39,11 +39,13 @@ export const knowledgeEn = {
39
39
  'agent-inspector': 'Agent Inspector',
40
40
  'config-panel': 'Config Panel',
41
41
  'todo': 'TODO Board',
42
+ 'workflow-yaml': 'Workflows',
42
43
  } as Record<string, string>,
43
44
  toolDesc: {
44
45
  'agent-inspector': 'View agent tool-call logs and audit trail',
45
46
  'config-panel': 'Edit and manage global configuration',
46
47
  'todo': 'Manage tasks as an interactive kanban board',
48
+ 'workflow-yaml': 'Execute step-by-step workflows with AI assistance',
47
49
  } as Record<string, string>,
48
50
  plugins: 'Extensions',
49
51
  changeHistory: 'Change History',
@@ -75,22 +77,79 @@ export const knowledgeEn = {
75
77
  create: 'Create',
76
78
  enterFileName: 'Enter a file name',
77
79
  failed: 'Failed',
78
- confirmDelete: (name: string) => `Delete "${name}"? This cannot be undone.`,
80
+ confirmDelete: (name: string) => `Delete "${name}"? You can recover from Trash for 30 days.`,
79
81
  rules: 'Rules',
80
82
  about: 'About',
81
83
  viewAll: 'View all',
82
84
  editRules: 'Edit Rules',
83
85
  renameSpace: 'Rename Space',
84
86
  deleteSpace: 'Delete Space',
85
- confirmDeleteSpace: (name: string) => `Delete space "${name}" and all its files? This cannot be undone.`,
87
+ confirmDeleteSpace: (name: string) => `Delete space "${name}" and all its files? You can recover from Trash for 30 days.`,
86
88
  convertToSpace: 'Convert to Space',
87
89
  deleteFolder: 'Delete Folder',
88
- confirmDeleteFolder: (name: string) => `Delete folder "${name}" and all its contents? This cannot be undone.`,
90
+ confirmDeleteFolder: (name: string) => `Delete folder "${name}" and all its contents? You can recover from Trash for 30 days.`,
89
91
  newFile: 'New File',
90
92
  importFile: 'Import File',
91
93
  importToSpace: 'Import file to this space',
92
94
  copyPath: 'Copy Path',
93
95
  pathCopied: 'Path copied',
96
+ pinToFavorites: 'Pin to Favorites',
97
+ removeFromFavorites: 'Remove from Favorites',
98
+ export: 'Export...',
99
+ },
100
+ pinnedFiles: {
101
+ title: 'Pinned Files',
102
+ addedToast: 'Added to Favorites',
103
+ removedToast: 'Removed from Favorites',
104
+ empty: 'Pin files for quick access',
105
+ },
106
+ trash: {
107
+ title: 'Trash',
108
+ subtitle: 'Items you delete appear here for 30 days.',
109
+ empty: 'No deleted files yet.',
110
+ emptySubtext: 'Items you delete will appear here for 30 days.',
111
+ emptyTrash: 'Empty Trash',
112
+ emptyTrashConfirm: 'Permanently delete all items in Trash? This cannot be undone.',
113
+ restore: 'Restore',
114
+ deletePermanently: 'Delete Forever',
115
+ deletePermanentlyConfirm: (name: string) => `Permanently delete "${name}"? This cannot be undone.`,
116
+ from: 'From',
117
+ deletedAgo: (time: string) => `Deleted ${time}`,
118
+ expiresIn: (days: number) => `Expires in ${days} day${days !== 1 ? 's' : ''}`,
119
+ restored: 'Restored successfully',
120
+ deleted: 'Permanently deleted',
121
+ emptied: (count: number) => `Emptied ${count} item${count !== 1 ? 's' : ''} from Trash`,
122
+ restoreConflict: 'A file with this name already exists at the original location.',
123
+ overwrite: 'Overwrite',
124
+ saveAsCopy: 'Save as Copy',
125
+ itemCount: (n: number) => `${n} item${n !== 1 ? 's' : ''}`,
126
+ undoDelete: 'Undo',
127
+ viewInTrash: 'View in Trash',
128
+ fileDeleted: (name: string) => `"${name}" moved to Trash`,
129
+ },
130
+ export: {
131
+ title: 'Export',
132
+ exportFile: 'Export File',
133
+ exportSpace: 'Export Space',
134
+ chooseFormat: 'Choose format',
135
+ formatMd: 'Markdown (.md)',
136
+ formatMdDesc: 'Original format, editable',
137
+ formatHtml: 'HTML (.html)',
138
+ formatHtmlDesc: 'Static webpage, shareable',
139
+ formatZipMd: 'Markdown ZIP',
140
+ formatZipMdDesc: 'All files in original format',
141
+ formatZipHtml: 'HTML ZIP',
142
+ formatZipHtmlDesc: 'All files as webpages',
143
+ preview: 'Preview',
144
+ exporting: 'Exporting...',
145
+ exportButton: 'Export',
146
+ cancel: 'Cancel',
147
+ done: 'Export Complete',
148
+ downloadAgain: 'Download Again',
149
+ fileCount: (n: number) => `${n} file${n !== 1 ? 's' : ''}`,
150
+ downloaded: 'Downloaded',
151
+ error: 'Export failed',
152
+ retry: 'Retry',
94
153
  },
95
154
  fileImport: {
96
155
  title: 'Import Files',
@@ -251,11 +310,13 @@ export const knowledgeZh = {
251
310
  'agent-inspector': '审计面板',
252
311
  'config-panel': '配置面板',
253
312
  'todo': '待办面板',
313
+ 'workflow-yaml': '工作流',
254
314
  } as Record<string, string>,
255
315
  toolDesc: {
256
316
  'agent-inspector': '查看 Agent 操作日志与调用轨迹',
257
317
  'config-panel': '编辑和管理全局配置项',
258
318
  'todo': '以看板形式管理待办事项',
319
+ 'workflow-yaml': '执行多步骤工作流,AI 辅助执行',
259
320
  } as Record<string, string>,
260
321
  plugins: '扩展',
261
322
  changeHistory: '变更历史',
@@ -287,22 +348,79 @@ export const knowledgeZh = {
287
348
  create: '创建',
288
349
  enterFileName: '请输入文件名',
289
350
  failed: '操作失败',
290
- confirmDelete: (name: string) => `确定删除「${name}」?此操作不可撤销。`,
351
+ confirmDelete: (name: string) => `确定删除「${name}」?可在回收站恢复(30 天内)。`,
291
352
  rules: '规则',
292
353
  about: '说明',
293
354
  viewAll: '查看全部',
294
355
  editRules: '编辑规则',
295
356
  renameSpace: '重命名空间',
296
357
  deleteSpace: '删除空间',
297
- confirmDeleteSpace: (name: string) => `删除空间「${name}」及其所有文件?此操作不可撤销。`,
358
+ confirmDeleteSpace: (name: string) => `删除空间「${name}」及其所有文件?可在回收站恢复(30 天内)。`,
298
359
  convertToSpace: '转为空间',
299
360
  deleteFolder: '删除文件夹',
300
- confirmDeleteFolder: (name: string) => `删除文件夹「${name}」及其所有内容?此操作不可撤销。`,
361
+ confirmDeleteFolder: (name: string) => `删除文件夹「${name}」及其所有内容?可在回收站恢复(30 天内)。`,
301
362
  newFile: '新建文件',
302
363
  importFile: '导入文件',
303
364
  importToSpace: '导入文件到此空间',
304
365
  copyPath: '复制路径',
305
366
  pathCopied: '路径已复制',
367
+ pinToFavorites: '固定到收藏',
368
+ removeFromFavorites: '取消收藏',
369
+ export: '导出...',
370
+ },
371
+ pinnedFiles: {
372
+ title: '收藏文件',
373
+ addedToast: '已添加到收藏',
374
+ removedToast: '已取消收藏',
375
+ empty: '固定文件以快速访问',
376
+ },
377
+ trash: {
378
+ title: '回收站',
379
+ subtitle: '删除的文件将保留 30 天。',
380
+ empty: '回收站为空',
381
+ emptySubtext: '删除的文件将在此处保留 30 天。',
382
+ emptyTrash: '清空回收站',
383
+ emptyTrashConfirm: '永久删除回收站中的所有项目?此操作不可撤销。',
384
+ restore: '恢复',
385
+ deletePermanently: '彻底删除',
386
+ deletePermanentlyConfirm: (name: string) => `确定彻底删除「${name}」?此操作不可撤销。`,
387
+ from: '来自',
388
+ deletedAgo: (time: string) => `${time}删除`,
389
+ expiresIn: (days: number) => `${days} 天后过期`,
390
+ restored: '已恢复',
391
+ deleted: '已彻底删除',
392
+ emptied: (count: number) => `已清空 ${count} 个项目`,
393
+ restoreConflict: '原位置已有同名文件。',
394
+ overwrite: '覆盖',
395
+ saveAsCopy: '保存副本',
396
+ itemCount: (n: number) => `${n} 个项目`,
397
+ undoDelete: '撤销',
398
+ viewInTrash: '查看回收站',
399
+ fileDeleted: (name: string) => `「${name}」已移至回收站`,
400
+ },
401
+ export: {
402
+ title: '导出',
403
+ exportFile: '导出文件',
404
+ exportSpace: '导出空间',
405
+ chooseFormat: '选择格式',
406
+ formatMd: 'Markdown (.md)',
407
+ formatMdDesc: '原始格式,可编辑',
408
+ formatHtml: 'HTML (.html)',
409
+ formatHtmlDesc: '静态网页,可分享',
410
+ formatZipMd: 'Markdown ZIP',
411
+ formatZipMdDesc: '所有文件,原始格式',
412
+ formatZipHtml: 'HTML ZIP',
413
+ formatZipHtmlDesc: '所有文件,网页格式',
414
+ preview: '预览',
415
+ exporting: '导出中...',
416
+ exportButton: '导出',
417
+ cancel: '取消',
418
+ done: '导出完成',
419
+ downloadAgain: '再次下载',
420
+ fileCount: (n: number) => `${n} 个文件`,
421
+ downloaded: '已下载',
422
+ error: '导出失败',
423
+ retry: '重试',
306
424
  },
307
425
  fileImport: {
308
426
  title: '导入文件',
@@ -11,6 +11,7 @@ export const navigationEn = {
11
11
  agents: 'Agents',
12
12
  echo: 'Echo',
13
13
  discover: 'Discover',
14
+ workflows: 'Flows',
14
15
  history: 'History',
15
16
  help: 'Help',
16
17
  syncLabel: 'Sync',
@@ -86,6 +87,7 @@ export const navigationZh = {
86
87
  agents: '智能体',
87
88
  echo: '回响',
88
89
  discover: '探索',
90
+ workflows: '流程',
89
91
  history: '历史',
90
92
  help: '帮助',
91
93
  syncLabel: '同步',
@@ -166,73 +166,7 @@ export const onboardingEn = {
166
166
  ],
167
167
  },
168
168
  },
169
- explore: {
170
- title: 'Explore Use Cases',
171
- subtitle: 'Discover what you can do with MindOS — pick a scenario and try it now.',
172
- tryIt: 'Try it',
173
- categories: {
174
- 'knowledge-management': 'Knowledge Management',
175
- 'memory-sync': 'Memory Sync',
176
- 'auto-execute': 'Auto Execute',
177
- 'experience-evolution': 'Experience Evolution',
178
- 'human-insights': 'Human Insights',
179
- 'audit-control': 'Audit & Control',
180
- },
181
- scenarios: {
182
- 'first-day': 'First Day',
183
- 'daily': 'Daily Work',
184
- 'project': 'Project Work',
185
- 'advanced': 'Advanced',
186
- },
187
- all: 'All',
188
- byCapability: 'By Capability',
189
- byScenario: 'By Scenario',
190
- c1: {
191
- title: 'Inject Your Identity',
192
- desc: 'Tell all AI agents who you are — preferences, tech stack, communication style — in one shot.',
193
- prompt: "Here's my resume, read it and organize my info into MindOS.",
194
- },
195
- c2: {
196
- title: 'Save Information',
197
- desc: 'Archive articles, meeting notes, or web pages into your knowledge base with one prompt.',
198
- prompt: 'Help me save the key points from this article into MindOS.',
199
- },
200
- c3: {
201
- title: 'Cross-Agent Handoff',
202
- desc: 'Start a plan in MindOS, continue coding in Claude Code, refine in Cursor — zero context loss.',
203
- prompt: 'Help me start coding based on the plan in MindOS.',
204
- },
205
- c4: {
206
- title: 'Experience → SOP',
207
- desc: 'Turn hard-won debugging sessions into reusable workflows that prevent future mistakes.',
208
- prompt: 'Help me distill this conversation into a reusable workflow in MindOS.',
209
- },
210
- c5: {
211
- title: 'Capture Ideas on the Go',
212
- desc: 'Jot down an inspiration on your phone — MindOS archives, decomposes, and assigns to agents.',
213
- prompt: 'Help me organize this idea into MindOS and break it into actionable sub-tasks.',
214
- },
215
- c6: {
216
- title: 'Project Cold Start',
217
- desc: 'Spin up a new project in 4 minutes — your profile and SOPs guide the scaffolding automatically.',
218
- prompt: 'Help me start a new project following the Startup SOP in MindOS.',
219
- },
220
- c7: {
221
- title: 'Research & Archive',
222
- desc: 'Let agents research competitors or topics for you, then file structured results in your KB.',
223
- prompt: 'Help me research X, Y, Z products and save results to the MindOS product library.',
224
- },
225
- c8: {
226
- title: 'Network Management',
227
- desc: 'Log conversations with contacts, auto-generate follow-up TODOs, and keep full context.',
228
- prompt: 'I met with someone today — update MindOS Connections and create follow-up TODOs.',
229
- },
230
- c9: {
231
- title: 'Audit & Correct',
232
- desc: 'Review what agents know about you, fix mistakes in one place, and all agents update instantly.',
233
- prompt: 'Check my MindOS Profile for accuracy and correct any errors.',
234
- },
235
- },
169
+ // explore: moved to use-cases.yaml → generated/explore-i18n.generated.ts
236
170
  walkthrough: {
237
171
  step: (current: number, total: number) => `${current} of ${total}`,
238
172
  next: 'Next',
@@ -427,73 +361,7 @@ export const onboardingZh = {
427
361
  ],
428
362
  },
429
363
  },
430
- explore: {
431
- title: '探索使用场景',
432
- subtitle: '发现 MindOS 能帮你做什么 — 选一个场景,立即体验。',
433
- tryIt: '试一试',
434
- categories: {
435
- 'knowledge-management': '知识管理',
436
- 'memory-sync': '记忆同步',
437
- 'auto-execute': '自动执行',
438
- 'experience-evolution': '经验进化',
439
- 'human-insights': '人类洞察',
440
- 'audit-control': '审计纠错',
441
- },
442
- scenarios: {
443
- 'first-day': '初次使用',
444
- 'daily': '日常工作',
445
- 'project': '项目协作',
446
- 'advanced': '高级',
447
- },
448
- all: '全部',
449
- byCapability: '按能力',
450
- byScenario: '按场景',
451
- c1: {
452
- title: '注入身份',
453
- desc: '让所有 AI Agent 一次认识你 — 偏好、技术栈、沟通风格。',
454
- prompt: '这是我的简历,读一下,把我的信息整理到 MindOS 里。',
455
- },
456
- c2: {
457
- title: '注入信息',
458
- desc: '一句话归档文章、会议纪要或网页到知识库,全局可搜。',
459
- prompt: '帮我把这篇文章的要点整理到 MindOS 里。',
460
- },
461
- c3: {
462
- title: '跨 Agent 切换',
463
- desc: '在 MindOS 写方案,在 Claude Code 写代码,在 Cursor 优化 — 零重复。',
464
- prompt: '帮我按 MindOS 里的 XXX 方案开始写代码。',
465
- },
466
- c4: {
467
- title: '经验→SOP',
468
- desc: '把踩坑经验沉淀为可复用的工作流,下次 3 分钟搞定。',
469
- prompt: '帮我把这次对话的经验沉淀到 MindOS,形成可复用的工作流。',
470
- },
471
- c5: {
472
- title: '手机记灵感',
473
- desc: '随手记下灵感,MindOS 自动归档、拆任务、多 Agent 接力执行。',
474
- prompt: '帮我把这个想法整理到 MindOS,拆解成可执行的子任务。',
475
- },
476
- c6: {
477
- title: '项目冷启动',
478
- desc: '4 分钟搭建新项目 — Profile 和 SOP 自动引导脚手架。',
479
- prompt: '帮我按 MindOS 里的 Startup SOP 启动一个新项目。',
480
- },
481
- c7: {
482
- title: '调研入库',
483
- desc: '让 Agent 替你跑腿调研竞品或话题,结果结构化入库。',
484
- prompt: '帮我调研 X、Y、Z 这几个产品,结果写入 MindOS 产品库。',
485
- },
486
- c8: {
487
- title: '人脉管理',
488
- desc: '记录对话、自动生成跟进待办,每个联系人都有完整上下文。',
489
- prompt: '我今天和 XXX 聊了这些内容,帮我更新到 MindOS 并生成跟进待办。',
490
- },
491
- c9: {
492
- title: '审计纠偏',
493
- desc: '审查 Agent 记了什么,一处修正,全局生效。',
494
- prompt: '帮我检查 MindOS Profile 里的技术栈偏好是否正确,有错误帮我修正。',
495
- },
496
- },
364
+ // explore: moved to use-cases.yaml → generated/explore-i18n.generated.ts
497
365
  walkthrough: {
498
366
  step: (current: number, total: number) => `${current} / ${total}`,
499
367
  next: '下一步',
@@ -40,6 +40,7 @@ export const panelsEn = {
40
40
  navMcp: 'MCP',
41
41
  navSkills: 'Skills',
42
42
  navNetwork: 'Network',
43
+ navSessions: 'Sessions',
43
44
  // A2A tab
44
45
  a2aTabTitle: 'Remote Agents',
45
46
  a2aTabEmpty: 'No remote agents',
@@ -90,11 +91,33 @@ export const panelsEn = {
90
91
  acpComingSoon: 'Coming soon \u2014 use Ask AI to invoke',
91
92
  acpReady: 'Ready',
92
93
  acpNotInstalled: 'Not Installed',
93
- acpScan: 'Scan Local',
94
+ acpScan: 'Re-scan',
94
95
  acpInstallHint: (cmd: string) => `Install with: ${cmd}`,
96
+ acpInstall: 'Install',
97
+ acpInstalling: 'Installing…',
95
98
  acpLoading: 'Loading ACP registry\u2026',
96
99
  acpLoadFailed: 'Failed to load ACP registry.',
97
100
  acpRetry: 'Retry',
101
+ acpQuickReview: 'Review code',
102
+ acpQuickFix: 'Fix bugs',
103
+ acpQuickExplain: 'Explain repo',
104
+ acpUseWith: (name: string) => `Use ${name} to `,
105
+ acpDefaultAgent: 'MindOS Agent',
106
+ acpSelectAgent: 'Select Agent',
107
+ acpChangeAgent: 'Change agent',
108
+ acpConfigToggle: 'Configure',
109
+ acpConfigCommand: 'Command',
110
+ acpConfigArgs: 'Args',
111
+ acpConfigEnv: 'Env',
112
+ acpConfigEnvAdd: 'Add env var',
113
+ acpConfigSource: 'Source',
114
+ acpConfigSourceBuiltin: 'built-in',
115
+ acpConfigSourceRegistry: 'registry',
116
+ acpConfigSourceUser: 'custom',
117
+ acpConfigReset: 'Reset',
118
+ acpConfigSave: 'Save',
119
+ acpConfigSaved: 'Saved',
120
+ acpConfigPath: 'Path',
98
121
  networkEmptyTitle: 'Connect to the agent ecosystem',
99
122
  networkEmptyDesc: 'Discover remote agents or browse coding agents from the ACP registry.',
100
123
  networkDiscoverBtn: 'Discover Agent',
@@ -139,6 +162,22 @@ export const panelsEn = {
139
162
  viewAll: 'View all use cases',
140
163
  tryIt: 'Try',
141
164
  },
165
+ workflows: {
166
+ title: 'Flows',
167
+ empty: 'No flows yet',
168
+ emptyDesc: 'Create your first flow to automate multi-step tasks with AI.',
169
+ newWorkflow: 'New Flow',
170
+ nSteps: (n: number) => `${n} step${n === 1 ? '' : 's'}`,
171
+ parseError: 'Parse error',
172
+ name: 'Name',
173
+ namePlaceholder: 'My Flow',
174
+ template: 'Template',
175
+ templateBlank: 'Blank',
176
+ create: 'Create',
177
+ cancel: 'Cancel',
178
+ creating: 'Creating...',
179
+ exists: 'A workflow with this name already exists',
180
+ },
142
181
  },
143
182
  echoPages: {
144
183
  parent: 'Echo',
@@ -211,6 +250,7 @@ export const panelsEn = {
211
250
  navMcp: 'MCP',
212
251
  navSkills: 'Skills',
213
252
  navNetwork: 'Network',
253
+ navSessions: 'Sessions',
214
254
  a2aTabTitle: 'Remote Agents',
215
255
  a2aTabEmptyHint: 'Discover agents to enable cross-agent delegation.',
216
256
  backToOverview: 'Back to Agents',
@@ -518,6 +558,38 @@ export const panelsEn = {
518
558
  mcpReconnectAll: 'Reconnect all',
519
559
  mcpReconnectAllRunning: 'Reconnecting...',
520
560
  mcpReconnectAllDone: (ok: number, failed: number) => `Reconnected ${ok}${failed > 0 ? `, failed ${failed}` : ''}.`,
561
+ // ─── Runtime & Diagnostics ───
562
+ runtimeDiagTitle: 'Runtime & Diagnostics',
563
+ runtimePing: 'Ping',
564
+ runtimePinging: 'Pinging...',
565
+ runtimePingOk: (ms: number) => `Reachable (${ms}ms)`,
566
+ runtimePingFail: 'Unreachable',
567
+ runtimeUptime: 'Uptime',
568
+ runtimePid: 'Process',
569
+ runtimeMemory: 'Memory',
570
+ runtimeVersion: 'Version',
571
+ runtimeStartedAt: 'Started',
572
+ runtimeNoData: 'No runtime data available.',
573
+ // ─── Environment & Permissions ───
574
+ envPermTitle: 'Environment & Permissions',
575
+ envVars: 'Environment variables',
576
+ envVarsCount: (n: number) => `${n} configured`,
577
+ envVarsEmpty: 'No custom environment variables.',
578
+ envScope: 'Scope',
579
+ envReadOnly: 'Read-only access',
580
+ envWriteAccess: 'Write access',
581
+ envFileAccess: 'File access',
582
+ envNetworkAccess: 'Network access',
583
+ envAllowed: 'Allowed',
584
+ envRestricted: 'Restricted',
585
+ // ─── Activity & Usage ───
586
+ activityTitle: 'Activity & Usage',
587
+ activityTotal: 'Total invocations',
588
+ activityLast7d: 'Last 7 days',
589
+ activityLastInvocation: 'Last invocation',
590
+ activityTokensUsed: 'Tokens used',
591
+ activityAvgLatency: 'Avg latency',
592
+ activityNoData: 'No activity recorded yet.',
521
593
  },
522
594
  detailSubtitle: '',
523
595
  detailNotFound: 'Agent not found — it may have been removed or renamed.',
@@ -565,6 +637,7 @@ export const panelsZh = {
565
637
  navMcp: 'MCP',
566
638
  navSkills: '技能',
567
639
  navNetwork: '网络',
640
+ navSessions: '会话',
568
641
  // A2A tab
569
642
  a2aTabTitle: '远程 Agent',
570
643
  a2aTabEmpty: '无远程 Agent',
@@ -615,11 +688,33 @@ export const panelsZh = {
615
688
  acpComingSoon: '即将上线 — 当前可通过 Ask AI 调用',
616
689
  acpReady: '就绪',
617
690
  acpNotInstalled: '未安装',
618
- acpScan: '扫描本地',
691
+ acpScan: '重新扫描',
619
692
  acpInstallHint: (cmd: string) => `安装命令: ${cmd}`,
693
+ acpInstall: '安装',
694
+ acpInstalling: '安装中…',
620
695
  acpLoading: '加载 ACP 注册表中…',
621
696
  acpLoadFailed: '加载 ACP 注册表失败。',
622
697
  acpRetry: '重试',
698
+ acpQuickReview: '代码审查',
699
+ acpQuickFix: '修复Bug',
700
+ acpQuickExplain: '解释项目',
701
+ acpUseWith: (name: string) => `使用 ${name} `,
702
+ acpDefaultAgent: 'MindOS Agent',
703
+ acpSelectAgent: '选择 Agent',
704
+ acpChangeAgent: '切换 Agent',
705
+ acpConfigToggle: '配置',
706
+ acpConfigCommand: '命令',
707
+ acpConfigArgs: '参数',
708
+ acpConfigEnv: '环境变量',
709
+ acpConfigEnvAdd: '添加环境变量',
710
+ acpConfigSource: '来源',
711
+ acpConfigSourceBuiltin: '内置',
712
+ acpConfigSourceRegistry: '注册表',
713
+ acpConfigSourceUser: '自定义',
714
+ acpConfigReset: '重置',
715
+ acpConfigSave: '保存',
716
+ acpConfigSaved: '已保存',
717
+ acpConfigPath: '路径',
623
718
  networkEmptyTitle: '连接智能体生态',
624
719
  networkEmptyDesc: '发现远程 Agent 或浏览 ACP 注册表中的编程智能体。',
625
720
  networkDiscoverBtn: '发现 Agent',
@@ -664,6 +759,22 @@ export const panelsZh = {
664
759
  viewAll: '查看所有使用案例',
665
760
  tryIt: '试试',
666
761
  },
762
+ workflows: {
763
+ title: '流程',
764
+ empty: '还没有流程',
765
+ emptyDesc: '创建第一个流程,用 AI 自动化多步骤任务。',
766
+ newWorkflow: '新建流程',
767
+ nSteps: (n: number) => `${n} 个步骤`,
768
+ parseError: '解析错误',
769
+ name: '名称',
770
+ namePlaceholder: '我的流程',
771
+ template: '模板',
772
+ templateBlank: '空白',
773
+ create: '创建',
774
+ cancel: '取消',
775
+ creating: '创建中...',
776
+ exists: '已存在同名流程',
777
+ },
667
778
  },
668
779
  echoPages: {
669
780
  parent: '回响',
@@ -736,6 +847,7 @@ export const panelsZh = {
736
847
  navMcp: 'MCP',
737
848
  navSkills: 'Skills',
738
849
  navNetwork: '网络',
850
+ navSessions: '会话',
739
851
  a2aTabTitle: '远程 Agent',
740
852
  a2aTabEmptyHint: '发现远程 Agent 以启用跨 Agent 委派。',
741
853
  backToOverview: '返回 Agents',
@@ -1043,6 +1155,38 @@ export const panelsZh = {
1043
1155
  mcpReconnectAll: '全部重连',
1044
1156
  mcpReconnectAllRunning: '正在重连...',
1045
1157
  mcpReconnectAllDone: (ok: number, failed: number) => `已重连 ${ok}${failed > 0 ? `,失败 ${failed}` : ''}。`,
1158
+ // ─── 运行与诊断 ───
1159
+ runtimeDiagTitle: '运行与诊断',
1160
+ runtimePing: '连通测试',
1161
+ runtimePinging: '测试中...',
1162
+ runtimePingOk: (ms: number) => `可达 (${ms}ms)`,
1163
+ runtimePingFail: '不可达',
1164
+ runtimeUptime: '运行时长',
1165
+ runtimePid: '进程',
1166
+ runtimeMemory: '内存',
1167
+ runtimeVersion: '版本',
1168
+ runtimeStartedAt: '启动于',
1169
+ runtimeNoData: '暂无运行数据。',
1170
+ // ─── 环境与权限 ───
1171
+ envPermTitle: '环境与权限',
1172
+ envVars: '环境变量',
1173
+ envVarsCount: (n: number) => `已配置 ${n} 个`,
1174
+ envVarsEmpty: '暂无自定义环境变量。',
1175
+ envScope: '作用域',
1176
+ envReadOnly: '只读访问',
1177
+ envWriteAccess: '写入访问',
1178
+ envFileAccess: '文件访问',
1179
+ envNetworkAccess: '网络访问',
1180
+ envAllowed: '允许',
1181
+ envRestricted: '受限',
1182
+ // ─── 活动与用量 ───
1183
+ activityTitle: '活动与用量',
1184
+ activityTotal: '总调用次数',
1185
+ activityLast7d: '近 7 天',
1186
+ activityLastInvocation: '最近调用',
1187
+ activityTokensUsed: '消耗 Tokens',
1188
+ activityAvgLatency: '平均延迟',
1189
+ activityNoData: '暂无活动记录。',
1046
1190
  },
1047
1191
  detailSubtitle: '',
1048
1192
  detailNotFound: '未找到该 Agent,可能已移除或重命名。',
@@ -30,6 +30,7 @@ export const settingsEn = {
30
30
  },
31
31
  agent: {
32
32
  title: 'Agent Behavior',
33
+ subtitle: 'Configure how the AI agent operates',
33
34
  maxSteps: 'Max Steps',
34
35
  maxStepsHint: 'Maximum tool call steps per request (1-30)',
35
36
  contextStrategy: 'Context Strategy',
@@ -44,8 +45,13 @@ export const settingsEn = {
44
45
  reconnectRetriesHint: 'When connection drops, automatically retry this many times before giving up (0 = disabled)',
45
46
  },
46
47
  appearance: {
48
+ readingTitle: 'Reading',
49
+ readingDesc: 'Customize how your notes look',
47
50
  readingFont: 'Reading font',
51
+ fontSize: 'Font size',
52
+ fontSizePreview: 'The quick brown fox.',
48
53
  contentWidth: 'Content width',
54
+ preferencesTitle: 'Preferences',
49
55
  colorTheme: 'Color theme',
50
56
  system: 'System',
51
57
  dark: 'Dark',
@@ -322,6 +328,7 @@ export const settingsZh = {
322
328
  },
323
329
  agent: {
324
330
  title: 'Agent 行为',
331
+ subtitle: '配置 AI 代理的运行方式',
325
332
  maxSteps: '最大步数',
326
333
  maxStepsHint: '每次请求的最大工具调用步数(1-30)',
327
334
  contextStrategy: '上下文策略',
@@ -336,8 +343,13 @@ export const settingsZh = {
336
343
  reconnectRetriesHint: '连接断开时自动重试次数,重试耗尽后停止(0 = 关闭)',
337
344
  },
338
345
  appearance: {
346
+ readingTitle: '阅读',
347
+ readingDesc: '自定义笔记的阅读体验',
339
348
  readingFont: '正文字体',
349
+ fontSize: '字体大小',
350
+ fontSizePreview: '人之初性本善。',
340
351
  contentWidth: '内容宽度',
352
+ preferencesTitle: '偏好',
341
353
  colorTheme: '颜色主题',
342
354
  system: '系统',
343
355
  dark: '深色',
@@ -23,15 +23,30 @@ export function parseSkillMd(content: string): { name: string; description: stri
23
23
  if (!match) return { name: '', description: '' };
24
24
  const yaml = match[1];
25
25
  const nameMatch = yaml.match(/^name:\s*(.+)/m);
26
- const descMatch = yaml.match(/^description:\s*>?\s*\n?([\s\S]*?)(?=\n\w|\n---)/m);
27
- const name = nameMatch ? nameMatch[1].trim() : '';
26
+
27
+ // Try to match block scalar (description: >) first
28
+ // Captures all indented lines until next non-indented line or EOF
28
29
  let description = '';
29
- if (descMatch) {
30
- description = descMatch[1].trim().split('\n').map((l) => l.trim()).join(' ').slice(0, 200);
30
+ const blockMatch = yaml.match(/^description:\s*>?\s*\n((?:\s+.+\n?)*)/m);
31
+ if (blockMatch && blockMatch[1].trim()) {
32
+ // Block scalar: join indented lines, dedent, preserve structure
33
+ description = blockMatch[1]
34
+ .split('\n')
35
+ .map(line => line.replace(/^\s+/, '')) // Remove leading spaces
36
+ .filter(line => line.trim()) // Remove empty lines
37
+ .join(' ')
38
+ .slice(0, 200);
31
39
  } else {
32
- const simpleDesc = yaml.match(/^description:\s*(.+)/m);
33
- if (simpleDesc) description = simpleDesc[1].trim().slice(0, 200);
40
+ // Fallback to single-line description
41
+ const simpleMatch = yaml.match(/^description:\s*(.+)/m);
42
+ if (simpleMatch) {
43
+ const val = simpleMatch[1].trim();
44
+ // Skip the ">" character if it's there (fallback from block scalar)
45
+ description = val === '>' ? '' : val.slice(0, 200);
46
+ }
34
47
  }
48
+
49
+ const name = nameMatch ? nameMatch[1].trim() : '';
35
50
  return { name, description };
36
51
  }
37
52
 
@@ -10,11 +10,11 @@ import { manifest as csv } from '@/components/renderers/csv/manifest';
10
10
  import { manifest as summary } from '@/components/renderers/summary/manifest';
11
11
  import { manifest as timeline } from '@/components/renderers/timeline/manifest';
12
12
  import { manifest as todo } from '@/components/renderers/todo/manifest';
13
- import { manifest as workflow } from '@/components/renderers/workflow/manifest';
13
+ import { manifest as workflowYaml } from '@/components/renderers/workflow-yaml/manifest';
14
14
  import { manifest as graph } from '@/components/renderers/graph/manifest';
15
15
 
16
16
  const manifests = [
17
- agentInspector, backlinks, config, csv, summary, timeline, todo, workflow, graph,
17
+ agentInspector, backlinks, config, csv, summary, timeline, todo, workflowYaml, graph,
18
18
  ];
19
19
 
20
20
  for (const m of manifests) {