@geminilight/mindos 0.7.2 → 0.7.4

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 (254) hide show
  1. package/_standalone/.mindos-build-version +1 -1
  2. package/_standalone/.next/BUILD_ID +1 -1
  3. package/_standalone/.next/app-path-routes-manifest.json +19 -19
  4. package/_standalone/.next/build-manifest.json +3 -3
  5. package/_standalone/.next/cache/.previewinfo +1 -1
  6. package/_standalone/.next/cache/.rscinfo +1 -1
  7. package/_standalone/.next/cache/config.json +3 -3
  8. package/_standalone/.next/prerender-manifest.json +3 -3
  9. package/_standalone/.next/react-loadable-manifest.json +4 -4
  10. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  11. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  12. package/_standalone/.next/server/app/_global-error.html +2 -2
  13. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  14. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  22. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  23. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  26. package/_standalone/.next/server/app/agents/page.js +1 -1
  27. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  28. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  29. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
  41. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/ask/route.js +4 -4
  43. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  44. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  45. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  48. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  49. package/_standalone/.next/server/app/api/channels/verify/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/connect/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/embedding/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/extract-docx/route_client-reference-manifest.js +1 -1
  54. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  55. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  56. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  57. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  59. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  60. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  61. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  62. package/_standalone/.next/server/app/api/im/activity/route_client-reference-manifest.js +1 -1
  63. package/_standalone/.next/server/app/api/im/config/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/im/feishu/long-connection/event/route_client-reference-manifest.js +1 -1
  65. package/_standalone/.next/server/app/api/im/feishu/long-connection/route_client-reference-manifest.js +1 -1
  66. package/_standalone/.next/server/app/api/im/status/route_client-reference-manifest.js +1 -1
  67. package/_standalone/.next/server/app/api/im/test/route_client-reference-manifest.js +1 -1
  68. package/_standalone/.next/server/app/api/im/webhook/feishu/route_client-reference-manifest.js +1 -1
  69. package/_standalone/.next/server/app/api/im/webhook-status/route_client-reference-manifest.js +1 -1
  70. package/_standalone/.next/server/app/api/inbox/clip/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  72. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/lint/route_client-reference-manifest.js +1 -1
  74. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  75. package/_standalone/.next/server/app/api/mcp/direct-tools/route_client-reference-manifest.js +1 -1
  76. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  78. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  79. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/mcp/tools/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/obsidian/compat-report/route_client-reference-manifest.js +1 -1
  84. package/_standalone/.next/server/app/api/obsidian/import/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  87. package/_standalone/.next/server/app/api/search/prewarm/route_client-reference-manifest.js +1 -1
  88. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  89. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  92. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/space-overview/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  102. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  105. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/capture/history/page.js +1 -1
  108. package/_standalone/.next/server/app/capture/history/page.js.nft.json +1 -1
  109. package/_standalone/.next/server/app/capture/history/page_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/capture/page.js +1 -1
  111. package/_standalone/.next/server/app/capture/page.js.nft.json +1 -1
  112. package/_standalone/.next/server/app/capture/page_client-reference-manifest.js +1 -1
  113. package/_standalone/.next/server/app/changelog/page.js +1 -1
  114. package/_standalone/.next/server/app/changelog/page.js.nft.json +1 -1
  115. package/_standalone/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/app/changes/page.js +1 -1
  117. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  118. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  119. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  120. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  121. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  122. package/_standalone/.next/server/app/echo/page.js +1 -1
  123. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  124. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  125. package/_standalone/.next/server/app/explore/page.js +1 -1
  126. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  127. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  128. package/_standalone/.next/server/app/help/page.js +1 -1
  129. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  130. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  131. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  132. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  133. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  134. package/_standalone/.next/server/app/login/page.js +1 -1
  135. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  136. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  137. package/_standalone/.next/server/app/page.js +1 -1
  138. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  139. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  140. package/_standalone/.next/server/app/setup/page.js +1 -1
  141. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  142. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  143. package/_standalone/.next/server/app/todo/page.js +1 -1
  144. package/_standalone/.next/server/app/todo/page.js.nft.json +1 -1
  145. package/_standalone/.next/server/app/todo/page_client-reference-manifest.js +1 -1
  146. package/_standalone/.next/server/app/trash/page.js +2 -2
  147. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  148. package/_standalone/.next/server/app/view/[...path]/page.js +2 -2
  149. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  150. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  151. package/_standalone/.next/server/app/wiki/page.js +2 -0
  152. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -0
  153. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -0
  154. package/_standalone/.next/server/app-paths-manifest.json +19 -19
  155. package/_standalone/.next/server/chunks/2250.js +1 -1
  156. package/_standalone/.next/server/chunks/{1057.js → 3861.js} +2 -2
  157. package/_standalone/.next/server/chunks/4802.js +30 -30
  158. package/_standalone/.next/server/chunks/8388.js +1 -1
  159. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  160. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  161. package/_standalone/.next/server/pages/500.html +2 -2
  162. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  163. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  164. package/_standalone/.next/static/chunks/{5581-bae715e40d227b5f.js → 5581-beecbc4ca5625aa9.js} +2 -2
  165. package/_standalone/.next/static/chunks/6762.c871d0bf3f45ba87.js +1 -0
  166. package/_standalone/.next/static/chunks/{8064-e65acd2762132099.js → 8064-acac37daf946082b.js} +1 -1
  167. package/_standalone/.next/static/chunks/{3985.695651f6b5cd768c.js → 8984.91fb8cde1983c564.js} +2 -2
  168. package/_standalone/.next/static/chunks/app/{layout-0cf6f2a65f605a0d.js → layout-20faba3bc0af7cd2.js} +19 -19
  169. package/_standalone/.next/static/chunks/app/trash/page-0c2c67929b71ef71.js +1 -0
  170. package/_standalone/.next/static/chunks/app/view/[...path]/not-found-fd06cc989103ebe7.js +1 -0
  171. package/_standalone/.next/static/chunks/app/view/[...path]/page-dba70888697ba910.js +12 -0
  172. package/_standalone/.next/static/chunks/app/wiki/page-9bc1fec84d343290.js +14 -0
  173. package/_standalone/.next/static/chunks/webpack-3c1d0331f1da64b8.js +1 -0
  174. package/_standalone/.next/trace +97 -97
  175. package/_standalone/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
  176. package/_standalone/MINDOS_EXPLORATION_SUMMARY.md +229 -0
  177. package/_standalone/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
  178. package/_standalone/__tests__/api/mcp-install.test.ts +8 -2
  179. package/_standalone/__tests__/core/embedding-provider.test.ts +78 -0
  180. package/_standalone/__tests__/skills/mindos-skill-copy-alignment.test.ts +10 -4
  181. package/_standalone/components/ask/AskHeader.tsx +25 -18
  182. package/_standalone/components/ask/SessionHistoryPanel.tsx +21 -12
  183. package/_standalone/components/settings/AiTab.tsx +3 -0
  184. package/_standalone/data/skills/mindos/SKILL.md +269 -0
  185. package/_standalone/data/skills/mindos/references/write-supplement.md +119 -0
  186. package/_standalone/data/skills/mindos-zh/SKILL.md +227 -0
  187. package/_standalone/data/skills/mindos-zh/references/write-supplement.md +119 -0
  188. package/app/__tests__/api/mcp-install.test.ts +8 -2
  189. package/app/__tests__/core/embedding-provider.test.ts +78 -0
  190. package/app/__tests__/skills/mindos-skill-copy-alignment.test.ts +10 -4
  191. package/app/app/api/ask/route.ts +14 -9
  192. package/app/app/view/[...path]/ViewPageClient.tsx +15 -12
  193. package/app/app/view/[...path]/not-found.tsx +9 -5
  194. package/app/components/ask/AskHeader.tsx +25 -18
  195. package/app/components/ask/SessionHistoryPanel.tsx +21 -12
  196. package/app/components/settings/AiTab.tsx +3 -0
  197. package/app/eslint.config.mjs +18 -0
  198. package/app/lib/core/embedding-provider.ts +12 -4
  199. package/app/lib/i18n/modules/settings.ts +2 -0
  200. package/app/package-lock.json +20214 -0
  201. package/app/tsconfig.tsbuildinfo +1 -0
  202. package/app/vitest.config.ts +14 -0
  203. package/assets/demo-flow-zh.html +622 -0
  204. package/assets/images/demo-flow-dark.png +0 -0
  205. package/assets/images/demo-flow-dark.webp +0 -0
  206. package/assets/images/demo-flow-light.png +0 -0
  207. package/assets/images/demo-flow-light.webp +0 -0
  208. package/assets/images/demo-flow-zh-dark.png +0 -0
  209. package/assets/images/demo-flow-zh-dark.webp +0 -0
  210. package/assets/images/demo-flow-zh-light.png +0 -0
  211. package/assets/images/demo-flow-zh-light.webp +0 -0
  212. package/assets/images/gui-sync-cv.png +0 -0
  213. package/assets/images/gui-sync-cv.webp +0 -0
  214. package/assets/images/mindos-chat.png +0 -0
  215. package/assets/images/mindos-chat.webp +0 -0
  216. package/assets/images/mindos-dashboard.png +0 -0
  217. package/assets/images/mindos-dashboard.webp +0 -0
  218. package/assets/images/mindos-echo.png +0 -0
  219. package/assets/images/mindos-echo.webp +0 -0
  220. package/assets/images/mindos-home.png +0 -0
  221. package/assets/images/mindos-home.webp +0 -0
  222. package/assets/images/wechat-qr.png +0 -0
  223. package/bin/lib/mcp-build.js +8 -0
  224. package/mcp/package-lock.json +2202 -0
  225. package/mcp/src/index.ts +783 -0
  226. package/package.json +13 -1
  227. package/.env.local.example +0 -38
  228. package/.playwright-cli/page-2026-04-12T12-26-53-393Z.yml +0 -6
  229. package/.playwright-cli/page-2026-04-12T12-27-20-256Z.yml +0 -120
  230. package/.syncinclude +0 -105
  231. package/MINDOS_SEARCH_DIAGRAM.txt +0 -243
  232. package/_standalone/.next/static/chunks/576.3cae31209383ddbd.js +0 -1
  233. package/_standalone/.next/static/chunks/app/trash/page-085f121c0815d542.js +0 -1
  234. package/_standalone/.next/static/chunks/app/view/[...path]/not-found-2a6eec67e91eaaf9.js +0 -1
  235. package/_standalone/.next/static/chunks/app/view/[...path]/page-faeaf8c09c1c6d7c.js +0 -12
  236. package/_standalone/.next/static/chunks/webpack-a1bb35f2d540e463.js +0 -1
  237. package/scripts/build-runtime-archive.sh +0 -151
  238. package/scripts/fix-postcss-deps.cjs +0 -75
  239. package/scripts/gen-renderer-index.js +0 -64
  240. package/scripts/hooks/block-public-merge.sh +0 -42
  241. package/scripts/hooks/pre-merge-commit +0 -4
  242. package/scripts/hooks/pre-push +0 -37
  243. package/scripts/hooks/prepare-commit-msg +0 -12
  244. package/scripts/migrate-agent-audit-log.js +0 -170
  245. package/scripts/migrate-agent-diff.js +0 -146
  246. package/scripts/parse-syncinclude.sh +0 -92
  247. package/scripts/prepare-standalone.mjs +0 -83
  248. package/scripts/release.sh +0 -145
  249. package/scripts/setup.js +0 -1427
  250. package/scripts/test-oss-upload.sh +0 -100
  251. package/scripts/verify-standalone.mjs +0 -129
  252. package/scripts/write-build-stamp.js +0 -40
  253. /package/_standalone/.next/static/{q5RP_Mx8BrCfvVDnLpRRc → 0UlbV2rA2i4B-8YYg41wQ}/_buildManifest.js +0 -0
  254. /package/_standalone/.next/static/{q5RP_Mx8BrCfvVDnLpRRc → 0UlbV2rA2i4B-8YYg41wQ}/_ssgManifest.js +0 -0
