@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.
Files changed (282) hide show
  1. package/.env.local.example +38 -0
  2. package/LICENSE +21 -0
  3. package/README.md +423 -0
  4. package/README_zh.md +423 -0
  5. package/app/README.md +152 -0
  6. package/app/app/api/ask/route.ts +170 -0
  7. package/app/app/api/ask-sessions/route.ts +90 -0
  8. package/app/app/api/auth/route.ts +37 -0
  9. package/app/app/api/backlinks/route.ts +22 -0
  10. package/app/app/api/bootstrap/route.ts +37 -0
  11. package/app/app/api/extract-pdf/route.ts +82 -0
  12. package/app/app/api/file/route.ts +138 -0
  13. package/app/app/api/files/route.ts +12 -0
  14. package/app/app/api/git/route.ts +42 -0
  15. package/app/app/api/graph/route.ts +113 -0
  16. package/app/app/api/recent-files/route.ts +10 -0
  17. package/app/app/api/search/route.ts +17 -0
  18. package/app/app/api/settings/reset-token/route.ts +21 -0
  19. package/app/app/api/settings/route.ts +123 -0
  20. package/app/app/error.tsx +33 -0
  21. package/app/app/globals.css +368 -0
  22. package/app/app/icon.svg +35 -0
  23. package/app/app/layout.tsx +103 -0
  24. package/app/app/login/page.tsx +120 -0
  25. package/app/app/page.tsx +12 -0
  26. package/app/app/view/[...path]/ViewPageClient.tsx +343 -0
  27. package/app/app/view/[...path]/error.tsx +33 -0
  28. package/app/app/view/[...path]/loading.tsx +15 -0
  29. package/app/app/view/[...path]/page.tsx +93 -0
  30. package/app/components/AskFab.tsx +59 -0
  31. package/app/components/AskModal.tsx +398 -0
  32. package/app/components/Backlinks.tsx +75 -0
  33. package/app/components/Breadcrumb.tsx +31 -0
  34. package/app/components/CsvView.tsx +325 -0
  35. package/app/components/DirView.tsx +138 -0
  36. package/app/components/Editor.tsx +124 -0
  37. package/app/components/EditorWrapper.tsx +17 -0
  38. package/app/components/ErrorBoundary.tsx +53 -0
  39. package/app/components/FileTree.tsx +369 -0
  40. package/app/components/HomeContent.tsx +262 -0
  41. package/app/components/JsonView.tsx +27 -0
  42. package/app/components/MarkdownEditor.tsx +95 -0
  43. package/app/components/MarkdownView.tsx +118 -0
  44. package/app/components/SearchModal.tsx +193 -0
  45. package/app/components/SettingsModal.tsx +237 -0
  46. package/app/components/Sidebar.tsx +136 -0
  47. package/app/components/SidebarLayout.tsx +36 -0
  48. package/app/components/TableOfContents.tsx +150 -0
  49. package/app/components/ThemeToggle.tsx +34 -0
  50. package/app/components/WysiwygEditor.tsx +75 -0
  51. package/app/components/ask/FileChip.tsx +30 -0
  52. package/app/components/ask/MentionPopover.tsx +52 -0
  53. package/app/components/ask/MessageList.tsx +126 -0
  54. package/app/components/ask/SessionHistory.tsx +49 -0
  55. package/app/components/renderers/AgentInspectorRenderer.tsx +277 -0
  56. package/app/components/renderers/BacklinksRenderer.tsx +147 -0
  57. package/app/components/renderers/ConfigRenderer.tsx +236 -0
  58. package/app/components/renderers/CsvRenderer.tsx +77 -0
  59. package/app/components/renderers/DiffRenderer.tsx +310 -0
  60. package/app/components/renderers/GraphRenderer.tsx +428 -0
  61. package/app/components/renderers/SummaryRenderer.tsx +251 -0
  62. package/app/components/renderers/TimelineRenderer.tsx +213 -0
  63. package/app/components/renderers/TodoRenderer.tsx +474 -0
  64. package/app/components/renderers/WorkflowRenderer.tsx +404 -0
  65. package/app/components/renderers/csv/BoardView.tsx +146 -0
  66. package/app/components/renderers/csv/ConfigPanel.tsx +117 -0
  67. package/app/components/renderers/csv/EditableCell.tsx +43 -0
  68. package/app/components/renderers/csv/GalleryView.tsx +40 -0
  69. package/app/components/renderers/csv/TableView.tsx +164 -0
  70. package/app/components/renderers/csv/types.ts +87 -0
  71. package/app/components/settings/AiTab.tsx +111 -0
  72. package/app/components/settings/AppearanceTab.tsx +101 -0
  73. package/app/components/settings/KnowledgeTab.tsx +157 -0
  74. package/app/components/settings/PluginsTab.tsx +82 -0
  75. package/app/components/settings/Primitives.tsx +60 -0
  76. package/app/components/settings/ShortcutsTab.tsx +22 -0
  77. package/app/components/settings/types.ts +41 -0
  78. package/app/components/ui/button.tsx +60 -0
  79. package/app/components/ui/dialog.tsx +157 -0
  80. package/app/components/ui/input.tsx +20 -0
  81. package/app/components/ui/scroll-area.tsx +55 -0
  82. package/app/components/ui/toggle.tsx +44 -0
  83. package/app/components/ui/tooltip.tsx +66 -0
  84. package/app/components.json +25 -0
  85. package/app/data/pages/home-dark.png +0 -0
  86. package/app/data/pages/home-mobile-crop.png +0 -0
  87. package/app/data/pages/home-mobile.png +0 -0
  88. package/app/data/pages/home.png +0 -0
  89. package/app/data/pages/view-dir.png +0 -0
  90. package/app/data/pages/view-file-bot.png +0 -0
  91. package/app/data/pages/view-file-dark-crop.png +0 -0
  92. package/app/data/pages/view-file-dark.png +0 -0
  93. package/app/data/pages/view-file-mobile.png +0 -0
  94. package/app/data/pages/view-file-sm.png +0 -0
  95. package/app/data/pages/view-file-top.png +0 -0
  96. package/app/data/pages/view-file.png +0 -0
  97. package/app/eslint.config.mjs +18 -0
  98. package/app/hooks/useAskSession.ts +181 -0
  99. package/app/hooks/useFileUpload.ts +126 -0
  100. package/app/hooks/useMention.ts +65 -0
  101. package/app/lib/LocaleContext.tsx +40 -0
  102. package/app/lib/actions.ts +40 -0
  103. package/app/lib/agent/index.ts +3 -0
  104. package/app/lib/agent/model.ts +18 -0
  105. package/app/lib/agent/prompt.ts +32 -0
  106. package/app/lib/agent/tools.ts +151 -0
  107. package/app/lib/api.ts +55 -0
  108. package/app/lib/core/backlinks.ts +40 -0
  109. package/app/lib/core/csv.ts +28 -0
  110. package/app/lib/core/fs-ops.ts +118 -0
  111. package/app/lib/core/git.ts +50 -0
  112. package/app/lib/core/index.ts +58 -0
  113. package/app/lib/core/lines.ts +89 -0
  114. package/app/lib/core/search.ts +79 -0
  115. package/app/lib/core/security.ts +43 -0
  116. package/app/lib/core/tree.ts +113 -0
  117. package/app/lib/core/types.ts +40 -0
  118. package/app/lib/fs.ts +467 -0
  119. package/app/lib/i18n.ts +300 -0
  120. package/app/lib/jwt.ts +58 -0
  121. package/app/lib/renderers/index.ts +79 -0
  122. package/app/lib/renderers/registry.ts +70 -0
  123. package/app/lib/settings.ts +150 -0
  124. package/app/lib/types.ts +32 -0
  125. package/app/lib/utils.ts +34 -0
  126. package/app/next-env.d.ts +6 -0
  127. package/app/next.config.ts +10 -0
  128. package/app/package-lock.json +15306 -0
  129. package/app/package.json +71 -0
  130. package/app/postcss.config.mjs +7 -0
  131. package/app/proxy.ts +64 -0
  132. package/app/public/file.svg +1 -0
  133. package/app/public/globe.svg +1 -0
  134. package/app/public/landing/index.html +353 -0
  135. package/app/public/landing/style.css +216 -0
  136. package/app/public/logo-square.svg +37 -0
  137. package/app/public/logo.svg +37 -0
  138. package/app/public/next.svg +1 -0
  139. package/app/public/vercel.svg +1 -0
  140. package/app/public/window.svg +1 -0
  141. package/app/scripts/extract-pdf.cjs +56 -0
  142. package/app/tsconfig.json +34 -0
  143. package/app/vitest.config.ts +14 -0
  144. package/assets/demo-flow-zh.html +622 -0
  145. package/assets/images/demo-flow-dark.png +0 -0
  146. package/assets/images/demo-flow-light.png +0 -0
  147. package/assets/images/demo-flow-zh-dark.png +0 -0
  148. package/assets/images/demo-flow-zh-light.png +0 -0
  149. package/assets/images/gui-sync-cv.png +0 -0
  150. package/assets/logo-square.svg +37 -0
  151. package/bin/cli.js +894 -0
  152. package/mcp/README.md +113 -0
  153. package/mcp/package-lock.json +1717 -0
  154. package/mcp/package.json +18 -0
  155. package/mcp/src/index.ts +494 -0
  156. package/mcp/tsconfig.json +13 -0
  157. package/package.json +49 -0
  158. package/scripts/setup.js +675 -0
  159. package/scripts/upgrade-prompt.md +147 -0
  160. package/skills/mindos/SKILL.md +319 -0
  161. package/skills/mindos-zh/SKILL.md +318 -0
  162. package/templates/README.md +31 -0
  163. package/templates/empty/CHANGELOG.md +9 -0
  164. package/templates/empty/CONFIG.json +197 -0
  165. package/templates/empty/CONFIG.md +73 -0
  166. package/templates/empty/INSTRUCTION.md +177 -0
  167. package/templates/empty/README.md +27 -0
  168. package/templates/en/CHANGELOG.md +9 -0
  169. package/templates/en/CONFIG.json +197 -0
  170. package/templates/en/CONFIG.md +73 -0
  171. package/templates/en/INSTRUCTION.md +177 -0
  172. package/templates/en/README.md +27 -0
  173. package/templates/en/TODO.md +13 -0
  174. package/templates/en//360/237/221/244 Profile/INSTRUCTION.md" +21 -0
  175. package/templates/en//360/237/221/244 Profile/README.md" +15 -0
  176. package/templates/en//360/237/221/244 Profile//342/232/231/357/270/217 Preferences.md" +21 -0
  177. package/templates/en//360/237/221/244 Profile//360/237/216/257 Focus.md" +31 -0
  178. package/templates/en//360/237/221/244 Profile//360/237/221/244 Identity.md" +22 -0
  179. package/templates/en//360/237/223/232 Resources/INSTRUCTION.md" +29 -0
  180. package/templates/en//360/237/223/232 Resources/README.md" +21 -0
  181. package/templates/en//360/237/223/232 Resources//360/237/247/276 AI Influencers.csv" +1 -0
  182. package/templates/en//360/237/223/232 Resources//360/237/247/276 AI Products.csv" +1 -0
  183. package/templates/en//360/237/223/232 Resources//360/237/247/276 AI Scholars.csv" +1 -0
  184. package/templates/en//360/237/223/232 Resources//360/237/247/276 AI Tools.csv" +1 -0
  185. package/templates/en//360/237/223/235 Notes/INSTRUCTION.md" +31 -0
  186. package/templates/en//360/237/223/235 Notes/Ideas/README.md" +8 -0
  187. package/templates/en//360/237/223/235 Notes/Ideas//360/237/247/252_example_product_idea.md" +16 -0
  188. package/templates/en//360/237/223/235 Notes/Inbox/README.md" +8 -0
  189. package/templates/en//360/237/223/235 Notes/Inbox//360/237/247/252_example_quick_capture.md" +14 -0
  190. package/templates/en//360/237/223/235 Notes/Meetings/README.md" +8 -0
  191. package/templates/en//360/237/223/235 Notes/Meetings//360/237/247/252_example_meeting_note.md" +17 -0
  192. package/templates/en//360/237/223/235 Notes/README.md" +24 -0
  193. package/templates/en//360/237/223/235 Notes/Waiting/README.md" +8 -0
  194. package/templates/en//360/237/223/235 Notes/Waiting//360/237/247/252_example_blocked_item.md" +16 -0
  195. package/templates/en//360/237/224/204 Workflows/Configurations/README.md" +3 -0
  196. package/templates/en//360/237/224/204 Workflows/Configurations//360/237/247/252_example_config_update_sop.md" +14 -0
  197. package/templates/en//360/237/224/204 Workflows/INSTRUCTION.md" +21 -0
  198. package/templates/en//360/237/224/204 Workflows/Information/README.md" +16 -0
  199. package/templates/en//360/237/224/204 Workflows/Information//360/237/247/252_example_info_capture_sop.md" +13 -0
  200. package/templates/en//360/237/224/204 Workflows/Media/README.md" +16 -0
  201. package/templates/en//360/237/224/204 Workflows/Media//360/237/247/252_example_content_publish_sop.md" +13 -0
  202. package/templates/en//360/237/224/204 Workflows/README.md" +22 -0
  203. package/templates/en//360/237/224/204 Workflows/Research/README.md" +16 -0
  204. package/templates/en//360/237/224/204 Workflows/Research//360/237/247/252_example_lit_review_sop.md" +16 -0
  205. package/templates/en//360/237/224/204 Workflows/Startup/README.md" +3 -0
  206. package/templates/en//360/237/224/204 Workflows/Startup//360/237/247/252_example_weekly_founder_ops.md" +22 -0
  207. package/templates/en//360/237/224/227 Connections/Classmates/README.md" +11 -0
  208. package/templates/en//360/237/224/227 Connections/Classmates//360/237/247/252_example_leo_chen.md" +16 -0
  209. package/templates/en//360/237/224/227 Connections/Colleagues/README.md" +11 -0
  210. package/templates/en//360/237/224/227 Connections/Colleagues//360/237/247/252_example_ethan_zhao.md" +16 -0
  211. package/templates/en//360/237/224/227 Connections/Connections Overview.csv" +5 -0
  212. package/templates/en//360/237/224/227 Connections/Family/README.md" +11 -0
  213. package/templates/en//360/237/224/227 Connections/Family//360/237/247/252_example_james_wang.md" +16 -0
  214. package/templates/en//360/237/224/227 Connections/Friends/README.md" +11 -0
  215. package/templates/en//360/237/224/227 Connections/Friends//360/237/247/252_example_lily_lin.md" +16 -0
  216. package/templates/en//360/237/224/227 Connections/INSTRUCTION.md" +56 -0
  217. package/templates/en//360/237/224/227 Connections/README.md" +20 -0
  218. package/templates/en//360/237/232/200 Projects/Archived/README.md" +9 -0
  219. package/templates/en//360/237/232/200 Projects/Archived//360/237/247/252_example_archived_project_note.md" +14 -0
  220. package/templates/en//360/237/232/200 Projects/INSTRUCTION.md" +29 -0
  221. package/templates/en//360/237/232/200 Projects/Products/README.md" +16 -0
  222. package/templates/en//360/237/232/200 Projects/Products//360/237/247/252_example_product_project_brief.md" +20 -0
  223. package/templates/en//360/237/232/200 Projects/README.md" +21 -0
  224. package/templates/en//360/237/232/200 Projects/Research/README.md" +16 -0
  225. package/templates/en//360/237/232/200 Projects/Research//360/237/247/252_example_research_project_brief.md" +16 -0
  226. package/templates/template-generation-skill.md +79 -0
  227. package/templates/zh/CHANGELOG.md +9 -0
  228. package/templates/zh/CONFIG.json +197 -0
  229. package/templates/zh/CONFIG.md +66 -0
  230. package/templates/zh/INSTRUCTION.md +177 -0
  231. package/templates/zh/README.md +27 -0
  232. package/templates/zh/TODO.md +13 -0
  233. package/templates/zh//360/237/221/244 /347/224/273/345/203/217/INSTRUCTION.md" +28 -0
  234. package/templates/zh//360/237/221/244 /347/224/273/345/203/217/README.md" +20 -0
  235. package/templates/zh//360/237/221/244 /347/224/273/345/203/217//342/232/231/357/270/217 Preferences.md" +21 -0
  236. package/templates/zh//360/237/221/244 /347/224/273/345/203/217//360/237/216/257 Focus.md" +31 -0
  237. package/templates/zh//360/237/221/244 /347/224/273/345/203/217//360/237/221/244 Identity.md" +22 -0
  238. package/templates/zh//360/237/223/232 /350/265/204/346/272/220/INSTRUCTION.md" +29 -0
  239. package/templates/zh//360/237/223/232 /350/265/204/346/272/220/README.md" +21 -0
  240. package/templates/zh//360/237/223/232 /350/265/204/346/272/220//360/237/247/276 AI Inferencers.csv" +1 -0
  241. 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
  242. 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
  243. 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
  244. package/templates/zh//360/237/223/235 /347/254/224/350/256/260/INSTRUCTION.md" +31 -0
  245. package/templates/zh//360/237/223/235 /347/254/224/350/256/260/README.md" +24 -0
  246. package/templates/zh//360/237/223/235 /347/254/224/350/256/260//344/274/232/350/256/256/README.md" +8 -0
  247. 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
  248. 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
  249. 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
  250. package/templates/zh//360/237/223/235 /347/254/224/350/256/260//346/203/263/346/263/225/README.md" +8 -0
  251. 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
  252. 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
  253. 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
  254. package/templates/zh//360/237/224/204 /346/265/201/347/250/213/INSTRUCTION.md" +29 -0
  255. package/templates/zh//360/237/224/204 /346/265/201/347/250/213/README.md" +21 -0
  256. package/templates/zh//360/237/224/204 /346/265/201/347/250/213//344/277/241/346/201/257/README.md" +16 -0
  257. 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
  258. package/templates/zh//360/237/224/204 /346/265/201/347/250/213//345/252/222/344/275/223/README.md" +16 -0
  259. 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
  260. package/templates/zh//360/237/224/204 /346/265/201/347/250/213//347/247/221/347/240/224/README.md" +16 -0
  261. 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
  262. package/templates/zh//360/237/224/204 /346/265/201/347/250/213//351/205/215/347/275/256/README.md" +3 -0
  263. 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
  264. package/templates/zh//360/237/224/227 /345/205/263/347/263/273/INSTRUCTION.md" +62 -0
  265. package/templates/zh//360/237/224/227 /345/205/263/347/263/273/README.md" +20 -0
  266. 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
  267. package/templates/zh//360/237/224/227 /345/205/263/347/263/273//345/220/214/344/272/213/README.md" +11 -0
  268. 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
  269. package/templates/zh//360/237/224/227 /345/205/263/347/263/273//345/220/214/345/255/246/README.md" +11 -0
  270. 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
  271. package/templates/zh//360/237/224/227 /345/205/263/347/263/273//345/256/266/344/272/272/README.md" +11 -0
  272. 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
  273. package/templates/zh//360/237/224/227 /345/205/263/347/263/273//346/234/213/345/217/213/README.md" +11 -0
  274. 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
  275. package/templates/zh//360/237/232/200 /351/241/271/347/233/256/INSTRUCTION.md" +31 -0
  276. package/templates/zh//360/237/232/200 /351/241/271/347/233/256/README.md" +21 -0
  277. package/templates/zh//360/237/232/200 /351/241/271/347/233/256//344/272/247/345/223/201/README.md" +16 -0
  278. 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
  279. 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
  280. 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
  281. package/templates/zh//360/237/232/200 /351/241/271/347/233/256//347/247/221/347/240/224/README.md" +16 -0
  282. 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
