feat(desktop): embed BoosAPI Desktop client as a subproject

Vendor the rebranded BoosAPI Desktop client (Tauri + Vue) into metapi as
a monorepo subdirectory under desktop/. Source only — node_modules,
dist, Cargo target and the upstream .git history are excluded.

desktop/ keeps its own independent Cargo workspace (desktop/src-tauri
with crates/*); it is not part of the backend boosapi crate, so a
`cargo check` at the metapi root still compiles only the backend. Build
the desktop app from desktop/src-tauri per desktop/README.md.

Note: app icons are still placeholder assets pending the final BoosAPI
logo. The updater signing keys live outside the repo and are not
included.
This commit is contained in:
boos
2026-06-22 11:32:57 +08:00
parent d9c78ecc73
commit e0a5f57793
2305 changed files with 449355 additions and 0 deletions
@@ -0,0 +1,5 @@
# Cloudflare Pages 重定向规则
# SPA 路由: 将所有请求重定向到 index.html
# https://developers.cloudflare.com/pages/configuration/redirects/
/* /index.html 200
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<style>
path { fill: #222; }
@media (prefers-color-scheme: dark) {
path { fill: #ffffff; }
}
</style>
<path d="M27.562 26L17.17 8.928l2.366-3.888L17.828 4L16 7.005L14.17 4l-1.708 1.04l2.366 3.888L4.438 26H2v2h28v-2zM16 10.85L25.22 26H17v-8h-2v8H6.78z" />
</svg>

After

Width:  |  Height:  |  Size: 347 B

@@ -0,0 +1,33 @@
<svg width="1200" height="630" viewBox="0 0 1200 630" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="1200" height="630" fill="#050B18"/>
<rect x="44" y="44" width="1112" height="542" rx="34" fill="url(#bg)"/>
<rect x="92" y="108" width="430" height="414" rx="30" fill="#020617" stroke="#1E293B" stroke-width="2"/>
<rect x="128" y="148" width="132" height="36" rx="18" fill="#22C55E" fill-opacity="0.2" stroke="#22C55E"/>
<text x="194" y="166" fill="#DCFCE7" font-family="Arial, Helvetica, sans-serif" font-size="20" font-weight="700" text-anchor="middle" dominant-baseline="middle">Live demo</text>
<rect x="128" y="214" width="320" height="18" rx="9" fill="#E2E8F0" fill-opacity="0.92"/>
<rect x="128" y="246" width="270" height="18" rx="9" fill="#94A3B8" fill-opacity="0.8"/>
<rect x="128" y="302" width="154" height="164" rx="26" fill="#111827"/>
<rect x="304" y="302" width="178" height="164" rx="26" fill="#0F172A"/>
<path d="M168 344H242" stroke="#38BDF8" stroke-width="20" stroke-linecap="round"/>
<path d="M352 332C352 325.373 357.373 320 364 320H404C427.196 320 446 338.804 446 362C446 385.196 427.196 404 404 404H364C357.373 404 352 398.627 352 392V332Z" fill="#F59E0B"/>
<path d="M352 434L430 434" stroke="#A78BFA" stroke-width="18" stroke-linecap="round"/>
<rect x="550" y="118" width="558" height="394" rx="34" fill="#0B1120" stroke="#334155" stroke-width="2"/>
<rect x="598" y="152" width="158" height="34" rx="17" fill="#38BDF8" fill-opacity="0.14" stroke="#38BDF8" stroke-opacity="0.7"/>
<text x="677" y="169" fill="#BAE6FD" font-family="Arial, Helvetica, sans-serif" font-size="15" font-weight="700" text-anchor="middle" dominant-baseline="middle">PLAYGROUND</text>
<text x="598" y="232" fill="#F8FAFC" font-family="Arial, Helvetica, sans-serif" font-size="48" font-weight="700">markstream-vue</text>
<text x="598" y="288" fill="#C4B5FD" font-family="Arial, Helvetica, sans-serif" font-size="28" font-weight="700">Interactive demos</text>
<text x="598" y="342" fill="#CBD5E1" font-family="Arial, Helvetica, sans-serif" font-size="20">Streaming Markdown for AI chat</text>
<text x="598" y="378" fill="#CBD5E1" font-family="Arial, Helvetica, sans-serif" font-size="20">Mermaid, KaTeX, CDN peers</text>
<rect x="598" y="416" width="110" height="36" rx="18" fill="#0F1D33" stroke="#334155"/>
<text x="653" y="434" fill="#E2E8F0" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" text-anchor="middle" dominant-baseline="middle">AI chat</text>
<rect x="720" y="416" width="120" height="36" rx="18" fill="#0F1D33" stroke="#334155"/>
<text x="780" y="434" fill="#E2E8F0" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" text-anchor="middle" dominant-baseline="middle">Mermaid</text>
<rect x="852" y="416" width="100" height="36" rx="18" fill="#0F1D33" stroke="#334155"/>
<text x="902" y="434" fill="#E2E8F0" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" text-anchor="middle" dominant-baseline="middle">KaTeX</text>
<defs>
<linearGradient id="bg" x1="66" y1="62" x2="1124" y2="566" gradientUnits="userSpaceOnUse">
<stop stop-color="#111827"/>
<stop offset="1" stop-color="#312E81"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

@@ -0,0 +1,4 @@
User-agent: *
Allow: /
Sitemap: https://markstream-vue.simonhe.me/sitemap.xml
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://markstream-vue.simonhe.me/</loc>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://markstream-vue.simonhe.me/markdown</loc>
<changefreq>monthly</changefreq>
<priority>0.85</priority>
</url>
<url>
<loc>https://markstream-vue.simonhe.me/test</loc>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://markstream-vue.simonhe.me/cdn-peers</loc>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://markstream-vue.simonhe.me/mermaid-export-demo</loc>
<changefreq>monthly</changefreq>
<priority>0.76</priority>
</url>
</urlset>
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="Vue Markdown Renderer">
<title>Vue Markdown Renderer</title>
<defs>
<linearGradient id="g-vue" x1="0" x2="1" y1="0" y2="1">
<stop offset="0" stop-color="#41b883" />
<stop offset="1" stop-color="#2c9f67" />
</linearGradient>
<linearGradient id="g-accent" x1="0" x2="1" y1="0" y2="1">
<stop offset="0" stop-color="#3aa8ff" />
<stop offset="1" stop-color="#5cc6ff" />
</linearGradient>
</defs>
<!-- background card -->
<rect x="6" y="6" width="116" height="116" rx="16" fill="#0b1220" />
<rect x="12" y="12" width="104" height="104" rx="12" fill="#ffffff" />
<!-- folded corner -->
<path d="M92 12 H108 V28" fill="#f6f7f8" opacity="0.9" />
<path d="M92 12 L108 28" stroke="#e6e6e6" stroke-width="1.5" fill="none" />
<!-- document area -->
<rect x="28" y="26" width="72" height="76" rx="6" fill="#ffffff" />
<!-- Vue chevron (simplified) -->
<g transform="translate(34,30)">
<path d="M10 0 L24 24 L0 24 Z" fill="url(#g-vue)" />
<path d="M10 6 L24 30 L0 30 Z" fill="#063" opacity="0.95" />
</g>
<!-- Markdown hash (#) drawn with strokes (reliable across renderers) -->
<g transform="translate(64,46)" stroke="#0b1220" stroke-width="4" stroke-linecap="round">
<line x1="-12" y1="-4" x2="12" y2="-4" />
<line x1="-12" y1="8" x2="12" y2="8" />
<line x1="-6" y1="-12" x2="-6" y2="20" />
<line x1="6" y1="-12" x2="6" y2="20" />
</g>
<!-- small code brackets to indicate renderer -->
<g transform="translate(36,84)" stroke="#0b1220" stroke-width="3" fill="none" stroke-linecap="round">
<path d="M0 0 L8 8 L0 16" />
<path d="M56 0 L48 8 L56 16" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB