SnowLuma v2.4.2 source snapshot
Dev Build / cleanup (push) Waiting to run
Dev Build / typecheck (push) Waiting to run
Publish MCP to npm / Build, test, and publish MCP (push) Waiting to run
Publish SDK to npm / Build, test, and publish SDK (push) Waiting to run
Sync action catalog to docs / sync (push) Waiting to run
Publish UI to npm / Build and publish UI (push) Waiting to run
Build and Release / preflight (push) Waiting to run

This commit is contained in:
TanTan committed 2026-11-13 09:02:00 +08:00
commit fa9c73363d
1367 files changed
+355735

No files matched your search

+150
View File
@@ -0,0 +1,150 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="400" viewBox="0 0 1200 400" role="img" aria-labelledby="hero-title hero-desc">
<title id="hero-title">SnowLuma — QQ 到 OneBot 的现代协议桥</title>
<desc id="hero-desc">SnowLuma 将多个 QQ 原生会话经过协议、桥接与 OneBot 三层处理,连接到 WebSocket、HTTP、WebUI、SDK 与 MCP。</desc>
<defs>
<linearGradient id="hero-bg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#08111f"/>
<stop offset="0.58" stop-color="#101b31"/>
<stop offset="1" stop-color="#17223d"/>
</linearGradient>
<linearGradient id="brand-line" x1="0" y1="0" x2="1" y2="0">
<stop offset="0" stop-color="#75d2ff"/>
<stop offset="0.55" stop-color="#bba7ff"/>
<stop offset="1" stop-color="#f4bfd9"/>
</linearGradient>
<linearGradient id="bridge-fill" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#192c4e"/>
<stop offset="1" stop-color="#2a2550"/>
</linearGradient>
<filter id="soft-glow" x="-40%" y="-40%" width="180%" height="180%">
<feGaussianBlur stdDeviation="16"/>
</filter>
<style>
.sans { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; }
.mono { font-family: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace; }
.hero-star { animation: hero-star-float 4s ease-in-out infinite; }
.hero-star-main { transform-origin: 16px 14px; }
.hero-star-secondary { transform-origin: 38px 38px; animation-delay: 0.5s; }
@keyframes hero-star-float {
0% { transform: translateY(0) rotate(0deg); opacity: 0.9; }
50% { transform: translateY(-8px) rotate(10deg); opacity: 1; }
100% { transform: translateY(0) rotate(0deg); opacity: 0.9; }
}
@media (prefers-reduced-motion: reduce) { .hero-star { animation: none; } }
</style>
</defs>
<rect width="1200" height="400" rx="28" fill="url(#hero-bg)"/>
<circle cx="1112" cy="28" r="138" fill="#63c9f6" opacity="0.08" filter="url(#soft-glow)"/>
<circle cx="705" cy="392" r="120" fill="#b59cff" opacity="0.06" filter="url(#soft-glow)"/>
<g aria-hidden="true" fill="none" stroke-linecap="round">
<path d="M694 28H1154" stroke="#5f7192" stroke-opacity="0.28"/>
<path d="M694 372H1154" stroke="#5f7192" stroke-opacity="0.2"/>
<path d="M708 14V386" stroke="#5f7192" stroke-opacity="0.16"/>
<path d="M1140 14V386" stroke="#5f7192" stroke-opacity="0.16"/>
</g>
<g id="title-block" transform="translate(64 54)">
<text class="mono" x="0" y="0" fill="#8da1c0" font-size="14" letter-spacing="2.2">QQ INTEROPERABILITY · ONEBOT V11 · MULTI-ACCOUNT</text>
<text class="sans" x="0" y="92" font-size="74" font-weight="760" letter-spacing="-3">
<tspan fill="#f7fbff">Snow</tspan><tspan fill="#82d7ff">Luma</tspan>
</text>
<rect x="2" y="110" width="148" height="5" rx="2.5" fill="url(#brand-line)"/>
<text class="sans" x="0" y="162" fill="#dce7f7" font-size="27" font-weight="590">把 QQ 原生会话,稳定地桥接到</text>
<text class="sans" x="0" y="199" fill="#dce7f7" font-size="27" font-weight="590">OneBot、WebUI 与自动化工具。</text>
<text class="sans" x="0" y="244" fill="#92a6c5" font-size="16">一个运行时,管理多账号、动作调用、事件分发与实时状态。</text>
<g transform="translate(0 274)">
<rect width="128" height="34" rx="17" fill="#172942" stroke="#315173"/>
<circle cx="18" cy="17" r="4" fill="#75d2ff"/>
<text class="mono" x="31" y="22" fill="#b9dfff" font-size="13">Windows x64</text>
<g transform="translate(140 0)">
<rect width="174" height="34" rx="17" fill="#211f41" stroke="#4d4777"/>
<circle cx="18" cy="17" r="4" fill="#bba7ff"/>
<text class="mono" x="31" y="22" fill="#d8cdfd" font-size="13">Linux x64 / arm64</text>
</g>
<g transform="translate(326 0)">
<rect width="120" height="34" rx="17" fill="#302037" stroke="#68435c"/>
<circle cx="18" cy="17" r="4" fill="#f4bfd9"/>
<text class="mono" x="31" y="22" fill="#f7d7e6" font-size="13">TypeScript</text>
</g>
</g>
</g>
<g id="project-proof" transform="translate(734 58)">
<text class="mono" x="0" y="0" fill="#8398b8" font-size="13" letter-spacing="1.8">LIVE SESSION ROUTING</text>
<g transform="translate(0 24)">
<g>
<rect width="116" height="45" rx="12" fill="#12253d" stroke="#2d5274"/>
<circle cx="19" cy="17" r="5" fill="#74d2ff"/>
<text class="mono" x="31" y="21" fill="#c7e9fb" font-size="12">QQ · 01</text>
<text class="mono" x="16" y="36" fill="#7189a9" font-size="10">ONLINE</text>
</g>
<g transform="translate(132 0)">
<rect width="116" height="45" rx="12" fill="#1b2342" stroke="#4a4c78"/>
<circle cx="19" cy="17" r="5" fill="#bba7ff"/>
<text class="mono" x="31" y="21" fill="#ddd4ff" font-size="12">QQ · 02</text>
<text class="mono" x="16" y="36" fill="#8186ad" font-size="10">ONLINE</text>
</g>
<g transform="translate(264 0)">
<rect width="116" height="45" rx="12" fill="#292039" stroke="#67445d"/>
<circle cx="19" cy="17" r="5" fill="#f4bfd9"/>
<text class="mono" x="31" y="21" fill="#f8dbea" font-size="12">QQ · N</text>
<text class="mono" x="16" y="36" fill="#a17f95" font-size="10">READY</text>
</g>
</g>
<g aria-hidden="true" fill="none" stroke="url(#brand-line)" stroke-width="2" stroke-linecap="round" opacity="0.85">
<path d="M58 69V90C58 102 78 104 94 104H190"/>
<path d="M190 69V104"/>
<path d="M322 69V90C322 102 302 104 286 104H190"/>
</g>
<g transform="translate(0 104)">
<rect x="12" y="16" width="356" height="88" rx="18" fill="#0d1729" stroke="#263853" opacity="0.72"/>
<rect x="6" y="8" width="368" height="88" rx="18" fill="#111f35" stroke="#364865" opacity="0.88"/>
<rect width="380" height="88" rx="18" fill="url(#bridge-fill)" stroke="#6684ae" stroke-opacity="0.74"/>
<text class="mono" x="22" y="25" fill="#90a6c6" font-size="11" letter-spacing="1.4">SNOWLUMA RUNTIME</text>
<text class="sans" x="22" y="53" fill="#f4f8ff" font-size="20" font-weight="680">Protocol → Bridge → OneBot</text>
<text class="sans" x="22" y="74" fill="#93a8c7" font-size="13">独立会话 · 类型化动作 · 可追踪事件</text>
<g transform="translate(326 13)" aria-hidden="true">
<path class="hero-star hero-star-main" d="M16 0L19.5 10.5L30 14L19.5 17.5L16 28L12.5 17.5L2 14L12.5 10.5Z" fill="#c8b7ff"/>
<path class="hero-star hero-star-secondary" d="M38 30L40 36L46 38L40 40L38 46L36 40L30 38L36 36Z" fill="#f2c2da" opacity="0.9"/>
</g>
</g>
<g aria-hidden="true" fill="none" stroke="#6881a4" stroke-width="1.5" stroke-linecap="round">
<path d="M58 208V224"/>
<path d="M190 208V224"/>
<path d="M322 208V224"/>
</g>
<g transform="translate(0 224)">
<g>
<rect width="116" height="68" rx="15" fill="#10253b" stroke="#315d7c"/>
<text class="sans" x="58" y="29" fill="#bfe8fb" text-anchor="middle" font-size="15" font-weight="650">OneBot v11</text>
<text class="mono" x="58" y="50" fill="#6685a3" text-anchor="middle" font-size="10">ACTIONS · EVENTS</text>
</g>
<g transform="translate(132 0)">
<rect width="116" height="68" rx="15" fill="#201f42" stroke="#504d7a"/>
<text class="sans" x="58" y="29" fill="#ded5ff" text-anchor="middle" font-size="15" font-weight="650">WebUI</text>
<text class="mono" x="58" y="50" fill="#8483ad" text-anchor="middle" font-size="10">STATUS · LOGS</text>
</g>
<g transform="translate(264 0)">
<rect width="116" height="68" rx="15" fill="#2a2038" stroke="#65455e"/>
<text class="sans" x="58" y="29" fill="#f6d6e6" text-anchor="middle" font-size="15" font-weight="650">SDK / MCP</text>
<text class="mono" x="58" y="50" fill="#9d7e93" text-anchor="middle" font-size="10">TOOLS · STREAMS</text>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