@@ -0,0 +1,14 @@
1
+ import { defineConfig } from 'vitest/config';
2
+ import path from 'path';
3
+
4
+ export default defineConfig({
5
+ test: {
6
+ include: ['__tests__/**/*.test.ts', '__tests__/**/*.test.tsx', '__tests__/**/*.test.js'],
7
+ setupFiles: ['__tests__/setup.ts'],
8
+ },
9
+ resolve: {
10
+ alias: {
11
+ '@': path.resolve(__dirname),
12
+ },
13
+ },
14
+ });
@@ -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>记一句想法,剩下的全自动</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">今天 11:30</div>
379
+ <div class="note-text">想好了新项目:先理清思路,<br/>代码开搞,顺便发个帖宣传下</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">昨天 16:00</div>
384
+ <div class="note-text">之前调研过竞品,用 React + Tailwind 方案</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"><span class="icon">W</span> Workflows</div>
414
+ <div class="sidebar-item active"><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">Projects/新项目计划.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>先理清项目方案和架构</li>
427
+ <li>搭建代码骨架,快速出原型</li>
428
+ <li>发帖宣传,收集早期反馈</li>
429
+ </ul>
430
+ </div>
431
+ <div class="content-section">
432
+ <h3>关联更新</h3>
433
+ <div class="badge-row">
434
+ <span class="badge">Projects/Project-Plan.md</span>
435
+ <span class="badge">Workflows/Launch-SOP.md</span>
436
+ <span class="badge">TODO.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">Gemini</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; Project-Plan.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">搭建项目骨架</span></div>
477
+ <div class="cli-line"><span class="cli-reading"> Reading MindOS &rarr; Project-Plan.md</span></div>
478
+ <div class="cli-line"><span class="cli-output"> Done. 已初始化项目结构 + 基础配置</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/Launch-SOP.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></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
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file