@geminilight/mindos 0.1.0
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/.env.local.example +38 -0
- package/LICENSE +21 -0
- package/README.md +423 -0
- package/README_zh.md +423 -0
- package/app/README.md +152 -0
- package/app/app/api/ask/route.ts +170 -0
- package/app/app/api/ask-sessions/route.ts +90 -0
- package/app/app/api/auth/route.ts +37 -0
- package/app/app/api/backlinks/route.ts +22 -0
- package/app/app/api/bootstrap/route.ts +37 -0
- package/app/app/api/extract-pdf/route.ts +82 -0
- package/app/app/api/file/route.ts +138 -0
- package/app/app/api/files/route.ts +12 -0
- package/app/app/api/git/route.ts +42 -0
- package/app/app/api/graph/route.ts +113 -0
- package/app/app/api/recent-files/route.ts +10 -0
- package/app/app/api/search/route.ts +17 -0
- package/app/app/api/settings/reset-token/route.ts +21 -0
- package/app/app/api/settings/route.ts +123 -0
- package/app/app/error.tsx +33 -0
- package/app/app/globals.css +368 -0
- package/app/app/icon.svg +35 -0
- package/app/app/layout.tsx +103 -0
- package/app/app/login/page.tsx +120 -0
- package/app/app/page.tsx +12 -0
- package/app/app/view/[...path]/ViewPageClient.tsx +343 -0
- package/app/app/view/[...path]/error.tsx +33 -0
- package/app/app/view/[...path]/loading.tsx +15 -0
- package/app/app/view/[...path]/page.tsx +93 -0
- package/app/components/AskFab.tsx +59 -0
- package/app/components/AskModal.tsx +398 -0
- package/app/components/Backlinks.tsx +75 -0
- package/app/components/Breadcrumb.tsx +31 -0
- package/app/components/CsvView.tsx +325 -0
- package/app/components/DirView.tsx +138 -0
- package/app/components/Editor.tsx +124 -0
- package/app/components/EditorWrapper.tsx +17 -0
- package/app/components/ErrorBoundary.tsx +53 -0
- package/app/components/FileTree.tsx +369 -0
- package/app/components/HomeContent.tsx +262 -0
- package/app/components/JsonView.tsx +27 -0
- package/app/components/MarkdownEditor.tsx +95 -0
- package/app/components/MarkdownView.tsx +118 -0
- package/app/components/SearchModal.tsx +193 -0
- package/app/components/SettingsModal.tsx +237 -0
- package/app/components/Sidebar.tsx +136 -0
- package/app/components/SidebarLayout.tsx +36 -0
- package/app/components/TableOfContents.tsx +150 -0
- package/app/components/ThemeToggle.tsx +34 -0
- package/app/components/WysiwygEditor.tsx +75 -0
- package/app/components/ask/FileChip.tsx +30 -0
- package/app/components/ask/MentionPopover.tsx +52 -0
- package/app/components/ask/MessageList.tsx +126 -0
- package/app/components/ask/SessionHistory.tsx +49 -0
- package/app/components/renderers/AgentInspectorRenderer.tsx +277 -0
- package/app/components/renderers/BacklinksRenderer.tsx +147 -0
- package/app/components/renderers/ConfigRenderer.tsx +236 -0
- package/app/components/renderers/CsvRenderer.tsx +77 -0
- package/app/components/renderers/DiffRenderer.tsx +310 -0
- package/app/components/renderers/GraphRenderer.tsx +428 -0
- package/app/components/renderers/SummaryRenderer.tsx +251 -0
- package/app/components/renderers/TimelineRenderer.tsx +213 -0
- package/app/components/renderers/TodoRenderer.tsx +474 -0
- package/app/components/renderers/WorkflowRenderer.tsx +404 -0
- package/app/components/renderers/csv/BoardView.tsx +146 -0
- package/app/components/renderers/csv/ConfigPanel.tsx +117 -0
- package/app/components/renderers/csv/EditableCell.tsx +43 -0
- package/app/components/renderers/csv/GalleryView.tsx +40 -0
- package/app/components/renderers/csv/TableView.tsx +164 -0
- package/app/components/renderers/csv/types.ts +87 -0
- package/app/components/settings/AiTab.tsx +111 -0
- package/app/components/settings/AppearanceTab.tsx +101 -0
- package/app/components/settings/KnowledgeTab.tsx +157 -0
- package/app/components/settings/PluginsTab.tsx +82 -0
- package/app/components/settings/Primitives.tsx +60 -0
- package/app/components/settings/ShortcutsTab.tsx +22 -0
- package/app/components/settings/types.ts +41 -0
- package/app/components/ui/button.tsx +60 -0
- package/app/components/ui/dialog.tsx +157 -0
- package/app/components/ui/input.tsx +20 -0
- package/app/components/ui/scroll-area.tsx +55 -0
- package/app/components/ui/toggle.tsx +44 -0
- package/app/components/ui/tooltip.tsx +66 -0
- package/app/components.json +25 -0
- package/app/data/pages/home-dark.png +0 -0
- package/app/data/pages/home-mobile-crop.png +0 -0
- package/app/data/pages/home-mobile.png +0 -0
- package/app/data/pages/home.png +0 -0
- package/app/data/pages/view-dir.png +0 -0
- package/app/data/pages/view-file-bot.png +0 -0
- package/app/data/pages/view-file-dark-crop.png +0 -0
- package/app/data/pages/view-file-dark.png +0 -0
- package/app/data/pages/view-file-mobile.png +0 -0
- package/app/data/pages/view-file-sm.png +0 -0
- package/app/data/pages/view-file-top.png +0 -0
- package/app/data/pages/view-file.png +0 -0
- package/app/eslint.config.mjs +18 -0
- package/app/hooks/useAskSession.ts +181 -0
- package/app/hooks/useFileUpload.ts +126 -0
- package/app/hooks/useMention.ts +65 -0
- package/app/lib/LocaleContext.tsx +40 -0
- package/app/lib/actions.ts +40 -0
- package/app/lib/agent/index.ts +3 -0
- package/app/lib/agent/model.ts +18 -0
- package/app/lib/agent/prompt.ts +32 -0
- package/app/lib/agent/tools.ts +151 -0
- package/app/lib/api.ts +55 -0
- package/app/lib/core/backlinks.ts +40 -0
- package/app/lib/core/csv.ts +28 -0
- package/app/lib/core/fs-ops.ts +118 -0
- package/app/lib/core/git.ts +50 -0
- package/app/lib/core/index.ts +58 -0
- package/app/lib/core/lines.ts +89 -0
- package/app/lib/core/search.ts +79 -0
- package/app/lib/core/security.ts +43 -0
- package/app/lib/core/tree.ts +113 -0
- package/app/lib/core/types.ts +40 -0
- package/app/lib/fs.ts +467 -0
- package/app/lib/i18n.ts +300 -0
- package/app/lib/jwt.ts +58 -0
- package/app/lib/renderers/index.ts +79 -0
- package/app/lib/renderers/registry.ts +70 -0
- package/app/lib/settings.ts +150 -0
- package/app/lib/types.ts +32 -0
- package/app/lib/utils.ts +34 -0
- package/app/next-env.d.ts +6 -0
- package/app/next.config.ts +10 -0
- package/app/package-lock.json +15306 -0
- package/app/package.json +71 -0
- package/app/postcss.config.mjs +7 -0
- package/app/proxy.ts +64 -0
- package/app/public/file.svg +1 -0
- package/app/public/globe.svg +1 -0
- package/app/public/landing/index.html +353 -0
- package/app/public/landing/style.css +216 -0
- package/app/public/logo-square.svg +37 -0
- package/app/public/logo.svg +37 -0
- package/app/public/next.svg +1 -0
- package/app/public/vercel.svg +1 -0
- package/app/public/window.svg +1 -0
- package/app/scripts/extract-pdf.cjs +56 -0
- package/app/tsconfig.json +34 -0
- package/app/vitest.config.ts +14 -0
- package/assets/demo-flow-zh.html +622 -0
- package/assets/images/demo-flow-dark.png +0 -0
- package/assets/images/demo-flow-light.png +0 -0
- package/assets/images/demo-flow-zh-dark.png +0 -0
- package/assets/images/demo-flow-zh-light.png +0 -0
- package/assets/images/gui-sync-cv.png +0 -0
- package/assets/logo-square.svg +37 -0
- package/bin/cli.js +894 -0
- package/mcp/README.md +113 -0
- package/mcp/package-lock.json +1717 -0
- package/mcp/package.json +18 -0
- package/mcp/src/index.ts +494 -0
- package/mcp/tsconfig.json +13 -0
- package/package.json +49 -0
- package/scripts/setup.js +675 -0
- package/scripts/upgrade-prompt.md +147 -0
- package/skills/mindos/SKILL.md +319 -0
- package/skills/mindos-zh/SKILL.md +318 -0
- package/templates/README.md +31 -0
- package/templates/empty/CHANGELOG.md +9 -0
- package/templates/empty/CONFIG.json +197 -0
- package/templates/empty/CONFIG.md +73 -0
- package/templates/empty/INSTRUCTION.md +177 -0
- package/templates/empty/README.md +27 -0
- package/templates/en/CHANGELOG.md +9 -0
- package/templates/en/CONFIG.json +197 -0
- package/templates/en/CONFIG.md +73 -0
- package/templates/en/INSTRUCTION.md +177 -0
- package/templates/en/README.md +27 -0
- package/templates/en/TODO.md +13 -0
- package/templates/en//360/237/221/244 Profile/INSTRUCTION.md" +21 -0
- package/templates/en//360/237/221/244 Profile/README.md" +15 -0
- package/templates/en//360/237/221/244 Profile//342/232/231/357/270/217 Preferences.md" +21 -0
- package/templates/en//360/237/221/244 Profile//360/237/216/257 Focus.md" +31 -0
- package/templates/en//360/237/221/244 Profile//360/237/221/244 Identity.md" +22 -0
- package/templates/en//360/237/223/232 Resources/INSTRUCTION.md" +29 -0
- package/templates/en//360/237/223/232 Resources/README.md" +21 -0
- package/templates/en//360/237/223/232 Resources//360/237/247/276 AI Influencers.csv" +1 -0
- package/templates/en//360/237/223/232 Resources//360/237/247/276 AI Products.csv" +1 -0
- package/templates/en//360/237/223/232 Resources//360/237/247/276 AI Scholars.csv" +1 -0
- package/templates/en//360/237/223/232 Resources//360/237/247/276 AI Tools.csv" +1 -0
- package/templates/en//360/237/223/235 Notes/INSTRUCTION.md" +31 -0
- package/templates/en//360/237/223/235 Notes/Ideas/README.md" +8 -0
- package/templates/en//360/237/223/235 Notes/Ideas//360/237/247/252_example_product_idea.md" +16 -0
- package/templates/en//360/237/223/235 Notes/Inbox/README.md" +8 -0
- package/templates/en//360/237/223/235 Notes/Inbox//360/237/247/252_example_quick_capture.md" +14 -0
- package/templates/en//360/237/223/235 Notes/Meetings/README.md" +8 -0
- package/templates/en//360/237/223/235 Notes/Meetings//360/237/247/252_example_meeting_note.md" +17 -0
- package/templates/en//360/237/223/235 Notes/README.md" +24 -0
- package/templates/en//360/237/223/235 Notes/Waiting/README.md" +8 -0
- package/templates/en//360/237/223/235 Notes/Waiting//360/237/247/252_example_blocked_item.md" +16 -0
- package/templates/en//360/237/224/204 Workflows/Configurations/README.md" +3 -0
- package/templates/en//360/237/224/204 Workflows/Configurations//360/237/247/252_example_config_update_sop.md" +14 -0
- package/templates/en//360/237/224/204 Workflows/INSTRUCTION.md" +21 -0
- package/templates/en//360/237/224/204 Workflows/Information/README.md" +16 -0
- package/templates/en//360/237/224/204 Workflows/Information//360/237/247/252_example_info_capture_sop.md" +13 -0
- package/templates/en//360/237/224/204 Workflows/Media/README.md" +16 -0
- package/templates/en//360/237/224/204 Workflows/Media//360/237/247/252_example_content_publish_sop.md" +13 -0
- package/templates/en//360/237/224/204 Workflows/README.md" +22 -0
- package/templates/en//360/237/224/204 Workflows/Research/README.md" +16 -0
- package/templates/en//360/237/224/204 Workflows/Research//360/237/247/252_example_lit_review_sop.md" +16 -0
- package/templates/en//360/237/224/204 Workflows/Startup/README.md" +3 -0
- package/templates/en//360/237/224/204 Workflows/Startup//360/237/247/252_example_weekly_founder_ops.md" +22 -0
- package/templates/en//360/237/224/227 Connections/Classmates/README.md" +11 -0
- package/templates/en//360/237/224/227 Connections/Classmates//360/237/247/252_example_leo_chen.md" +16 -0
- package/templates/en//360/237/224/227 Connections/Colleagues/README.md" +11 -0
- package/templates/en//360/237/224/227 Connections/Colleagues//360/237/247/252_example_ethan_zhao.md" +16 -0
- package/templates/en//360/237/224/227 Connections/Connections Overview.csv" +5 -0
- package/templates/en//360/237/224/227 Connections/Family/README.md" +11 -0
- package/templates/en//360/237/224/227 Connections/Family//360/237/247/252_example_james_wang.md" +16 -0
- package/templates/en//360/237/224/227 Connections/Friends/README.md" +11 -0
- package/templates/en//360/237/224/227 Connections/Friends//360/237/247/252_example_lily_lin.md" +16 -0
- package/templates/en//360/237/224/227 Connections/INSTRUCTION.md" +56 -0
- package/templates/en//360/237/224/227 Connections/README.md" +20 -0
- package/templates/en//360/237/232/200 Projects/Archived/README.md" +9 -0
- package/templates/en//360/237/232/200 Projects/Archived//360/237/247/252_example_archived_project_note.md" +14 -0
- package/templates/en//360/237/232/200 Projects/INSTRUCTION.md" +29 -0
- package/templates/en//360/237/232/200 Projects/Products/README.md" +16 -0
- package/templates/en//360/237/232/200 Projects/Products//360/237/247/252_example_product_project_brief.md" +20 -0
- package/templates/en//360/237/232/200 Projects/README.md" +21 -0
- package/templates/en//360/237/232/200 Projects/Research/README.md" +16 -0
- package/templates/en//360/237/232/200 Projects/Research//360/237/247/252_example_research_project_brief.md" +16 -0
- package/templates/template-generation-skill.md +79 -0
- package/templates/zh/CHANGELOG.md +9 -0
- package/templates/zh/CONFIG.json +197 -0
- package/templates/zh/CONFIG.md +66 -0
- package/templates/zh/INSTRUCTION.md +177 -0
- package/templates/zh/README.md +27 -0
- package/templates/zh/TODO.md +13 -0
- package/templates/zh//360/237/221/244 /347/224/273/345/203/217/INSTRUCTION.md" +28 -0
- package/templates/zh//360/237/221/244 /347/224/273/345/203/217/README.md" +20 -0
- package/templates/zh//360/237/221/244 /347/224/273/345/203/217//342/232/231/357/270/217 Preferences.md" +21 -0
- package/templates/zh//360/237/221/244 /347/224/273/345/203/217//360/237/216/257 Focus.md" +31 -0
- package/templates/zh//360/237/221/244 /347/224/273/345/203/217//360/237/221/244 Identity.md" +22 -0
- package/templates/zh//360/237/223/232 /350/265/204/346/272/220/INSTRUCTION.md" +29 -0
- package/templates/zh//360/237/223/232 /350/265/204/346/272/220/README.md" +21 -0
- package/templates/zh//360/237/223/232 /350/265/204/346/272/220//360/237/247/276 AI Inferencers.csv" +1 -0
- package/templates/zh//360/237/223/232 /350/265/204/346/272/220//360/237/247/276 AI /344/272/247/345/223/201.csv" +1 -0
- package/templates/zh//360/237/223/232 /350/265/204/346/272/220//360/237/247/276 AI /345/255/246/350/200/205/346/270/205/345/215/225.csv" +1 -0
- package/templates/zh//360/237/223/232 /350/265/204/346/272/220//360/237/247/276 AI /345/267/245/345/205/267/346/270/205/345/215/225.csv" +1 -0
- package/templates/zh//360/237/223/235 /347/254/224/350/256/260/INSTRUCTION.md" +31 -0
- package/templates/zh//360/237/223/235 /347/254/224/350/256/260/README.md" +24 -0
- package/templates/zh//360/237/223/235 /347/254/224/350/256/260//344/274/232/350/256/256/README.md" +8 -0
- package/templates/zh//360/237/223/235 /347/254/224/350/256/260//344/274/232/350/256/256//360/237/247/252_example_/344/274/232/350/256/256/347/272/252/350/246/201.md" +17 -0
- package/templates/zh//360/237/223/235 /347/254/224/350/256/260//345/276/205/345/217/215/351/246/210/README.md" +8 -0
- package/templates/zh//360/237/223/235 /347/254/224/350/256/260//345/276/205/345/217/215/351/246/210//360/237/247/252_example_/345/276/205/345/217/215/351/246/210/344/272/213/351/241/271.md" +16 -0
- package/templates/zh//360/237/223/235 /347/254/224/350/256/260//346/203/263/346/263/225/README.md" +8 -0
- package/templates/zh//360/237/223/235 /347/254/224/350/256/260//346/203/263/346/263/225//360/237/247/252_example_/344/272/247/345/223/201/346/203/263/346/263/225.md" +16 -0
- package/templates/zh//360/237/223/235 /347/254/224/350/256/260//346/224/266/344/273/266/347/256/261/README.md" +8 -0
- package/templates/zh//360/237/223/235 /347/254/224/350/256/260//346/224/266/344/273/266/347/256/261//360/237/247/252_example_/344/270/264/346/227/266/351/200/237/350/256/260.md" +13 -0
- package/templates/zh//360/237/224/204 /346/265/201/347/250/213/INSTRUCTION.md" +29 -0
- package/templates/zh//360/237/224/204 /346/265/201/347/250/213/README.md" +21 -0
- package/templates/zh//360/237/224/204 /346/265/201/347/250/213//344/277/241/346/201/257/README.md" +16 -0
- package/templates/zh//360/237/224/204 /346/265/201/347/250/213//344/277/241/346/201/257//360/237/247/252_example_/344/277/241/346/201/257/351/207/207/351/233/206/346/265/201/347/250/213.md" +13 -0
- package/templates/zh//360/237/224/204 /346/265/201/347/250/213//345/252/222/344/275/223/README.md" +16 -0
- package/templates/zh//360/237/224/204 /346/265/201/347/250/213//345/252/222/344/275/223//360/237/247/252_example_/345/206/205/345/256/271/345/217/221/345/270/203/346/265/201/347/250/213.md" +13 -0
- package/templates/zh//360/237/224/204 /346/265/201/347/250/213//347/247/221/347/240/224/README.md" +16 -0
- package/templates/zh//360/237/224/204 /346/265/201/347/250/213//347/247/221/347/240/224//360/237/247/252_example_/346/226/207/347/214/256/347/273/274/350/277/260/346/265/201/347/250/213.md" +16 -0
- package/templates/zh//360/237/224/204 /346/265/201/347/250/213//351/205/215/347/275/256/README.md" +3 -0
- package/templates/zh//360/237/224/204 /346/265/201/347/250/213//351/205/215/347/275/256//360/237/247/252_example_/351/205/215/347/275/256/346/233/264/346/226/260/346/265/201/347/250/213.md" +26 -0
- package/templates/zh//360/237/224/227 /345/205/263/347/263/273/INSTRUCTION.md" +62 -0
- package/templates/zh//360/237/224/227 /345/205/263/347/263/273/README.md" +20 -0
- package/templates/zh//360/237/224/227 /345/205/263/347/263/273//345/205/263/347/263/273/346/200/273/350/247/210.csv" +5 -0
- package/templates/zh//360/237/224/227 /345/205/263/347/263/273//345/220/214/344/272/213/README.md" +11 -0
- package/templates/zh//360/237/224/227 /345/205/263/347/263/273//345/220/214/344/272/213//360/237/247/252_example_/345/220/214/344/272/213/350/265/265/344/270/200/350/276/260.md" +16 -0
- package/templates/zh//360/237/224/227 /345/205/263/347/263/273//345/220/214/345/255/246/README.md" +11 -0
- package/templates/zh//360/237/224/227 /345/205/263/347/263/273//345/220/214/345/255/246//360/237/247/252_example_/345/220/214/345/255/246/351/231/210/347/253/213/346/254/247.md" +16 -0
- package/templates/zh//360/237/224/227 /345/205/263/347/263/273//345/256/266/344/272/272/README.md" +11 -0
- package/templates/zh//360/237/224/227 /345/205/263/347/263/273//345/256/266/344/272/272//360/237/247/252_example_/345/256/266/344/272/272/347/216/213/345/273/272/345/233/275.md" +16 -0
- package/templates/zh//360/237/224/227 /345/205/263/347/263/273//346/234/213/345/217/213/README.md" +11 -0
- package/templates/zh//360/237/224/227 /345/205/263/347/263/273//346/234/213/345/217/213//360/237/247/252_example_/346/234/213/345/217/213/346/236/227/345/260/217/344/270/275.md" +16 -0
- package/templates/zh//360/237/232/200 /351/241/271/347/233/256/INSTRUCTION.md" +31 -0
- package/templates/zh//360/237/232/200 /351/241/271/347/233/256/README.md" +21 -0
- package/templates/zh//360/237/232/200 /351/241/271/347/233/256//344/272/247/345/223/201/README.md" +16 -0
- package/templates/zh//360/237/232/200 /351/241/271/347/233/256//344/272/247/345/223/201//360/237/247/252_example_/344/272/247/345/223/201/351/241/271/347/233/256/347/256/200/346/212/245.md" +20 -0
- package/templates/zh//360/237/232/200 /351/241/271/347/233/256//345/267/262/345/275/222/346/241/243/README.md" +9 -0
- package/templates/zh//360/237/232/200 /351/241/271/347/233/256//345/267/262/345/275/222/346/241/243//360/237/247/252_example_/345/275/222/346/241/243/351/241/271/347/233/256/350/256/260/345/275/225.md" +15 -0
- package/templates/zh//360/237/232/200 /351/241/271/347/233/256//347/247/221/347/240/224/README.md" +16 -0
- package/templates/zh//360/237/232/200 /351/241/271/347/233/256//347/247/221/347/240/224//360/237/247/252_example_/347/247/221/347/240/224/351/241/271/347/233/256/347/256/200/346/212/245.md" +16 -0
package/app/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "wiki-app",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "next dev -p ${MINDOS_WEB_PORT:-3000}",
|
|
7
|
+
"build": "next build",
|
|
8
|
+
"start": "next start -p ${MINDOS_WEB_PORT:-3000}",
|
|
9
|
+
"lint": "eslint",
|
|
10
|
+
"test": "vitest run"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@ai-sdk/anthropic": "^3.0.58",
|
|
14
|
+
"@ai-sdk/openai": "^3.0.41",
|
|
15
|
+
"@ai-sdk/react": "^3.0.118",
|
|
16
|
+
"@base-ui/react": "^1.2.0",
|
|
17
|
+
"@codemirror/lang-markdown": "^6.5.0",
|
|
18
|
+
"@codemirror/state": "^6.5.4",
|
|
19
|
+
"@codemirror/theme-one-dark": "^6.1.3",
|
|
20
|
+
"@codemirror/view": "^6.39.16",
|
|
21
|
+
"@tiptap/extension-image": "^3.20.1",
|
|
22
|
+
"@tiptap/extension-link": "^3.20.1",
|
|
23
|
+
"@tiptap/extension-placeholder": "^3.20.1",
|
|
24
|
+
"@tiptap/extension-table": "^3.20.1",
|
|
25
|
+
"@tiptap/extension-table-cell": "^3.20.1",
|
|
26
|
+
"@tiptap/extension-table-header": "^3.20.1",
|
|
27
|
+
"@tiptap/extension-table-row": "^3.20.1",
|
|
28
|
+
"@tiptap/extension-task-item": "^3.20.1",
|
|
29
|
+
"@tiptap/extension-task-list": "^3.20.1",
|
|
30
|
+
"@tiptap/react": "^3.20.1",
|
|
31
|
+
"@tiptap/starter-kit": "^3.20.1",
|
|
32
|
+
"@xyflow/react": "^12.10.1",
|
|
33
|
+
"ai": "^6.0.116",
|
|
34
|
+
"class-variance-authority": "^0.7.1",
|
|
35
|
+
"clsx": "^2.1.1",
|
|
36
|
+
"codemirror": "^6.0.2",
|
|
37
|
+
"fuse.js": "^7.1.0",
|
|
38
|
+
"github-slugger": "^2.0.0",
|
|
39
|
+
"lucide-react": "^0.577.0",
|
|
40
|
+
"next": "16.1.6",
|
|
41
|
+
"papaparse": "^5.5.3",
|
|
42
|
+
"pdf-parse": "^2.4.5",
|
|
43
|
+
"pdfjs-dist": "^4.10.38",
|
|
44
|
+
"react": "19.2.3",
|
|
45
|
+
"react-dom": "19.2.3",
|
|
46
|
+
"react-markdown": "^10.1.0",
|
|
47
|
+
"rehype-highlight": "^7.0.2",
|
|
48
|
+
"rehype-raw": "^7.0.0",
|
|
49
|
+
"rehype-slug": "^6.0.0",
|
|
50
|
+
"remark-gfm": "^4.0.1",
|
|
51
|
+
"tailwind-merge": "^3.5.0",
|
|
52
|
+
"tiptap-markdown": "^0.9.0",
|
|
53
|
+
"tw-animate-css": "^1.4.0",
|
|
54
|
+
"zod": "^3.23.8"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@tailwindcss/postcss": "^4",
|
|
58
|
+
"@types/node": "^20",
|
|
59
|
+
"@types/papaparse": "^5.5.2",
|
|
60
|
+
"@types/react": "^19",
|
|
61
|
+
"@types/react-dom": "^19",
|
|
62
|
+
"eslint": "^9",
|
|
63
|
+
"eslint-config-next": "16.1.6",
|
|
64
|
+
"playwright": "^1.58.2",
|
|
65
|
+
"shadcn": "^4.0.1",
|
|
66
|
+
"tailwindcss": "^4",
|
|
67
|
+
"typescript": "^5",
|
|
68
|
+
"vitest": "^4.0.18",
|
|
69
|
+
"wait-on": "^8.0.1"
|
|
70
|
+
}
|
|
71
|
+
}
|
package/app/proxy.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
import { verifyJwt } from '@/lib/jwt';
|
|
3
|
+
|
|
4
|
+
const COOKIE_NAME = 'mindos-session';
|
|
5
|
+
|
|
6
|
+
export async function proxy(req: NextRequest) {
|
|
7
|
+
const authToken = process.env.AUTH_TOKEN; // API bearer token (for Agents / MCP)
|
|
8
|
+
const webPassword = process.env.WEB_PASSWORD; // Web UI login password (for browser users)
|
|
9
|
+
const pathname = req.nextUrl.pathname;
|
|
10
|
+
|
|
11
|
+
function next(): NextResponse {
|
|
12
|
+
const newHeaders = new Headers(req.headers);
|
|
13
|
+
newHeaders.set('x-pathname', pathname);
|
|
14
|
+
return NextResponse.next({ request: { headers: newHeaders } });
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// --- API protection (AUTH_TOKEN) ---
|
|
18
|
+
if (pathname.startsWith('/api/')) {
|
|
19
|
+
// /api/auth handles its own password validation — never block it
|
|
20
|
+
if (pathname === '/api/auth') return NextResponse.next();
|
|
21
|
+
|
|
22
|
+
if (!authToken) return NextResponse.next();
|
|
23
|
+
|
|
24
|
+
// Exempt same-origin browser requests (the app's own frontend).
|
|
25
|
+
// Sec-Fetch-Site is set by browsers automatically and cannot be spoofed by JS.
|
|
26
|
+
if (req.headers.get('sec-fetch-site') === 'same-origin') return NextResponse.next();
|
|
27
|
+
|
|
28
|
+
// Exempt authenticated web UI sessions (valid JWT cookie = logged-in browser user)
|
|
29
|
+
if (webPassword) {
|
|
30
|
+
const token = req.cookies.get(COOKIE_NAME)?.value ?? '';
|
|
31
|
+
if (token && await verifyJwt(token, webPassword)) return NextResponse.next();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// External / cross-origin requests must provide a bearer token
|
|
35
|
+
const header = req.headers.get('authorization') ?? '';
|
|
36
|
+
const bearer = header.startsWith('Bearer ') ? header.slice(7) : '';
|
|
37
|
+
if (bearer !== authToken) {
|
|
38
|
+
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
|
|
39
|
+
}
|
|
40
|
+
return NextResponse.next();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// --- Web UI protection (WEB_PASSWORD) ---
|
|
44
|
+
if (!webPassword) return next();
|
|
45
|
+
|
|
46
|
+
// Login page itself always passes through
|
|
47
|
+
if (pathname === '/login') return next();
|
|
48
|
+
|
|
49
|
+
// Verify JWT session cookie
|
|
50
|
+
const token = req.cookies.get(COOKIE_NAME)?.value ?? '';
|
|
51
|
+
if (token && await verifyJwt(token, webPassword)) return next();
|
|
52
|
+
|
|
53
|
+
// Not authenticated: redirect to /login
|
|
54
|
+
const loginUrl = new URL('/login', req.url);
|
|
55
|
+
if (pathname !== '/') loginUrl.searchParams.set('redirect', pathname);
|
|
56
|
+
return NextResponse.redirect(loginUrl);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export const config = {
|
|
60
|
+
matcher: [
|
|
61
|
+
'/api/:path*',
|
|
62
|
+
'/((?!_next/static|_next/image|favicon\\.ico).*)',
|
|
63
|
+
],
|
|
64
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>MindOS — Human-AI Collaborative Mind Platform</title>
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
9
|
+
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600&family=Lora:ital,wght@0,400;0,500;1,400&display=swap" rel="stylesheet">
|
|
10
|
+
<link rel="stylesheet" href="style.css">
|
|
11
|
+
</head>
|
|
12
|
+
<body>
|
|
13
|
+
<div class="grain"></div>
|
|
14
|
+
<div class="ambient-glow"></div>
|
|
15
|
+
|
|
16
|
+
<nav class="nav-container fade-in">
|
|
17
|
+
<div class="nav-content">
|
|
18
|
+
<a href="#" class="logo-group">
|
|
19
|
+
<svg class="logo-svg" viewBox="0 0 80 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
20
|
+
<defs>
|
|
21
|
+
<linearGradient id="grad-human" x1="35" y1="20" x2="5" y2="20" gradientUnits="userSpaceOnUse">
|
|
22
|
+
<stop offset="0%" stop-color="currentColor" stop-opacity="0.8"/>
|
|
23
|
+
<stop offset="100%" stop-color="currentColor" stop-opacity="0.3"/>
|
|
24
|
+
</linearGradient>
|
|
25
|
+
<linearGradient id="grad-agent" x1="35" y1="20" x2="75" y2="20" gradientUnits="userSpaceOnUse">
|
|
26
|
+
<stop offset="0%" stop-color="currentColor" stop-opacity="0.8"/>
|
|
27
|
+
<stop offset="100%" stop-color="currentColor" stop-opacity="1"/>
|
|
28
|
+
</linearGradient>
|
|
29
|
+
</defs>
|
|
30
|
+
<path d="M35,20 C25,35 8,35 8,20 C8,5 25,5 35,20" stroke="url(#grad-human)" stroke-width="3" stroke-dasharray="2 4" stroke-linecap="round"/>
|
|
31
|
+
<path d="M35,20 C45,2 75,2 75,20 C75,38 45,38 35,20" stroke="url(#grad-agent)" stroke-width="4.5" stroke-linecap="round"/>
|
|
32
|
+
<path class="spark" d="M35,17.5 Q35,20 37.5,20 Q35,20 35,23.5 Q35,20 32.5,20 Q35,20 35,17.5 Z" fill="var(--spark-color)"/>
|
|
33
|
+
</svg>
|
|
34
|
+
<span class="logo-text">MindOS</span>
|
|
35
|
+
</a>
|
|
36
|
+
|
|
37
|
+
<div class="nav-right">
|
|
38
|
+
<div class="nav-links">
|
|
39
|
+
<a href="#vision"><span data-zh>愿景</span><span data-en>Vision</span></a>
|
|
40
|
+
<a href="#workflow"><span data-zh>演示</span><span data-en>Workflow</span></a>
|
|
41
|
+
<a href="#features"><span data-zh>特性</span><span data-en>Features</span></a>
|
|
42
|
+
<a href="#quickstart"><span data-zh>开始</span><span data-en>Start</span></a>
|
|
43
|
+
</div>
|
|
44
|
+
<div class="controls">
|
|
45
|
+
<button id="theme-toggle" class="control-btn" title="Toggle Theme">◐</button>
|
|
46
|
+
<button id="lang-toggle" class="control-btn">
|
|
47
|
+
<span data-zh>EN</span><span data-en>中文</span>
|
|
48
|
+
</button>
|
|
49
|
+
<a href="https://github.com/geminilight/mind-os" class="btn-primary">GitHub</a>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
</nav>
|
|
54
|
+
|
|
55
|
+
<!-- HERO -->
|
|
56
|
+
<header class="hero section">
|
|
57
|
+
<div class="container hero-content">
|
|
58
|
+
<div class="tagline-badge animate-up">
|
|
59
|
+
<span data-zh>人机协同心智平台</span><span data-en>Human-AI Collaborative Mind Platform</span>
|
|
60
|
+
</div>
|
|
61
|
+
<h1 class="animate-up" style="animation-delay: 0.1s;">
|
|
62
|
+
<span data-zh>人类在此思考,</span><span data-en>Human Thinks Here,</span><br>
|
|
63
|
+
<span class="accent-text" data-zh>Agent 依此行动。</span><span class="accent-text" data-en>Agent Acts There.</span>
|
|
64
|
+
</h1>
|
|
65
|
+
<p class="hero-sub animate-up" style="animation-delay: 0.2s;">
|
|
66
|
+
<span data-zh>为所有 Agents 全局同步你的心智:透明可控,共生演进。</span>
|
|
67
|
+
<span data-en>Globally sync your mind for all agents: transparent, controllable, and evolving symbiotically.</span>
|
|
68
|
+
</p>
|
|
69
|
+
<div class="hero-actions animate-up" style="animation-delay: 0.3s;">
|
|
70
|
+
<div class="cmd-box">
|
|
71
|
+
<span class="cmd-text">git clone https://github.com/geminilight/mind-os</span>
|
|
72
|
+
<button class="copy-btn" id="copy-btn">Copy</button>
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</header>
|
|
77
|
+
|
|
78
|
+
<!-- SECTION 1: THE SHARED MIND LOOP -->
|
|
79
|
+
<section id="workflow" class="loop-section dark-bg">
|
|
80
|
+
<svg class="loop-bg-svg" viewBox="0 0 1000 500">
|
|
81
|
+
<path class="loop-path-bg" d="M500,250 C500,50 150,50 150,250 C150,450 500,450 500,250 C500,50 850,50 850,250 C850,450 500,450 500,250" />
|
|
82
|
+
<path class="loop-path-flow" d="M500,250 C500,50 150,50 150,250 C150,450 500,450 500,250 C500,50 850,50 850,250 C850,450 500,450 500,250" />
|
|
83
|
+
</svg>
|
|
84
|
+
<div class="flying-spark" id="spark-pulse"></div>
|
|
85
|
+
|
|
86
|
+
<div class="container">
|
|
87
|
+
<div class="section-header">
|
|
88
|
+
<span class="mono">01. THE SHARED MIND LOOP</span>
|
|
89
|
+
<h2 data-zh>交互式心智循环</h2><h2 data-en>Interactive Mind Loop</h2>
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<div class="vis-area">
|
|
93
|
+
<div class="loop-grid">
|
|
94
|
+
<div class="panel gui-panel animate-up" id="gui-panel">
|
|
95
|
+
<div class="panel-header">
|
|
96
|
+
<span class="panel-title">MindOS GUI</span>
|
|
97
|
+
<div style="display:flex; gap:4px;"><div class="mac-btn mac-close"></div><div class="mac-btn mac-min"></div><div class="mac-btn mac-max"></div></div>
|
|
98
|
+
</div>
|
|
99
|
+
<div class="gui-content">
|
|
100
|
+
<nav class="gui-nav">
|
|
101
|
+
<svg class="active" viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
|
102
|
+
<svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"><path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 1 1-7.6-13.5 8.38 8.38 0 0 1 3.8.9L21 11.5z"/></svg>
|
|
103
|
+
</nav>
|
|
104
|
+
<div class="gui-main">
|
|
105
|
+
<div class="gui-toolbar">
|
|
106
|
+
<div class="gui-breadcrumb">/mind/<span>Research.md</span></div>
|
|
107
|
+
<div class="gui-search"><span data-zh>搜索...</span><span data-en>Search...</span></div>
|
|
108
|
+
</div>
|
|
109
|
+
<div class="gui-editor">
|
|
110
|
+
<div style="display:flex;">
|
|
111
|
+
<div class="gui-line-num">1<br>2<br>3</div>
|
|
112
|
+
<div id="typewriter-human"></div>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
|
|
119
|
+
<div class="panel console-panel animate-up" id="agent-panel" style="animation-delay: 0.2s;">
|
|
120
|
+
<div class="panel-header">
|
|
121
|
+
<span class="panel-title">Agent Console</span>
|
|
122
|
+
<div id="agent-status" style="font-size: 0.6rem; color: var(--muted-fg); display:flex; align-items:center; gap:6px;">
|
|
123
|
+
<span style="width:6px; height:6px; background:var(--muted-fg); border-radius:50%;"></span> STANDBY
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
<div class="console-body" id="agent-console"></div>
|
|
127
|
+
</div>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
</section>
|
|
132
|
+
|
|
133
|
+
<!-- SECTION 2: VISION -->
|
|
134
|
+
<section id="vision" class="section">
|
|
135
|
+
<div class="container">
|
|
136
|
+
<div class="section-header">
|
|
137
|
+
<span class="mono">02. THE VISION</span>
|
|
138
|
+
<h2 data-zh>为何需要 Shared Mind?</h2><h2 data-en>Why Shared Mind?</h2>
|
|
139
|
+
</div>
|
|
140
|
+
<div class="vision-grid">
|
|
141
|
+
<div class="v-card animate-up">
|
|
142
|
+
<div class="v-icon">👁️</div>
|
|
143
|
+
<h3 data-zh>透明上下文</h3><h3 data-en>Transparent Context</h3>
|
|
144
|
+
<p data-zh>Agent 的推理与沉淀直接写入本地 Markdown。人类可直观审查并修正“记忆”,彻底消除幻觉。</p>
|
|
145
|
+
<p data-en>Agent reflections and intermediate steps are written to local Markdown. Humans can intuitively review and correct AI "memory".</p>
|
|
146
|
+
</div>
|
|
147
|
+
<div class="v-card animate-up" style="animation-delay: 0.1s;">
|
|
148
|
+
<div class="v-icon">🔓</div>
|
|
149
|
+
<h3 data-zh>原生 Agent 访问</h3><h3 data-en>Native Agent Access</h3>
|
|
150
|
+
<p data-zh>无需复杂的 API 鉴权。内置 MCP Server 让 Agent 像原生应用一样读写你的 Profile 和经验。</p>
|
|
151
|
+
<p data-en>No complex cloud APIs. Built-in MCP Server lets Agents access your Profile and SOPs as if they were native apps.</p>
|
|
152
|
+
</div>
|
|
153
|
+
<div class="v-card animate-up" style="animation-delay: 0.2s;">
|
|
154
|
+
<div class="v-icon">⚡</div>
|
|
155
|
+
<h3 data-zh>解放文档管理</h3><h3 data-en>Liberating Doc Management</h3>
|
|
156
|
+
<p data-zh>通过文件引用自动化管理。知识库不再是静态记录,而是 Agent 随时调用的动态指令集。</p>
|
|
157
|
+
<p data-en>Automate management via prompt references. Your notes become executable instruction sets for Agents.</p>
|
|
158
|
+
</div>
|
|
159
|
+
<div class="v-card animate-up" style="animation-delay: 0.3s;">
|
|
160
|
+
<div class="v-icon">🛡️</div>
|
|
161
|
+
<h3 data-zh>极致本地掌控</h3><h3 data-en>Ultimate Local Control</h3>
|
|
162
|
+
<p data-zh>无数据库、无云同步。所有数据以纯文本运行在本地,确保绝对隐私与极速响应。</p>
|
|
163
|
+
<p data-en>Zero database, zero cloud sync. All data stays local as plain text, ensuring absolute privacy and speed.</p>
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
</div>
|
|
167
|
+
</section>
|
|
168
|
+
|
|
169
|
+
<!-- SECTION 3: MANIFESTO -->
|
|
170
|
+
<section class="section dark-bg">
|
|
171
|
+
<div class="container">
|
|
172
|
+
<div class="section-header" style="text-align:center;">
|
|
173
|
+
<span class="mono">03. MANIFESTO</span>
|
|
174
|
+
<h2 data-zh>数据主权与透明性</h2><h2 data-en>Data Sovereignty & Transparency</h2>
|
|
175
|
+
</div>
|
|
176
|
+
<div class="manifesto-wrapper animate-up">
|
|
177
|
+
<div class="m-side m-legacy">
|
|
178
|
+
<div class="m-title" style="color:var(--danger)">✕ <span data-zh="传统 AI 范式">Legacy AI Flow</span><span data-en="Legacy AI Flow">Legacy AI Flow</span></div>
|
|
179
|
+
<ul class="m-list">
|
|
180
|
+
<li class="m-item"><div><strong data-zh>封闭黑箱</strong><strong data-en>Black Box Memory</strong><span data-zh>Agent 记忆不可见</span><span data-en>Hidden agent memory</span></div></li>
|
|
181
|
+
<li class="m-item"><div><strong data-zh>数据孤岛</strong><strong data-en>Data Silos</strong><span data-zh>笔记难以被模型原生访问</span><span data-en>Notes hard to access for LLMs</span></div></li>
|
|
182
|
+
</ul>
|
|
183
|
+
</div>
|
|
184
|
+
<div class="m-side m-mindos">
|
|
185
|
+
<div class="m-title" style="color:var(--accent)">✓ <span data-zh="MindOS 范式">The MindOS Way</span><span data-en="The MindOS Way">The MindOS Way</span></div>
|
|
186
|
+
<ul class="m-list">
|
|
187
|
+
<li class="m-item"><div><strong data-zh>透明上下文</strong><strong data-en>Transparent Context</strong><span data-zh>推理过程直接本地存储</span><span data-en>Reasoning saved locally</span></div></li>
|
|
188
|
+
<li class="m-item"><div><strong data-zh>绝对掌控</strong><strong data-en>Absolute Control</strong><span data-zh>纯文本、零数据库、极速响应</span><span data-en>Plain text, zero DB, instant</span></div></li>
|
|
189
|
+
</ul>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
</div>
|
|
193
|
+
</section>
|
|
194
|
+
|
|
195
|
+
<!-- SECTION 4: FEATURES -->
|
|
196
|
+
<section id="features" class="section">
|
|
197
|
+
<div class="container">
|
|
198
|
+
<div class="section-header">
|
|
199
|
+
<span class="mono">04. FEATURES</span>
|
|
200
|
+
<h2 data-zh>核心功能特性</h2><h2 data-en>Core Features</h2>
|
|
201
|
+
</div>
|
|
202
|
+
<div class="vision-grid">
|
|
203
|
+
<div class="v-card animate-up">
|
|
204
|
+
<div class="v-icon">⌘/</div>
|
|
205
|
+
<h3 data-zh>AI 对话 & 管理</h3><h3 data-en>AI Ask & Management</h3>
|
|
206
|
+
<p data-zh>在上下文中与知识库对话。Agent 自动化管理文件,人机协同无缝沉淀。</p>
|
|
207
|
+
<p data-en>Chat with your mind in context. Agents manage files while you curate knowledge effortlessly.</p>
|
|
208
|
+
</div>
|
|
209
|
+
<div class="v-card animate-up" style="animation-delay: 0.1s;">
|
|
210
|
+
<div class="v-icon">🕸️</div>
|
|
211
|
+
<h3 data-zh>Wiki Graph 图谱</h3><h3 data-en>Wiki Graph</h3>
|
|
212
|
+
<p data-zh>动态解析引用关系,全景管理复杂的人机上下文语义网络。</p>
|
|
213
|
+
<p data-en>Visualize inter-file relationships. Manage complex Human-AI semantic networks.</p>
|
|
214
|
+
</div>
|
|
215
|
+
<div class="v-card animate-up" style="animation-delay: 0.2s;">
|
|
216
|
+
<div class="v-icon">🔗</div>
|
|
217
|
+
<h3 data-zh="关联视图 Backlinks</h3><h3 data-en>Backlinks View</h3>
|
|
218
|
+
<p data-zh>自动索引全库引用。每一篇笔记底部展示相关 Context,打通知识孤岛。</p>
|
|
219
|
+
<p data-en>Auto-indexed references. Every note shows its surrounding context snippets.</p>
|
|
220
|
+
</div>
|
|
221
|
+
<div class="v-card animate-up" style="animation-delay: 0.3s;">
|
|
222
|
+
<div class="v-icon">📊</div>
|
|
223
|
+
<h3 data-zh>MCP 标准化工具</h3><h3 data-en>MCP Toolset</h3>
|
|
224
|
+
<p data-zh>提供 15+ 种标准工具。让任意 Agent 获得读写本地工作流的专属技能。</p>
|
|
225
|
+
<p data-en>15+ specialized tools for Agents to read, write, and execute local workflows.</p>
|
|
226
|
+
</div>
|
|
227
|
+
</div>
|
|
228
|
+
</div>
|
|
229
|
+
</section>
|
|
230
|
+
|
|
231
|
+
<!-- SECTION 5: ECOSYSTEM -->
|
|
232
|
+
<section class="section dark-bg">
|
|
233
|
+
<div class="container ecosystem-section">
|
|
234
|
+
<div class="section-header">
|
|
235
|
+
<span class="mono">05. AGENT ECOSYSTEM</span>
|
|
236
|
+
<h2 data-zh>无缝链接 Agent 生态</h2><h2 data-en>Seamless Agent Integration</h2>
|
|
237
|
+
</div>
|
|
238
|
+
<div class="eco-grid animate-up">
|
|
239
|
+
<div class="eco-item">Claude Desktop</div>
|
|
240
|
+
<div class="eco-item">Claude Code</div>
|
|
241
|
+
<div class="eco-item">OpenClaw</div>
|
|
242
|
+
<div class="eco-item">CodeX</div>
|
|
243
|
+
<div class="eco-item">Gemini Agent</div>
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
</section>
|
|
247
|
+
|
|
248
|
+
<!-- SECTION 6: QUICKSTART -->
|
|
249
|
+
<section id="quickstart" class="section">
|
|
250
|
+
<div class="container">
|
|
251
|
+
<div class="section-header">
|
|
252
|
+
<span class="mono">06. QUICKSTART</span>
|
|
253
|
+
<h2 data-zh>即刻开启 Shared Mind</h2><h2 data-en>Start the Shared Mind</h2>
|
|
254
|
+
</div>
|
|
255
|
+
<div class="vision-grid">
|
|
256
|
+
<div class="v-card animate-up"><code style="color:var(--accent)">cp -r template/ my-mind/</code></div>
|
|
257
|
+
<div class="v-card animate-up" style="animation-delay: 0.1s;"><code style="color:var(--accent)">MIND_ROOT=/path/to/my-mind</code></div>
|
|
258
|
+
<div class="v-card animate-up" style="animation-delay: 0.2s;"><code style="color:var(--accent)">npm run dev</code></div>
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
</section>
|
|
262
|
+
|
|
263
|
+
<footer class="footer section" style="padding-top: 4rem; border-top: 1px solid var(--border);">
|
|
264
|
+
<div class="container">
|
|
265
|
+
<div style="display: flex; justify-content: space-between; align-items: center;">
|
|
266
|
+
<p style="font-weight: 500;"><span data-zh>MindOS · 人机协同心智平台</span><span data-en>MindOS · Human-AI Collaborative Mind Platform</span></p>
|
|
267
|
+
<a href="https://github.com/geminilight/mind-os" style="color: var(--muted-fg); text-decoration: none;">GitHub</a>
|
|
268
|
+
</div>
|
|
269
|
+
<p style="color: var(--muted-fg); font-size: 0.75rem; margin-top: 2rem; opacity: 0.5;">MIT © 2026 GeminiLight</p>
|
|
270
|
+
</div>
|
|
271
|
+
</footer>
|
|
272
|
+
|
|
273
|
+
<script>
|
|
274
|
+
// --- State ---
|
|
275
|
+
const state = {
|
|
276
|
+
theme: localStorage.getItem('mindos-theme') || 'dark',
|
|
277
|
+
lang: localStorage.getItem('mindos-lang') || 'zh',
|
|
278
|
+
loopStarted: false
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
const applyTheme = (t) => { document.body.classList.toggle('light', t === 'light'); localStorage.setItem('mindos-theme', t); };
|
|
282
|
+
const applyLang = (l) => { document.documentElement.lang = l; localStorage.setItem('mindos-lang', l); };
|
|
283
|
+
applyTheme(state.theme); applyLang(state.lang);
|
|
284
|
+
|
|
285
|
+
document.getElementById('theme-toggle').addEventListener('click', () => {
|
|
286
|
+
state.theme = state.theme === 'dark' ? 'light' : 'dark'; applyTheme(state.theme);
|
|
287
|
+
});
|
|
288
|
+
document.getElementById('lang-toggle').addEventListener('click', () => {
|
|
289
|
+
state.lang = state.lang === 'zh' ? 'en' : 'zh'; applyLang(state.lang);
|
|
290
|
+
// Reload page or re-run dynamic text if needed, but here typewriter respects state.lang
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
// --- Copy Logic ---
|
|
294
|
+
document.getElementById('copy-btn')?.addEventListener('click', (e) => {
|
|
295
|
+
navigator.clipboard.writeText('git clone https://github.com/geminilight/mind-os');
|
|
296
|
+
e.target.textContent = 'Copied!';
|
|
297
|
+
setTimeout(() => e.target.textContent = 'Copy', 2000);
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
// --- Narrative Loop ---
|
|
301
|
+
const runMindLoop = async () => {
|
|
302
|
+
if(state.loopStarted) return; state.loopStarted = true;
|
|
303
|
+
const humanEditor = document.getElementById('typewriter-human');
|
|
304
|
+
const spark = document.getElementById('spark-pulse');
|
|
305
|
+
|
|
306
|
+
const typingText = state.lang === 'zh'
|
|
307
|
+
? "Idea: 实现一个动态星芒脉冲效果。"
|
|
308
|
+
: "Idea: Build a dynamic spark pulse effect.";
|
|
309
|
+
|
|
310
|
+
for(let char of typingText) {
|
|
311
|
+
humanEditor.innerHTML += char;
|
|
312
|
+
await new Promise(r => setTimeout(r, 50));
|
|
313
|
+
}
|
|
314
|
+
humanEditor.innerHTML += '<span class="type-cursor"></span>';
|
|
315
|
+
|
|
316
|
+
await new Promise(r => setTimeout(r, 400));
|
|
317
|
+
spark.classList.add('animate');
|
|
318
|
+
|
|
319
|
+
setTimeout(async () => {
|
|
320
|
+
const status = document.getElementById('agent-status');
|
|
321
|
+
status.innerHTML = `<span style="width:6px; height:6px; background:var(--accent); border-radius:50%; box-shadow: 0 0 10px var(--accent);"></span> PROCESSING`;
|
|
322
|
+
status.style.color = "var(--accent)";
|
|
323
|
+
|
|
324
|
+
const consoleBody = document.getElementById('agent-console');
|
|
325
|
+
const logs = [
|
|
326
|
+
{ tag: 'MCP', msg: 'Context Bridge active.' },
|
|
327
|
+
{ tag: 'SYNC', msg: 'Synced: Research.md' },
|
|
328
|
+
{ tag: 'AI', msg: state.lang === 'zh' ? '意图识别:UI 反馈逻辑' : 'Intent: UI Feedback Logic' },
|
|
329
|
+
{ tag: 'EXEC', msg: 'Updated project wiki.', type: 'success' }
|
|
330
|
+
];
|
|
331
|
+
|
|
332
|
+
for(let log of logs) {
|
|
333
|
+
await new Promise(r => setTimeout(r, 600));
|
|
334
|
+
const div = document.createElement('div');
|
|
335
|
+
div.className = 'c-row visible';
|
|
336
|
+
div.innerHTML = `<span class="c-tag">${log.tag}</span><span class="${log.type === 'success' ? 'c-success' : ''}">${log.msg}</span>`;
|
|
337
|
+
consoleBody.appendChild(div);
|
|
338
|
+
}
|
|
339
|
+
}, 800);
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
const observer = new IntersectionObserver((entries) => {
|
|
343
|
+
entries.forEach(entry => {
|
|
344
|
+
if (entry.isIntersecting) {
|
|
345
|
+
entry.target.classList.add('active');
|
|
346
|
+
if(entry.target.id === 'workflow') { setTimeout(runMindLoop, 800); }
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
}, { threshold: 0.3 });
|
|
350
|
+
document.querySelectorAll('.animate-up, .loop-section').forEach(el => observer.observe(el));
|
|
351
|
+
</script>
|
|
352
|
+
</body>
|
|
353
|
+
</html>
|