+140
View File
@@ -0,0 +1,140 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="440" viewBox="0 0 1200 440" role="img" aria-labelledby="map-title map-desc">
<title id="map-title">SnowLuma 运行链路</title>
<desc id="map-desc">QQ 进程接入后,数据经过协议桥接、OneBot 标准化,再分发到 WebSocket、HTTP、WebUI、SDK 与 MCP。</desc>
<defs>
<linearGradient id="map-rule" x1="0" y1="0" x2="1" y2="0">
<stop offset="0" stop-color="#54bde9"/>
<stop offset="0.55" stop-color="#9e88ef"/>
<stop offset="1" stop-color="#e4a8c6"/>
</linearGradient>
<linearGradient id="consumer-border" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#54bde9"/>
<stop offset="0.5" stop-color="#9e88ef"/>
<stop offset="1" stop-color="#e4a8c6"/>
</linearGradient>
<linearGradient id="consumer-flow" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#a5e7ff"/>
<stop offset="0.5" stop-color="#d1c5ff"/>
<stop offset="1" stop-color="#ffd4e8"/>
</linearGradient>
<style>
.sans { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; }
.mono { font-family: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace; }
@media (prefers-reduced-motion: reduce) { .consumer-flow { display: none; } }
</style>
</defs>
<rect width="1200" height="440" rx="28" fill="#f6f9fd"/>
<rect x="0.75" y="0.75" width="1198.5" height="438.5" rx="27.25" fill="none" stroke="#cbd8e8" stroke-width="1.5"/>
<g transform="translate(54 42)">
<text class="mono" x="0" y="0" fill="#6e819b" font-size="13" letter-spacing="2">RUNTIME MAP · FROM SESSION TO CONSUMER</text>
<text class="sans" x="0" y="45" fill="#14223a" font-size="34" font-weight="720">一条事件如何穿过 SnowLuma</text>
<text class="sans" x="0" y="75" fill="#63758e" font-size="16">每层只承担一种职责,多个 QQ 账号各自拥有独立、可追踪的会话链路。</text>
</g>
<g id="connection-labels" class="mono" fill="#7c8ca2" font-size="10" letter-spacing="1.5" text-anchor="middle">
<text x="305" y="210">PIPE</text>
<text x="577" y="210">MAP</text>
<text x="849" y="210">OUT</text>
</g>
<g aria-hidden="true" fill="none" stroke="url(#map-rule)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M284 225H316L309 218M316 225L309 232"/>
<path d="M556 225H588L581 218M588 225L581 232"/>
<path d="M828 225H860L853 218M860 225L853 232"/>
</g>
<g id="stage-session" transform="translate(54 138)">
<rect width="230" height="218" rx="20" fill="#ffffff" stroke="#c9d8e8" stroke-width="1.5"/>
<path d="M20 0H210" fill="none" stroke="#54bde9" stroke-width="4" stroke-linecap="round"/>
<text class="mono" x="20" y="32" fill="#5582a0" font-size="11" letter-spacing="1.4">01 · 会话接入</text>
<g transform="translate(20 48)">
<rect width="190" height="54" rx="13" fill="#edf8fd" stroke="#afd9eb"/>
<circle cx="25" cy="19" r="5" fill="#47b7e6"/>
<circle cx="25" cy="35" r="5" fill="#92d8f3"/>
<text class="mono" x="42" y="23" fill="#315a77" font-size="11">QQ · ACCOUNT 01</text>
<text class="mono" x="42" y="39" fill="#6d92a8" font-size="11">QQ · ACCOUNT 02</text>
</g>
<text class="sans" x="115" y="132" fill="#15243a" font-size="20" font-weight="680" text-anchor="middle">多个 QQ 进程</text>
<text class="sans" x="115" y="158" fill="#687c95" font-size="14" text-anchor="middle">独立接入、独立登录状态</text>
<text class="sans" x="115" y="181" fill="#687c95" font-size="14" text-anchor="middle">每个账号单独路由</text>
</g>
<g id="stage-bridge" transform="translate(326 138)">
<rect width="230" height="218" rx="20" fill="#ffffff" stroke="#d0c9ed" stroke-width="1.5"/>
<path d="M20 0H210" fill="none" stroke="#9e88ef" stroke-width="4" stroke-linecap="round"/>
<text class="mono" x="20" y="32" fill="#7163aa" font-size="11" letter-spacing="1.4">02 · 协议桥接</text>
<g transform="translate(20 42)">
<rect x="10" y="14" width="170" height="48" rx="12" fill="#f2effd" stroke="#cfc5f2"/>
<rect x="5" y="7" width="180" height="48" rx="12" fill="#eeeafd" stroke="#c3b7ee"/>
<rect width="190" height="48" rx="12" fill="#e9e3fb" stroke="#b6a7e9"/>
<text class="mono" x="95" y="21" fill="#544584" text-anchor="middle" font-size="11">PACKET → EVENT</text>
<text class="mono" x="95" y="37" fill="#77699c" text-anchor="middle" font-size="10">PROTOCOL · BRIDGE</text>
</g>
<text class="sans" x="115" y="132" fill="#15243a" font-size="20" font-weight="680" text-anchor="middle">解析与身份映射</text>
<text class="sans" x="115" y="158" fill="#687c95" font-size="14" text-anchor="middle">协议数据转换为内部事件</text>
<text class="sans" x="115" y="181" fill="#687c95" font-size="14" text-anchor="middle">异常路径保留可观察信息</text>
</g>
<g id="stage-onebot" transform="translate(598 138)">
<rect width="230" height="218" rx="20" fill="#ffffff" stroke="#d9c8e1" stroke-width="1.5"/>
<path d="M20 0H210" fill="none" stroke="#cf9bc0" stroke-width="4" stroke-linecap="round"/>
<text class="mono" x="20" y="32" fill="#916382" font-size="11" letter-spacing="1.4">03 · 标准化</text>
<g transform="translate(20 49)">
<rect width="190" height="55" rx="13" fill="#faeff6" stroke="#e6bfd5"/>
<text class="sans" x="95" y="25" fill="#753e62" text-anchor="middle" font-size="17" font-weight="700">OneBot v11</text>
<text class="mono" x="95" y="42" fill="#a37792" text-anchor="middle" font-size="10">ACTIONS ↔ EVENTS</text>
</g>
<text class="sans" x="115" y="132" fill="#15243a" font-size="20" font-weight="680" text-anchor="middle">统一动作与事件</text>
<text class="sans" x="115" y="158" fill="#687c95" font-size="14" text-anchor="middle">参数校验、动作执行</text>
<text class="sans" x="115" y="181" fill="#687c95" font-size="14" text-anchor="middle">事件转换与消息存储</text>
</g>
<g id="stage-consumers" transform="translate(870 138)">
<rect x="2" y="2" width="272" height="214" rx="18" fill="#101a2d" stroke="url(#consumer-border)" stroke-width="4"/>
<rect class="consumer-flow" x="2" y="2" width="272" height="214" rx="18" fill="none" stroke="url(#consumer-flow)" stroke-width="5" stroke-linecap="round" stroke-dasharray="108 838" aria-hidden="true">
<animate attributeName="stroke-dashoffset" from="0" to="-946" dur="4.8s" repeatCount="indefinite"/>
</rect>
<text class="mono" x="20" y="32" fill="#91a5c2" font-size="11" letter-spacing="1.4">04 · 消费端</text>
<text class="sans" x="20" y="65" fill="#f2f7ff" font-size="20" font-weight="680">按场景自由组合</text>
<g class="mono" font-size="11" text-anchor="middle">
<g transform="translate(20 84)">
<rect width="70" height="32" rx="10" fill="#17304a" stroke="#315b7a"/>
<text x="35" y="21" fill="#bce8fb">WS</text>
</g>
<g transform="translate(102 84)">
<rect width="70" height="32" rx="10" fill="#242244" stroke="#514e7c"/>
<text x="35" y="21" fill="#ddd5ff">HTTP</text>
</g>
<g transform="translate(184 84)">
<rect width="70" height="32" rx="10" fill="#34233c" stroke="#67465e"/>
<text x="35" y="21" fill="#f6d9e7">WebUI</text>
</g>
<g transform="translate(20 128)">
<rect width="111" height="32" rx="10" fill="#182a43" stroke="#334f70"/>
<text x="55.5" y="21" fill="#c4def5">SDK</text>
</g>
<g transform="translate(143 128)">
<rect width="111" height="32" rx="10" fill="#2b2447" stroke="#554d7e"/>
<text x="55.5" y="21" fill="#dfd7ff">MCP</text>
</g>
</g>
<text class="sans" x="20" y="190" fill="#8196b5" font-size="13">多个适配器可同时启用</text>
</g>
<g transform="translate(54 392)">
<rect width="1092" height="1" fill="#d4dfeb"/>
<circle cx="5" cy="24" r="4" fill="#54bde9"/>
<text class="sans" x="18" y="29" fill="#60738c" font-size="14">一次接入,统一管理运行状态、日志、连接与动作调用。</text>
<text class="mono" x="1092" y="29" fill="#8191a6" text-anchor="end" font-size="11">SNOWLUMA / RUNTIME MAP</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.2 KiB