@@ -0,0 +1,622 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>MindOS Demo Flow</title>
7
+ <style>
8
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&family=Lora:wght@400;500;600;700&display=swap');
9
+
10
+ * { margin: 0; padding: 0; box-sizing: border-box; }
11
+
12
+ :root {
13
+ --bg: #0a0906;
14
+ --fg: #e8e4dc;
15
+ --accent: #d4954a;
16
+ --accent-glow: rgba(212, 149, 74, 0.35);
17
+ --accent-dim: rgba(212, 149, 74, 0.10);
18
+ --muted: #1c1a17;
19
+ --muted-fg: #8a8275;
20
+ --border: rgba(232, 228, 220, 0.08);
21
+ --success: #7aad80;
22
+ --info: #7a9ec4;
23
+ }
24
+
25
+ body.light {
26
+ --bg: #fdfbf7;
27
+ --fg: #1c1a17;
28
+ --accent: #c8873a;
29
+ --accent-glow: rgba(200, 135, 58, 0.25);
30
+ --accent-dim: rgba(200, 135, 58, 0.08);
31
+ --muted: #f2efe9;
32
+ --muted-fg: #7a7568;
33
+ --border: rgba(28, 26, 23, 0.1);
34
+ --success: #5a9460;
35
+ --info: #5a82a8;
36
+ }
37
+
38
+ body {
39
+ font-family: 'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont, sans-serif;
40
+ background: var(--bg);
41
+ color: var(--fg);
42
+ display: flex;
43
+ align-items: center;
44
+ justify-content: center;
45
+ min-height: 100vh;
46
+ padding: 40px;
47
+ line-height: 1.6;
48
+ }
49
+
50
+ .canvas {
51
+ width: 1520px;
52
+ background: var(--bg);
53
+ border-radius: 20px;
54
+ padding: 44px 44px 56px;
55
+ position: relative;
56
+ overflow: visible;
57
+ border: 1px solid var(--border);
58
+ }
59
+ .canvas::before {
60
+ content: '';
61
+ position: absolute;
62
+ top: -250px; left: 50%;
63
+ transform: translateX(-50%);
64
+ width: 800px; height: 500px;
65
+ background: radial-gradient(ellipse, var(--accent-dim) 0%, transparent 70%);
66
+ pointer-events: none;
67
+ }
68
+
69
+ /* Header */
70
+ .header { text-align: center; margin-bottom: 40px; }
71
+ .header h1 {
72
+ font-family: 'Lora', Georgia, serif;
73
+ font-size: 26px; font-weight: 500; color: var(--fg);
74
+ margin-bottom: 6px; letter-spacing: -0.01em;
75
+ }
76
+ .header p {
77
+ font-family: 'JetBrains Mono', monospace;
78
+ font-size: 13px; color: var(--muted-fg); letter-spacing: 0.05em;
79
+ }
80
+
81
+ /* Three columns with wide gaps for arrow labels */
82
+ .flow {
83
+ display: grid;
84
+ grid-template-columns: 300px 1fr 430px 1fr 370px;
85
+ align-items: start;
86
+ position: relative;
87
+ }
88
+ /* Gap columns (for arrows) */
89
+ .arrow-gap {
90
+ display: flex;
91
+ align-items: center;
92
+ justify-content: center;
93
+ align-self: center;
94
+ min-height: 40px;
95
+ }
96
+
97
+ .column-label {
98
+ display: flex; align-items: center; gap: 8px;
99
+ margin-bottom: 14px; padding: 0 4px;
100
+ }
101
+ .column-label .step {
102
+ width: 24px; height: 24px; border-radius: 50%;
103
+ display: flex; align-items: center; justify-content: center;
104
+ font-size: 12px; font-weight: 700; color: var(--bg);
105
+ font-family: 'JetBrains Mono', monospace;
106
+ }
107
+ .column-label .text {
108
+ font-size: 14px; font-weight: 600; color: var(--fg); opacity: 0.85;
109
+ }
110
+ .column-label .subtext {
111
+ font-family: 'JetBrains Mono', monospace;
112
+ font-size: 11px; color: var(--muted-fg); margin-left: auto;
113
+ }
114
+
115
+ /* Step colors */
116
+ .step-1 .step { background: var(--accent); }
117
+ .step-2 .step { background: var(--success); }
118
+ .step-3 .step { background: var(--info); }
119
+
120
+ /* ============ LEFT: Mobile ============ */
121
+ .mobile-frame {
122
+ background: var(--muted); border-radius: 28px;
123
+ border: 1.5px solid rgba(232,228,220,0.06);
124
+ overflow: hidden; box-shadow: 0 24px 48px rgba(0,0,0,0.4);
125
+ }
126
+ .mobile-status-bar {
127
+ display: flex; justify-content: space-between; align-items: center;
128
+ padding: 8px 20px; font-size: 11px;
129
+ font-family: 'JetBrains Mono', monospace;
130
+ color: var(--muted-fg); background: var(--bg);
131
+ }
132
+ .mobile-nav {
133
+ display: flex; align-items: center; padding: 10px 16px;
134
+ background: var(--bg); border-bottom: 1px solid var(--border);
135
+ }
136
+ .mobile-nav .back { color: var(--accent); font-size: 18px; margin-right: 10px; }
137
+ .mobile-nav .title { font-size: 14px; font-weight: 600; color: var(--fg); }
138
+ .mobile-body { padding: 12px; min-height: 260px; background: var(--muted); }
139
+ .mobile-note {
140
+ background: var(--bg); border-radius: 10px; padding: 11px;
141
+ margin-bottom: 8px; border-left: 3px solid var(--accent);
142
+ }
143
+ .mobile-note .note-time {
144
+ font-size: 10px; font-family: 'JetBrains Mono', monospace;
145
+ color: var(--muted-fg); margin-bottom: 4px;
146
+ }
147
+ .mobile-note .note-text { font-size: 12px; color: var(--fg); line-height: 1.5; opacity: 0.9; }
148
+ .mobile-note .note-tag {
149
+ display: inline-block; margin-top: 5px; padding: 2px 7px;
150
+ border-radius: 4px; font-size: 10px;
151
+ font-family: 'JetBrains Mono', monospace;
152
+ background: var(--accent-dim); color: var(--accent);
153
+ }
154
+ .mobile-input {
155
+ display: flex; align-items: center; gap: 8px; padding: 10px 12px;
156
+ background: var(--bg); border-top: 1px solid var(--border);
157
+ }
158
+ .mobile-input input {
159
+ flex: 1; background: var(--muted); border: 1px solid var(--border);
160
+ border-radius: 18px; padding: 6px 12px; font-size: 11px;
161
+ font-family: 'Inter', sans-serif; color: var(--fg); outline: none;
162
+ }
163
+ .mobile-input .send-btn {
164
+ width: 28px; height: 28px; border-radius: 50%; background: var(--accent);
165
+ display: flex; align-items: center; justify-content: center;
166
+ font-size: 12px; color: var(--bg); font-weight: 700;
167
+ }
168
+
169
+ /* ============ MIDDLE: Desktop GUI ============ */
170
+ .desktop-frame {
171
+ background: var(--muted); border-radius: 12px;
172
+ border: 1px solid var(--border); overflow: hidden;
173
+ box-shadow: 0 24px 48px rgba(0,0,0,0.4);
174
+ }
175
+ .desktop-titlebar {
176
+ display: flex; align-items: center; padding: 9px 14px;
177
+ background: var(--bg); border-bottom: 1px solid var(--border); gap: 7px;
178
+ }
179
+ .dot { width: 10px; height: 10px; border-radius: 50%; }
180
+ .dot-r { background: #e06c6c; }
181
+ .dot-y { background: var(--accent); }
182
+ .dot-g { background: var(--success); }
183
+ .desktop-titlebar .title {
184
+ margin-left: 8px; font-size: 11px;
185
+ font-family: 'JetBrains Mono', monospace; color: var(--muted-fg);
186
+ }
187
+ .desktop-layout { display: flex; min-height: 360px; }
188
+ .sidebar {
189
+ width: 140px; background: var(--bg); opacity: 0.85;
190
+ border-right: 1px solid var(--border); padding: 10px 0;
191
+ }
192
+ .sidebar-item {
193
+ display: flex; align-items: center; gap: 7px; padding: 6px 12px;
194
+ font-size: 11.5px; color: var(--muted-fg); cursor: default;
195
+ }
196
+ .sidebar-item.active {
197
+ background: var(--accent-dim); color: var(--accent);
198
+ border-right: 2px solid var(--accent);
199
+ }
200
+ .sidebar-item .icon {
201
+ width: 15px; height: 15px;
202
+ display: inline-flex; align-items: center; justify-content: center;
203
+ font-size: 9px; font-family: 'JetBrains Mono', monospace;
204
+ border-radius: 3px; background: rgba(232,228,220,0.04);
205
+ color: var(--muted-fg); font-weight: 600;
206
+ }
207
+ .sidebar-item.active .icon { background: rgba(212,149,74,0.15); color: var(--accent); }
208
+ .main-content { flex: 1; padding: 14px 18px; overflow: hidden; }
209
+ .file-path {
210
+ font-size: 10px; color: var(--muted-fg); margin-bottom: 8px;
211
+ font-family: 'JetBrains Mono', monospace;
212
+ }
213
+ .content-title {
214
+ font-family: 'Lora', Georgia, serif; font-size: 16px; font-weight: 500;
215
+ color: var(--fg); margin-bottom: 10px;
216
+ }
217
+ .content-section { margin-bottom: 12px; }
218
+ .content-section h3 {
219
+ font-size: 11.5px; font-weight: 600; color: var(--accent);
220
+ margin-bottom: 4px; letter-spacing: 0.02em;
221
+ }
222
+ .content-section li { font-size: 11.5px; color: var(--fg); opacity: 0.8; line-height: 1.6; }
223
+ .content-section ul { list-style: none; padding: 0; }
224
+ .content-section li::before { content: '\2022'; color: var(--accent); margin-right: 6px; opacity: 0.5; }
225
+ .badge-row { display: flex; gap: 5px; flex-wrap: wrap; margin-top: 4px; }
226
+ .badge {
227
+ padding: 2px 7px; border-radius: 4px; font-size: 10px;
228
+ font-family: 'JetBrains Mono', monospace;
229
+ background: rgba(232,228,220,0.04); color: var(--muted-fg); border: 1px solid var(--border);
230
+ }
231
+ .updated-tag {
232
+ display: inline-flex; align-items: center; gap: 4px;
233
+ padding: 3px 9px; border-radius: 6px; font-size: 10px;
234
+ font-family: 'JetBrains Mono', monospace;
235
+ background: var(--accent-dim); color: var(--accent);
236
+ border: 1px solid rgba(212,149,74,0.15); margin-bottom: 10px;
237
+ }
238
+
239
+ /* ============ RIGHT: Agent Group ============ */
240
+ .agent-group {
241
+ border: 1.5px solid rgba(122,158,196,0.2);
242
+ border-radius: 14px; padding: 14px 12px 12px;
243
+ background: rgba(122,158,196,0.03); position: relative;
244
+ }
245
+ .agent-group-label {
246
+ position: absolute; top: -10px; left: 14px;
247
+ padding: 1px 10px; font-size: 10px;
248
+ font-family: 'JetBrains Mono', monospace;
249
+ color: var(--info); background: var(--bg); border-radius: 4px;
250
+ letter-spacing: 0.04em;
251
+ }
252
+ .agent-stack { display: flex; flex-direction: column; gap: 8px; }
253
+
254
+ /* CLI terminal card */
255
+ .cli-frame {
256
+ background: var(--bg); border-radius: 9px;
257
+ border: 1px solid var(--border); overflow: hidden;
258
+ box-shadow: 0 8px 20px rgba(0,0,0,0.25);
259
+ }
260
+ .cli-titlebar {
261
+ display: flex; align-items: center; padding: 6px 10px;
262
+ background: var(--muted); border-bottom: 1px solid var(--border); gap: 5px;
263
+ }
264
+ .cli-titlebar .dots { display: flex; gap: 4px; }
265
+ .cli-titlebar .dots span { width: 7px; height: 7px; border-radius: 50%; }
266
+ .dot-r-sm { background: #e06c6c; }
267
+ .dot-y-sm { background: var(--accent); }
268
+ .dot-g-sm { background: var(--success); }
269
+ .cli-titlebar .name {
270
+ margin-left: 5px; font-size: 10.5px;
271
+ font-family: 'JetBrains Mono', monospace; color: var(--muted-fg);
272
+ }
273
+ .cli-body {
274
+ padding: 8px 12px; font-family: 'JetBrains Mono', monospace;
275
+ font-size: 10.5px; line-height: 1.6;
276
+ }
277
+ .cli-line { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
278
+ .cli-prompt { color: var(--accent); opacity: 0.8; }
279
+ .cli-cmd { color: var(--fg); opacity: 0.9; }
280
+ .cli-output { color: var(--muted-fg); }
281
+ .cli-highlight { color: var(--accent); }
282
+ .cli-reading { color: var(--info); }
283
+
284
+ /* Telegram-style chat card for OpenClaw */
285
+ .tg-frame {
286
+ background: var(--bg); border-radius: 9px;
287
+ border: 1px solid var(--accent-glow); overflow: hidden;
288
+ box-shadow: 0 8px 20px rgba(0,0,0,0.25);
289
+ }
290
+ .tg-header {
291
+ display: flex; align-items: center; gap: 8px;
292
+ padding: 7px 12px; background: var(--accent-dim);
293
+ border-bottom: 1px solid rgba(212,149,74,0.12);
294
+ }
295
+ .tg-avatar {
296
+ width: 22px; height: 22px; border-radius: 50%;
297
+ background: var(--accent); display: flex; align-items: center;
298
+ justify-content: center; font-size: 10px; font-weight: 700; color: var(--bg);
299
+ }
300
+ .tg-name {
301
+ font-size: 11px; font-weight: 600; color: var(--accent);
302
+ font-family: 'Inter', sans-serif;
303
+ }
304
+ .tg-badge {
305
+ margin-left: auto; font-size: 9px; padding: 1px 6px;
306
+ border-radius: 3px; background: var(--accent); color: var(--bg);
307
+ font-family: 'JetBrains Mono', monospace; font-weight: 600;
308
+ }
309
+ .tg-body { padding: 8px 12px; }
310
+ .tg-bubble {
311
+ padding: 7px 10px; border-radius: 8px 8px 8px 2px;
312
+ font-size: 11px; line-height: 1.5; margin-bottom: 5px;
313
+ }
314
+ .tg-bubble.user {
315
+ background: var(--accent-dim); color: var(--fg);
316
+ border-radius: 8px 8px 2px 8px; margin-left: 30px;
317
+ }
318
+ .tg-bubble.bot {
319
+ background: var(--muted); color: var(--fg); margin-right: 30px;
320
+ }
321
+ .tg-bubble .tg-hl { color: var(--accent); }
322
+
323
+ /* SVG overlay */
324
+ .arrows-svg {
325
+ position: absolute; top: 0; left: 0; width: 100%; height: 100%;
326
+ pointer-events: none; z-index: 50;
327
+ }
328
+
329
+ /* Bottom tagline */
330
+ .tagline {
331
+ text-align: center; margin-top: 44px; padding-top: 18px;
332
+ border-top: 1px solid var(--border);
333
+ }
334
+ .tagline p {
335
+ font-size: 13px; color: var(--muted-fg);
336
+ }
337
+ .tagline span { color: var(--accent); font-weight: 600; }
338
+
339
+ /* CTA card */
340
+ .cta-card {
341
+ margin: 20px auto 0; max-width: 680px; text-align: center;
342
+ background: var(--accent-dim); border: 1px solid rgba(212,149,74,0.15);
343
+ border-radius: 12px; padding: 16px 24px;
344
+ }
345
+ .cta-label {
346
+ font-size: 13px; font-weight: 600; color: var(--accent);
347
+ margin-bottom: 8px; letter-spacing: 0.02em;
348
+ }
349
+ .cta-code {
350
+ background: var(--bg); border: 1px solid var(--border);
351
+ border-radius: 8px; padding: 9px 14px;
352
+ font-family: 'JetBrains Mono', monospace; font-size: 11.5px;
353
+ color: var(--fg); opacity: 0.85; line-height: 1.5;
354
+ text-align: left;
355
+ }
356
+ </style>
357
+ </head>
358
+ <body>
359
+ <div class="canvas" id="canvas">
360
+ <div class="header">
361
+ <h1>MindOS:从灵感到执行到复盘</h1>
362
+ <p>随手记录 &rarr; 自动整理 &rarr; 所有 Agent 同步 &rarr; 经验回流</p>
363
+ </div>
364
+
365
+ <div class="flow" id="flow">
366
+ <!-- COL 1: Mobile -->
367
+ <div id="col-left">
368
+ <div class="column-label step-1">
369
+ <div class="step">1</div>
370
+ <div class="text">随时记录想法</div>
371
+ <div class="subtext">手机 / 任意设备</div>
372
+ </div>
373
+ <div class="mobile-frame" id="mobile-frame">
374
+ <div class="mobile-status-bar"><span>9:41</span><span>MindOS</span><span>Wi-Fi</span></div>
375
+ <div class="mobile-nav"><span class="back">&lsaquo;</span><span class="title">Quick Capture</span></div>
376
+ <div class="mobile-body">
377
+ <div class="mobile-note">
378
+ <div class="note-time">今天 09:41</div>
379
+ <div class="note-text">用户反馈:新手引导太长,50% 的人<br/>在第 3 步就放弃了。要简化到 2 步内<br/>完成首次体验,参考 Linear 的做法。</div>
380
+ <div class="note-tag">#用户反馈</div>
381
+ </div>
382
+ <div class="mobile-note" style="border-left-color: var(--muted-fg);">
383
+ <div class="note-time">昨天 23:20</div>
384
+ <div class="note-text">灵感:把安装流程做成"一句话发给<br/>Agent",零摩擦。方便用户直接上手。</div>
385
+ <div class="note-tag" style="background:rgba(138,130,117,0.1);color:var(--muted-fg);">#产品灵感</div>
386
+ </div>
387
+ </div>
388
+ <div class="mobile-input">
389
+ <input type="text" value="写个用户增长方案..." readonly />
390
+ <div class="send-btn">&uarr;</div>
391
+ </div>
392
+ </div>
393
+ </div>
394
+
395
+ <!-- GAP 1: arrow placeholder -->
396
+ <div class="arrow-gap" id="gap1"></div>
397
+
398
+ <!-- COL 2: Desktop GUI -->
399
+ <div id="col-mid">
400
+ <div class="column-label step-2">
401
+ <div class="step">2</div>
402
+ <div class="text">Agent 自动整理</div>
403
+ <div class="subtext">MindOS GUI</div>
404
+ </div>
405
+ <div class="desktop-frame" id="desktop-frame">
406
+ <div class="desktop-titlebar">
407
+ <div class="dot dot-r"></div><div class="dot dot-y"></div><div class="dot dot-g"></div>
408
+ <span class="title">MindOS &mdash; localhost:3000</span>
409
+ </div>
410
+ <div class="desktop-layout">
411
+ <div class="sidebar">
412
+ <div class="sidebar-item"><span class="icon">P</span> Profile</div>
413
+ <div class="sidebar-item active"><span class="icon">W</span> Workflows</div>
414
+ <div class="sidebar-item"><span class="icon">J</span> Projects</div>
415
+ <div class="sidebar-item"><span class="icon">C</span> Configs</div>
416
+ <div class="sidebar-item"><span class="icon">R</span> Resources</div>
417
+ <div class="sidebar-item"><span class="icon">G</span> Graph</div>
418
+ </div>
419
+ <div class="main-content">
420
+ <div class="file-path">Workflows/用户增长策略.md</div>
421
+ <div class="updated-tag">* Agent 已自动更新 3 个文件</div>
422
+ <div class="content-title">用户增长策略</div>
423
+ <div class="content-section">
424
+ <h3>核心行动项</h3>
425
+ <ul>
426
+ <li>简化新手引导:3 步压缩为 1 步</li>
427
+ <li>一句话安装作为核心传播点</li>
428
+ <li>制作 Before/After 对比视频</li>
429
+ </ul>
430
+ </div>
431
+ <div class="content-section">
432
+ <h3>关联更新</h3>
433
+ <div class="badge-row">
434
+ <span class="badge">Projects/增长实验.md</span>
435
+ <span class="badge">Profile/产品理念.md</span>
436
+ <span class="badge">Workflows/发布SOP.md</span>
437
+ </div>
438
+ </div>
439
+ </div>
440
+ </div>
441
+ </div>
442
+ </div>
443
+
444
+ <!-- GAP 2: arrow placeholder -->
445
+ <div class="arrow-gap" id="gap2"></div>
446
+
447
+ <!-- COL 3: Agent Group -->
448
+ <div id="col-right">
449
+ <div class="column-label step-3">
450
+ <div class="step">3</div>
451
+ <div class="text">所有 Agent 同步执行</div>
452
+ <div class="subtext">via MCP &amp; Skills</div>
453
+ </div>
454
+ <div class="agent-group" id="agent-group">
455
+ <div class="agent-group-label">ALL AGENTS via MCP</div>
456
+ <div class="agent-stack">
457
+ <!-- Claude Code -->
458
+ <div class="cli-frame">
459
+ <div class="cli-titlebar">
460
+ <div class="dots"><span class="dot-r-sm"></span><span class="dot-y-sm"></span><span class="dot-g-sm"></span></div>
461
+ <span class="name">Claude Code</span>
462
+ </div>
463
+ <div class="cli-body">
464
+ <div class="cli-line"><span class="cli-prompt">&gt; </span><span class="cli-cmd">写一篇产品推广文案</span></div>
465
+ <div class="cli-line"><span class="cli-reading"> Reading MindOS &rarr; 用户增长策略.md</span></div>
466
+ <div class="cli-line"><span class="cli-output"> Done. 已基于增长策略生成推广文案</span></div>
467
+ </div>
468
+ </div>
469
+ <!-- Cursor -->
470
+ <div class="cli-frame">
471
+ <div class="cli-titlebar">
472
+ <div class="dots"><span class="dot-r-sm"></span><span class="dot-y-sm"></span><span class="dot-g-sm"></span></div>
473
+ <span class="name">Cursor</span>
474
+ </div>
475
+ <div class="cli-body">
476
+ <div class="cli-line"><span class="cli-prompt">&gt; </span><span class="cli-cmd">简化新手引导到 1 步完成</span></div>
477
+ <div class="cli-line"><span class="cli-reading"> Reading MindOS &rarr; 产品理念.md</span></div>
478
+ <div class="cli-line"><span class="cli-output"> Done. 已重构 onboarding 组件</span></div>
479
+ </div>
480
+ </div>
481
+ <!-- OpenClaw (Telegram style) -->
482
+ <div class="tg-frame" id="cli-feedback">
483
+ <div class="tg-header">
484
+ <div class="tg-avatar">O</div>
485
+ <span class="tg-name">OpenClaw</span>
486
+ <span class="tg-badge">BOT</span>
487
+ </div>
488
+ <div class="tg-body">
489
+ <div class="tg-bubble user">帮我把这轮增长实验的经验沉淀下来</div>
490
+ <div class="tg-bubble bot"><span class="tg-hl">Writing &rarr; Workflows/增长复盘.md</span><br/>Done. 已沉淀为可复用 SOP</div>
491
+ </div>
492
+ </div>
493
+ </div>
494
+ </div>
495
+ </div>
496
+ </div>
497
+
498
+ <svg class="arrows-svg" id="arrows-svg" xmlns="http://www.w3.org/2000/svg"></svg>
499
+
500
+ <div class="tagline">
501
+ <p>你 &rarr; <span>MindOS</span> &rarr; 所有 Agent &rarr; <span>经验回流</span> &rarr; 持续进化的共享心智</p>
502
+ </div>
503
+
504
+ <div class="cta-card">
505
+ <div class="cta-label">&#9889; 立即体验 &mdash; 把这句话发给你的 Agent</div>
506
+ <div class="cta-code">帮我从 https://github.com/GeminiLight/MindOS 安装 MindOS,包含 MCP 和 Skills,使用中文模板。</div>
507
+ </div>
508
+ </div>
509
+
510
+ <script>
511
+ function drawArrows() {
512
+ const canvas = document.getElementById('canvas');
513
+ const svg = document.getElementById('arrows-svg');
514
+ const cr = canvas.getBoundingClientRect();
515
+
516
+ function rel(el) {
517
+ const r = el.getBoundingClientRect();
518
+ return {
519
+ left: r.left - cr.left, right: r.right - cr.left,
520
+ top: r.top - cr.top, bottom: r.bottom - cr.top,
521
+ cx: (r.left + r.right) / 2 - cr.left,
522
+ cy: (r.top + r.bottom) / 2 - cr.top,
523
+ };
524
+ }
525
+
526
+ const mobile = rel(document.getElementById('mobile-frame'));
527
+ const desktop = rel(document.getElementById('desktop-frame'));
528
+ const group = rel(document.getElementById('agent-group'));
529
+ const feedback = rel(document.getElementById('cli-feedback'));
530
+ const gap1 = rel(document.getElementById('gap1'));
531
+ const gap2 = rel(document.getElementById('gap2'));
532
+
533
+ svg.setAttribute('width', cr.width);
534
+ svg.setAttribute('height', cr.height);
535
+ svg.setAttribute('viewBox', `0 0 ${cr.width} ${cr.height}`);
536
+
537
+ const cs = getComputedStyle(document.body);
538
+ const accent = cs.getPropertyValue('--accent').trim();
539
+ const info = cs.getPropertyValue('--info').trim();
540
+
541
+ // Arrow 1: Mobile -> Desktop (想法同步)
542
+ const a1y = mobile.cy;
543
+ const a1x1 = mobile.right + 2;
544
+ const a1x2 = desktop.left - 2;
545
+ const a1mx = gap1.cx;
546
+
547
+ // Arrow 2: Desktop -> Agent Group (MCP 读取)
548
+ const a2y = group.cy;
549
+ const a2x1 = desktop.right + 2;
550
+ const a2x2 = group.left - 2;
551
+ const a2mx = gap2.cx;
552
+
553
+ // Arrow 3: Feedback -> Desktop bottom (经验回流)
554
+ // Start: bottom center of OpenClaw
555
+ const a3sx = feedback.cx;
556
+ const a3sy = feedback.bottom + 2;
557
+ // End: bottom center of Desktop GUI
558
+ const a3ex = desktop.cx;
559
+ const a3ey = desktop.bottom + 2;
560
+ // Horizontal line runs below both panels
561
+ const a3by = Math.max(feedback.bottom, desktop.bottom) + 36;
562
+ const r = 10; // corner radius
563
+ // Label position: closer to the right (OpenClaw) side
564
+ const a3labelX = a3sx - (a3sx - a3ex) * 0.25;
565
+
566
+ svg.innerHTML = `
567
+ <defs>
568
+ <marker id="ah-a" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
569
+ <path d="M0,0.5 L7,3 L0,5.5" fill="none" stroke="${accent}" stroke-width="1.2"/>
570
+ </marker>
571
+ <marker id="ah-i" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
572
+ <path d="M0,0.5 L7,3 L0,5.5" fill="none" stroke="${info}" stroke-width="1.2"/>
573
+ </marker>
574
+ </defs>
575
+
576
+ <!-- Arrow 1: 想法同步 -->
577
+ <line x1="${a1x1}" y1="${a1y}" x2="${a1mx - 36}" y2="${a1y}"
578
+ stroke="${accent}" stroke-width="1.5" stroke-dasharray="5,4" opacity="0.55"/>
579
+ <line x1="${a1mx + 36}" y1="${a1y}" x2="${a1x2}" y2="${a1y}"
580
+ stroke="${accent}" stroke-width="1.5" stroke-dasharray="5,4" opacity="0.55"
581
+ marker-end="url(#ah-a)"/>
582
+ <rect x="${a1mx - 32}" y="${a1y - 11}" width="64" height="20" rx="10"
583
+ fill="var(--bg)" stroke="${accent}" stroke-width="0.7" opacity="0.85"/>
584
+ <text x="${a1mx}" y="${a1y + 3}" text-anchor="middle" fill="${accent}"
585
+ font-size="10.5" font-weight="500" font-family="'Inter',sans-serif">想法同步</text>
586
+
587
+ <!-- Arrow 2: MCP 读取 -->
588
+ <line x1="${a2x1}" y1="${a2y}" x2="${a2mx - 38}" y2="${a2y}"
589
+ stroke="${info}" stroke-width="1.5" stroke-dasharray="5,4" opacity="0.55"/>
590
+ <line x1="${a2mx + 38}" y1="${a2y}" x2="${a2x2}" y2="${a2y}"
591
+ stroke="${info}" stroke-width="1.5" stroke-dasharray="5,4" opacity="0.55"
592
+ marker-end="url(#ah-i)"/>
593
+ <rect x="${a2mx - 34}" y="${a2y - 11}" width="68" height="20" rx="10"
594
+ fill="var(--bg)" stroke="${info}" stroke-width="0.7" opacity="0.85"/>
595
+ <text x="${a2mx}" y="${a2y + 3}" text-anchor="middle" fill="${info}"
596
+ font-size="10.5" font-weight="500" font-family="'Inter',sans-serif">MCP 读取</text>
597
+
598
+ <!-- Arrow 3: 经验回流 (U-shape, split into segments with label gap) -->
599
+ <!-- Right vertical: OpenClaw bottom -> corner -> toward label -->
600
+ <path d="M ${a3sx} ${a3sy}
601
+ L ${a3sx} ${a3by - r}
602
+ Q ${a3sx} ${a3by} ${a3sx - r} ${a3by}
603
+ L ${a3labelX + 36} ${a3by}"
604
+ fill="none" stroke="${accent}" stroke-width="1.5" stroke-dasharray="5,4" opacity="0.55"/>
605
+ <!-- Left vertical: label -> corner -> up to Desktop bottom -->
606
+ <path d="M ${a3labelX - 36} ${a3by}
607
+ L ${a3ex + r} ${a3by}
608
+ Q ${a3ex} ${a3by} ${a3ex} ${a3by - r}
609
+ L ${a3ex} ${a3ey}"
610
+ fill="none" stroke="${accent}" stroke-width="1.5" stroke-dasharray="5,4" opacity="0.55"
611
+ marker-end="url(#ah-a)"/>
612
+ <rect x="${a3labelX - 32}" y="${a3by - 11}" width="64" height="20" rx="10"
613
+ fill="var(--bg)" stroke="${accent}" stroke-width="0.7" opacity="0.85"/>
614
+ <text x="${a3labelX}" y="${a3by + 3}" text-anchor="middle" fill="${accent}"
615
+ font-size="10.5" font-weight="500" font-family="'Inter',sans-serif">经验回流</text>
616
+ `;
617
+ }
618
+
619
+ window.addEventListener('load', () => setTimeout(drawArrows, 500));
620
+ </script>
621
+ </body>
622
+ </html>
Binary file
Binary file
@@ -0,0 +1,37 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" fill="none">
2
+ <defs>
3
+ <linearGradient id="grad-human" x1="35" y1="40" x2="5" y2="40" gradientUnits="userSpaceOnUse">
4
+ <stop offset="0%" stop-color="#c8873a" stop-opacity="0.8"/>
5
+ <stop offset="100%" stop-color="#c8873a" stop-opacity="0.3"/>
6
+ </linearGradient>
7
+ <linearGradient id="grad-agent" x1="35" y1="40" x2="75" y2="40" gradientUnits="userSpaceOnUse">
8
+ <stop offset="0%" stop-color="#c8873a" stop-opacity="0.8"/>
9
+ <stop offset="100%" stop-color="#c8873a" stop-opacity="1"/>
10
+ </linearGradient>
11
+ </defs>
12
+
13
+ <g transform="translate(0, 20)">
14
+ <!-- Human Loop (Left) — dashed -->
15
+ <path
16
+ d="M35,20 C25,35 8,35 8,20 C8,5 25,5 35,20"
17
+ stroke="url(#grad-human)"
18
+ stroke-width="3"
19
+ stroke-dasharray="2 4"
20
+ stroke-linecap="round"
21
+ />
22
+
23
+ <!-- Agent Loop (Right) — solid -->
24
+ <path
25
+ d="M35,20 C45,2 75,2 75,20 C75,38 45,38 35,20"
26
+ stroke="url(#grad-agent)"
27
+ stroke-width="4.5"
28
+ stroke-linecap="round"
29
+ />
30
+
31
+ <!-- Spark center -->
32
+ <path
33
+ d="M35,17.5 Q35,20 37.5,20 Q35,20 35,22.5 Q35,20 32.5,20 Q35,20 35,17.5 Z"
34
+ fill="#FEF3C7"
35
+ />
36
+ </g>
37
+ </svg>