@geminilight/mindos 0.6.30 → 0.6.32
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/README_zh.md +10 -4
- package/app/app/api/ask/route.ts +12 -7
- package/app/app/api/export/route.ts +105 -0
- package/app/app/globals.css +2 -2
- package/app/app/trash/page.tsx +7 -0
- package/app/app/view/[...path]/ViewPageClient.tsx +234 -2
- package/app/components/ExportModal.tsx +220 -0
- package/app/components/FileTree.tsx +22 -2
- package/app/components/HomeContent.tsx +91 -20
- package/app/components/MarkdownView.tsx +45 -10
- package/app/components/Sidebar.tsx +10 -1
- package/app/components/TrashPageClient.tsx +263 -0
- package/app/components/ask/ToolCallBlock.tsx +102 -18
- package/app/components/changes/ChangesContentPage.tsx +58 -14
- package/app/components/explore/ExploreContent.tsx +4 -7
- package/app/components/explore/UseCaseCard.tsx +18 -1
- package/app/components/explore/use-cases.generated.ts +76 -0
- package/app/components/explore/use-cases.yaml +185 -0
- package/app/components/panels/DiscoverPanel.tsx +1 -1
- package/app/components/renderers/workflow-yaml/StepEditor.tsx +98 -91
- package/app/components/renderers/workflow-yaml/WorkflowEditor.tsx +72 -72
- package/app/components/renderers/workflow-yaml/WorkflowRunner.tsx +175 -119
- package/app/components/renderers/workflow-yaml/WorkflowYamlRenderer.tsx +61 -61
- package/app/components/renderers/workflow-yaml/execution.ts +64 -12
- package/app/components/renderers/workflow-yaml/selectors.tsx +65 -13
- package/app/components/settings/AiTab.tsx +191 -174
- package/app/components/settings/AppearanceTab.tsx +168 -77
- package/app/components/settings/KnowledgeTab.tsx +131 -136
- package/app/components/settings/McpTab.tsx +11 -11
- package/app/components/settings/Primitives.tsx +60 -0
- package/app/components/settings/SettingsContent.tsx +15 -8
- package/app/components/settings/SyncTab.tsx +12 -12
- package/app/components/settings/UninstallTab.tsx +8 -18
- package/app/components/settings/UpdateTab.tsx +82 -82
- package/app/components/settings/types.ts +17 -8
- package/app/lib/acp/session.ts +12 -3
- package/app/lib/actions.ts +57 -3
- package/app/lib/agent/stream-consumer.ts +18 -0
- package/app/lib/agent/tools.ts +56 -9
- package/app/lib/core/export.ts +116 -0
- package/app/lib/core/trash.ts +241 -0
- package/app/lib/fs.ts +47 -0
- package/app/lib/hooks/usePinnedFiles.ts +90 -0
- package/app/lib/i18n/generated/explore-i18n.generated.ts +138 -0
- package/app/lib/i18n/index.ts +3 -0
- package/app/lib/i18n/modules/knowledge.ts +120 -6
- package/app/lib/i18n/modules/onboarding.ts +2 -134
- package/app/lib/i18n/modules/settings.ts +12 -0
- package/app/package.json +8 -2
- package/app/scripts/generate-explore.ts +145 -0
- package/package.json +1 -1
- package/app/components/explore/use-cases.ts +0 -58
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useSyncExternalStore, useCallback } from 'react';
|
|
4
|
+
|
|
5
|
+
const STORAGE_KEY = 'mindos-pinned-files';
|
|
6
|
+
const EVENT_KEY = 'mindos:pins-changed';
|
|
7
|
+
|
|
8
|
+
function getSnapshot(): string[] {
|
|
9
|
+
if (typeof window === 'undefined') return [];
|
|
10
|
+
try {
|
|
11
|
+
const raw = localStorage.getItem(STORAGE_KEY);
|
|
12
|
+
return raw ? JSON.parse(raw) : [];
|
|
13
|
+
} catch {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function getServerSnapshot(): string[] {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Lazy init — avoid calling getSnapshot() at module load time during SSR
|
|
23
|
+
let cachedPins: string[] = [];
|
|
24
|
+
let initialized = false;
|
|
25
|
+
|
|
26
|
+
function ensureInit(): void {
|
|
27
|
+
if (!initialized && typeof window !== 'undefined') {
|
|
28
|
+
cachedPins = getSnapshot();
|
|
29
|
+
initialized = true;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function subscribe(callback: () => void): () => void {
|
|
34
|
+
ensureInit();
|
|
35
|
+
const onStorage = (e: StorageEvent) => {
|
|
36
|
+
if (e.key === STORAGE_KEY) {
|
|
37
|
+
cachedPins = getSnapshot();
|
|
38
|
+
callback();
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const onCustom = () => {
|
|
42
|
+
cachedPins = getSnapshot();
|
|
43
|
+
callback();
|
|
44
|
+
};
|
|
45
|
+
window.addEventListener('storage', onStorage);
|
|
46
|
+
window.addEventListener(EVENT_KEY, onCustom);
|
|
47
|
+
return () => {
|
|
48
|
+
window.removeEventListener('storage', onStorage);
|
|
49
|
+
window.removeEventListener(EVENT_KEY, onCustom);
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function writePins(pins: string[]): void {
|
|
54
|
+
cachedPins = pins;
|
|
55
|
+
try {
|
|
56
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(pins));
|
|
57
|
+
} catch {
|
|
58
|
+
// localStorage unavailable (private browsing, quota exceeded) — memory only
|
|
59
|
+
}
|
|
60
|
+
window.dispatchEvent(new Event(EVENT_KEY));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function usePinnedFiles() {
|
|
64
|
+
ensureInit();
|
|
65
|
+
const pins = useSyncExternalStore(subscribe, () => cachedPins, getServerSnapshot);
|
|
66
|
+
|
|
67
|
+
const isPinned = useCallback((path: string) => pins.includes(path), [pins]);
|
|
68
|
+
|
|
69
|
+
const togglePin = useCallback((path: string) => {
|
|
70
|
+
const current = getSnapshot();
|
|
71
|
+
const idx = current.indexOf(path);
|
|
72
|
+
if (idx >= 0) {
|
|
73
|
+
current.splice(idx, 1);
|
|
74
|
+
} else {
|
|
75
|
+
current.unshift(path); // newest pin at top
|
|
76
|
+
}
|
|
77
|
+
writePins(current);
|
|
78
|
+
}, []);
|
|
79
|
+
|
|
80
|
+
const reorderPins = useCallback((newOrder: string[]) => {
|
|
81
|
+
writePins(newOrder);
|
|
82
|
+
}, []);
|
|
83
|
+
|
|
84
|
+
const removePin = useCallback((path: string) => {
|
|
85
|
+
const current = getSnapshot();
|
|
86
|
+
writePins(current.filter(p => p !== path));
|
|
87
|
+
}, []);
|
|
88
|
+
|
|
89
|
+
return { pinnedFiles: pins, isPinned, togglePin, reorderPins, removePin };
|
|
90
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// ⚠️ AUTO-GENERATED — DO NOT EDIT. Source: components/explore/use-cases.yaml
|
|
2
|
+
// Run `npm run generate` to regenerate.
|
|
3
|
+
|
|
4
|
+
export const exploreEn = {
|
|
5
|
+
"title": "Explore Use Cases",
|
|
6
|
+
"subtitle": "Discover what you can do with MindOS — pick a scenario and try it now.",
|
|
7
|
+
"tryIt": "Try it",
|
|
8
|
+
"all": "All",
|
|
9
|
+
"byCapability": "By Capability",
|
|
10
|
+
"byScenario": "By Scenario",
|
|
11
|
+
"categories": {
|
|
12
|
+
"knowledge-management": "Knowledge Management",
|
|
13
|
+
"memory-sync": "Memory Sync",
|
|
14
|
+
"auto-execute": "Auto Execute",
|
|
15
|
+
"experience-evolution": "Experience Evolution",
|
|
16
|
+
"human-insights": "Human Insights",
|
|
17
|
+
"audit-control": "Audit & Control"
|
|
18
|
+
},
|
|
19
|
+
"scenarios": {
|
|
20
|
+
"first-day": "First Day",
|
|
21
|
+
"daily": "Daily Work",
|
|
22
|
+
"project": "Project Work",
|
|
23
|
+
"advanced": "Advanced"
|
|
24
|
+
},
|
|
25
|
+
"c1": {
|
|
26
|
+
"title": "Inject Your Identity",
|
|
27
|
+
"desc": "Tell all AI agents who you are — preferences, tech stack, communication style — in one shot.",
|
|
28
|
+
"prompt": "Here's my resume, read it and organize my info into MindOS."
|
|
29
|
+
},
|
|
30
|
+
"c2": {
|
|
31
|
+
"title": "Save Information",
|
|
32
|
+
"desc": "Archive articles, meeting notes, or web pages into your knowledge base with one prompt.",
|
|
33
|
+
"prompt": "Help me save the key points from this article into MindOS."
|
|
34
|
+
},
|
|
35
|
+
"c3": {
|
|
36
|
+
"title": "Cross-Agent Handoff",
|
|
37
|
+
"desc": "Start a plan in MindOS, continue coding in Claude Code, refine in Cursor — zero context loss.",
|
|
38
|
+
"prompt": "Help me start coding based on the plan in MindOS."
|
|
39
|
+
},
|
|
40
|
+
"c4": {
|
|
41
|
+
"title": "Experience → SOP",
|
|
42
|
+
"desc": "Turn hard-won debugging sessions into reusable workflows that prevent future mistakes.",
|
|
43
|
+
"prompt": "Help me distill this conversation into a reusable workflow in MindOS."
|
|
44
|
+
},
|
|
45
|
+
"c5": {
|
|
46
|
+
"title": "Capture Ideas on the Go",
|
|
47
|
+
"desc": "Jot down an inspiration on your phone — MindOS archives, decomposes, and assigns to agents.",
|
|
48
|
+
"prompt": "Help me organize this idea into MindOS and break it into actionable sub-tasks."
|
|
49
|
+
},
|
|
50
|
+
"c6": {
|
|
51
|
+
"title": "Project Cold Start",
|
|
52
|
+
"desc": "Spin up a new project in 4 minutes — your profile and SOPs guide the scaffolding automatically.",
|
|
53
|
+
"prompt": "Help me start a new project following the Startup SOP in MindOS."
|
|
54
|
+
},
|
|
55
|
+
"c7": {
|
|
56
|
+
"title": "Research & Archive",
|
|
57
|
+
"desc": "Let agents research competitors or topics for you, then file structured results in your KB.",
|
|
58
|
+
"prompt": "Help me research X, Y, Z products and save results to the MindOS product library."
|
|
59
|
+
},
|
|
60
|
+
"c8": {
|
|
61
|
+
"title": "Network Management",
|
|
62
|
+
"desc": "Log conversations with contacts, auto-generate follow-up TODOs, and keep full context.",
|
|
63
|
+
"prompt": "I met with someone today — update MindOS Connections and create follow-up TODOs."
|
|
64
|
+
},
|
|
65
|
+
"c9": {
|
|
66
|
+
"title": "Audit & Correct",
|
|
67
|
+
"desc": "Review what agents know about you, fix mistakes in one place, and all agents update instantly.",
|
|
68
|
+
"prompt": "Check my MindOS Profile for accuracy and correct any errors."
|
|
69
|
+
}
|
|
70
|
+
} as const;
|
|
71
|
+
|
|
72
|
+
export const exploreZh = {
|
|
73
|
+
"title": "探索使用场景",
|
|
74
|
+
"subtitle": "发现 MindOS 能帮你做什么 — 选一个场景,立即体验。",
|
|
75
|
+
"tryIt": "试一试",
|
|
76
|
+
"all": "全部",
|
|
77
|
+
"byCapability": "按能力",
|
|
78
|
+
"byScenario": "按场景",
|
|
79
|
+
"categories": {
|
|
80
|
+
"knowledge-management": "知识管理",
|
|
81
|
+
"memory-sync": "记忆同步",
|
|
82
|
+
"auto-execute": "自动执行",
|
|
83
|
+
"experience-evolution": "经验进化",
|
|
84
|
+
"human-insights": "人类洞察",
|
|
85
|
+
"audit-control": "审计纠错"
|
|
86
|
+
},
|
|
87
|
+
"scenarios": {
|
|
88
|
+
"first-day": "初次使用",
|
|
89
|
+
"daily": "日常工作",
|
|
90
|
+
"project": "项目协作",
|
|
91
|
+
"advanced": "高级"
|
|
92
|
+
},
|
|
93
|
+
"c1": {
|
|
94
|
+
"title": "注入身份",
|
|
95
|
+
"desc": "让所有 AI Agent 一次认识你 — 偏好、技术栈、沟通风格。",
|
|
96
|
+
"prompt": "这是我的简历,读一下,把我的信息整理到 MindOS 里。"
|
|
97
|
+
},
|
|
98
|
+
"c2": {
|
|
99
|
+
"title": "注入信息",
|
|
100
|
+
"desc": "一句话归档文章、会议纪要或网页到知识库,全局可搜。",
|
|
101
|
+
"prompt": "帮我把这篇文章的要点整理到 MindOS 里。"
|
|
102
|
+
},
|
|
103
|
+
"c3": {
|
|
104
|
+
"title": "跨 Agent 切换",
|
|
105
|
+
"desc": "在 MindOS 写方案,在 Claude Code 写代码,在 Cursor 优化 — 零重复。",
|
|
106
|
+
"prompt": "帮我按 MindOS 里的 XXX 方案开始写代码。"
|
|
107
|
+
},
|
|
108
|
+
"c4": {
|
|
109
|
+
"title": "经验→SOP",
|
|
110
|
+
"desc": "把踩坑经验沉淀为可复用的工作流,下次 3 分钟搞定。",
|
|
111
|
+
"prompt": "帮我把这次对话的经验沉淀到 MindOS,形成可复用的工作流。"
|
|
112
|
+
},
|
|
113
|
+
"c5": {
|
|
114
|
+
"title": "手机记灵感",
|
|
115
|
+
"desc": "随手记下灵感,MindOS 自动归档、拆任务、多 Agent 接力执行。",
|
|
116
|
+
"prompt": "帮我把这个想法整理到 MindOS,拆解成可执行的子任务。"
|
|
117
|
+
},
|
|
118
|
+
"c6": {
|
|
119
|
+
"title": "项目冷启动",
|
|
120
|
+
"desc": "4 分钟搭建新项目 — Profile 和 SOP 自动引导脚手架。",
|
|
121
|
+
"prompt": "帮我按 MindOS 里的 Startup SOP 启动一个新项目。"
|
|
122
|
+
},
|
|
123
|
+
"c7": {
|
|
124
|
+
"title": "调研入库",
|
|
125
|
+
"desc": "让 Agent 替你跑腿调研竞品或话题,结果结构化入库。",
|
|
126
|
+
"prompt": "帮我调研 X、Y、Z 这几个产品,结果写入 MindOS 产品库。"
|
|
127
|
+
},
|
|
128
|
+
"c8": {
|
|
129
|
+
"title": "人脉管理",
|
|
130
|
+
"desc": "记录对话、自动生成跟进待办,每个联系人都有完整上下文。",
|
|
131
|
+
"prompt": "我今天和 XXX 聊了这些内容,帮我更新到 MindOS 并生成跟进待办。"
|
|
132
|
+
},
|
|
133
|
+
"c9": {
|
|
134
|
+
"title": "审计纠偏",
|
|
135
|
+
"desc": "审查 Agent 记了什么,一处修正,全局生效。",
|
|
136
|
+
"prompt": "帮我检查 MindOS Profile 里的技术栈偏好是否正确,有错误帮我修正。"
|
|
137
|
+
}
|
|
138
|
+
} as const;
|
package/app/lib/i18n/index.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { panelsEn, panelsZh } from './modules/panels';
|
|
|
7
7
|
import { settingsEn, settingsZh } from './modules/settings';
|
|
8
8
|
import { onboardingEn, onboardingZh } from './modules/onboarding';
|
|
9
9
|
import { featuresEn, featuresZh } from './modules/features';
|
|
10
|
+
import { exploreEn, exploreZh } from './generated/explore-i18n.generated';
|
|
10
11
|
|
|
11
12
|
export const en = {
|
|
12
13
|
...commonEn,
|
|
@@ -17,6 +18,7 @@ export const en = {
|
|
|
17
18
|
...settingsEn,
|
|
18
19
|
...onboardingEn,
|
|
19
20
|
...featuresEn,
|
|
21
|
+
explore: exploreEn,
|
|
20
22
|
} as const;
|
|
21
23
|
|
|
22
24
|
export const zh: Widen<typeof en> = {
|
|
@@ -28,6 +30,7 @@ export const zh: Widen<typeof en> = {
|
|
|
28
30
|
...settingsZh,
|
|
29
31
|
...onboardingZh,
|
|
30
32
|
...featuresZh,
|
|
33
|
+
explore: exploreZh,
|
|
31
34
|
};
|
|
32
35
|
|
|
33
36
|
export type Locale = 'en' | 'zh';
|
|
@@ -77,22 +77,79 @@ export const knowledgeEn = {
|
|
|
77
77
|
create: 'Create',
|
|
78
78
|
enterFileName: 'Enter a file name',
|
|
79
79
|
failed: 'Failed',
|
|
80
|
-
confirmDelete: (name: string) => `Delete "${name}"?
|
|
80
|
+
confirmDelete: (name: string) => `Delete "${name}"? You can recover from Trash for 30 days.`,
|
|
81
81
|
rules: 'Rules',
|
|
82
82
|
about: 'About',
|
|
83
83
|
viewAll: 'View all',
|
|
84
84
|
editRules: 'Edit Rules',
|
|
85
85
|
renameSpace: 'Rename Space',
|
|
86
86
|
deleteSpace: 'Delete Space',
|
|
87
|
-
confirmDeleteSpace: (name: string) => `Delete space "${name}" and all its files?
|
|
87
|
+
confirmDeleteSpace: (name: string) => `Delete space "${name}" and all its files? You can recover from Trash for 30 days.`,
|
|
88
88
|
convertToSpace: 'Convert to Space',
|
|
89
89
|
deleteFolder: 'Delete Folder',
|
|
90
|
-
confirmDeleteFolder: (name: string) => `Delete folder "${name}" and all its contents?
|
|
90
|
+
confirmDeleteFolder: (name: string) => `Delete folder "${name}" and all its contents? You can recover from Trash for 30 days.`,
|
|
91
91
|
newFile: 'New File',
|
|
92
92
|
importFile: 'Import File',
|
|
93
93
|
importToSpace: 'Import file to this space',
|
|
94
94
|
copyPath: 'Copy Path',
|
|
95
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',
|
|
96
153
|
},
|
|
97
154
|
fileImport: {
|
|
98
155
|
title: 'Import Files',
|
|
@@ -291,22 +348,79 @@ export const knowledgeZh = {
|
|
|
291
348
|
create: '创建',
|
|
292
349
|
enterFileName: '请输入文件名',
|
|
293
350
|
failed: '操作失败',
|
|
294
|
-
confirmDelete: (name: string) => `确定删除「${name}
|
|
351
|
+
confirmDelete: (name: string) => `确定删除「${name}」?可在回收站恢复(30 天内)。`,
|
|
295
352
|
rules: '规则',
|
|
296
353
|
about: '说明',
|
|
297
354
|
viewAll: '查看全部',
|
|
298
355
|
editRules: '编辑规则',
|
|
299
356
|
renameSpace: '重命名空间',
|
|
300
357
|
deleteSpace: '删除空间',
|
|
301
|
-
confirmDeleteSpace: (name: string) => `删除空间「${name}
|
|
358
|
+
confirmDeleteSpace: (name: string) => `删除空间「${name}」及其所有文件?可在回收站恢复(30 天内)。`,
|
|
302
359
|
convertToSpace: '转为空间',
|
|
303
360
|
deleteFolder: '删除文件夹',
|
|
304
|
-
confirmDeleteFolder: (name: string) => `删除文件夹「${name}
|
|
361
|
+
confirmDeleteFolder: (name: string) => `删除文件夹「${name}」及其所有内容?可在回收站恢复(30 天内)。`,
|
|
305
362
|
newFile: '新建文件',
|
|
306
363
|
importFile: '导入文件',
|
|
307
364
|
importToSpace: '导入文件到此空间',
|
|
308
365
|
copyPath: '复制路径',
|
|
309
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: '重试',
|
|
310
424
|
},
|
|
311
425
|
fileImport: {
|
|
312
426
|
title: '导入文件',
|
|
@@ -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: '下一步',
|
|
@@ -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: '深色',
|
package/app/package.json
CHANGED
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
"version": "0.1.0",
|
|
4
4
|
"private": true,
|
|
5
5
|
"scripts": {
|
|
6
|
-
"
|
|
7
|
-
"
|
|
6
|
+
"generate": "npx tsx scripts/generate-explore.ts",
|
|
7
|
+
"dev": "npx tsx scripts/generate-explore.ts && next dev -p ${MINDOS_WEB_PORT:-3456}",
|
|
8
|
+
"prebuild": "npx tsx scripts/generate-explore.ts && node ../scripts/gen-renderer-index.js",
|
|
8
9
|
"build": "next build --webpack",
|
|
9
10
|
"start": "next start -p ${MINDOS_WEB_PORT:-3456}",
|
|
10
11
|
"lint": "eslint",
|
|
@@ -32,7 +33,9 @@
|
|
|
32
33
|
"@tiptap/extension-task-list": "^3.20.1",
|
|
33
34
|
"@tiptap/react": "^3.20.1",
|
|
34
35
|
"@tiptap/starter-kit": "^3.20.1",
|
|
36
|
+
"@types/archiver": "^7.0.0",
|
|
35
37
|
"@xyflow/react": "^12.10.1",
|
|
38
|
+
"archiver": "^7.0.1",
|
|
36
39
|
"class-variance-authority": "^0.7.1",
|
|
37
40
|
"clsx": "^2.1.1",
|
|
38
41
|
"codemirror": "^6.0.2",
|
|
@@ -41,6 +44,7 @@
|
|
|
41
44
|
"github-slugger": "^2.0.0",
|
|
42
45
|
"js-yaml": "^4.1.1",
|
|
43
46
|
"lucide-react": "^0.577.0",
|
|
47
|
+
"marked": "^17.0.5",
|
|
44
48
|
"mcporter": "^0.7.3",
|
|
45
49
|
"nanoid": "^5.1.0",
|
|
46
50
|
"next": "16.1.6",
|
|
@@ -53,7 +57,9 @@
|
|
|
53
57
|
"rehype-highlight": "^7.0.2",
|
|
54
58
|
"rehype-raw": "^7.0.0",
|
|
55
59
|
"rehype-slug": "^6.0.0",
|
|
60
|
+
"remark": "^15.0.1",
|
|
56
61
|
"remark-gfm": "^4.0.1",
|
|
62
|
+
"remark-html": "^16.0.1",
|
|
57
63
|
"source-map-js": "^1.2.1",
|
|
58
64
|
"tailwind-merge": "^3.5.0",
|
|
59
65
|
"tiptap-markdown": "^0.9.0",
|