Add README, plugin citations, and multi-platform release CI.

Ship screenshots and third-party notices for the desktop shell, and
package Windows, macOS, deb, rpm, and Flatpak from GitHub Releases.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Tommy
2026-08-15 22:02:13 +08:00
commit f8a3c2dc6f
72 changed files with 10372 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 DeepSeek
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,22 @@
MIT License
Copyright (c) 2026 xiaobright
Portions Copyright (c) 2026 DeepSeek
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,14 @@
dsh-anchored-standard includes an adapted copy of the DeepSeek Harness
Standard agent preset from:
https://github.com/deepseek-ai/deepseek-harness
commit 47f943859bef60e4160492346772ded9b24f765a
DeepSeek Harness is distributed under the MIT License:
Copyright (c) 2026 DeepSeek
The full MIT permission notice is included in this repository's LICENSE file.
DeepSeek and DeepSeek Harness are names of their respective owner. This
community project is not affiliated with or endorsed by DeepSeek.

View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 Leon Liu (liustack)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

BIN
docs/screenshots/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
docs/screenshots/menu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
docs/screenshots/splash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

View File

@@ -0,0 +1,61 @@
:root { --dsh-desktop-titlebar-h: 36px; }
* { box-sizing: border-box; }
html, body { margin: 0; }
html.dsh-desktop-offset {
box-sizing: border-box;
padding-top: var(--dsh-desktop-titlebar-h);
}
#dsh-desktop-titlebar {
position: fixed; top: 0; left: 0; right: 0; height: var(--dsh-desktop-titlebar-h);
z-index: 2147483646; display: flex; align-items: center;
padding: 0 12px; box-sizing: border-box;
background: rgba(246, 246, 248, 0.92);
-webkit-backdrop-filter: saturate(180%) blur(20px);
backdrop-filter: saturate(180%) blur(20px);
border-bottom: 0.5px solid rgba(0, 0, 0, 0.06);
user-select: none;
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", system-ui, sans-serif;
}
#dsh-desktop-titlebar .traffic {
display: flex; gap: 8px; align-items: center; height: 100%;
}
#dsh-desktop-titlebar .tl {
width: 12px; height: 12px; min-width: 12px; min-height: 12px;
max-width: 12px; max-height: 12px; flex: none; overflow: hidden;
box-sizing: border-box; border-radius: 50%; border: 0;
padding: 0; margin: 0; display: grid; place-items: center; cursor: default;
position: relative;
}
#dsh-desktop-titlebar .tl.close { background: #ff5f57; }
#dsh-desktop-titlebar .tl.min { background: #febc2e; }
#dsh-desktop-titlebar .tl.zoom { background: #28c840; }
#dsh-desktop-titlebar .tl::after {
content: ""; font-size: 9px; line-height: 1; font-weight: 700;
color: rgba(0,0,0,0.55); opacity: 0;
}
#dsh-desktop-titlebar .traffic:hover .tl.close::after { content: "×"; opacity: 1; }
#dsh-desktop-titlebar .traffic:hover .tl.min::after { content: ""; opacity: 1; }
#dsh-desktop-titlebar .traffic:hover .tl.zoom::after { content: "+"; opacity: 1; }
#dsh-desktop-titlebar .drag { flex: 1; height: 100%; }
#dsh-desktop-titlebar .more {
appearance: none; border: 0; background: transparent;
color: rgba(0,0,0,0.35); font-size: 15px; letter-spacing: 0.08em;
width: 28px; height: 20px; border-radius: 6px; cursor: default;
}
#dsh-desktop-titlebar .more:hover,
#dsh-desktop-titlebar .more.open { background: rgba(0,0,0,0.06); color: rgba(0,0,0,0.7); }
#dsh-desktop-titlebar .menu {
position: absolute; top: calc(var(--dsh-desktop-titlebar-h) + 2px); left: 8px; min-width: 168px;
padding: 4px; border-radius: 10px;
background: rgba(255,255,255,0.96);
box-shadow: 0 8px 28px rgba(0,0,0,0.16);
display: none; flex-direction: column;
}
#dsh-desktop-titlebar .menu.open { display: flex; }
#dsh-desktop-titlebar .menu button {
appearance: none; border: 0; background: transparent;
text-align: left; padding: 7px 10px; border-radius: 6px;
font: 13px/1.3 -apple-system, BlinkMacSystemFont, "SF Pro Text", system-ui, sans-serif;
color: #1d1d1f; cursor: default;
}
#dsh-desktop-titlebar .menu button:hover { background: rgba(0,0,0,0.05); }

View File

@@ -0,0 +1,42 @@
<!doctype html>
<html lang="zh-CN" class="dsh-desktop-offset">
<head>
<meta charset="utf-8" />
<title>标题栏菜单</title>
<link rel="stylesheet" href="chrome.css" />
<link rel="stylesheet" href="../../../ui/styles.css" />
<style>
:root { color-scheme: light; --bg: #f5f5f7; --text: #1d1d1f; --muted: #86868b; }
html, body { width: 1280px; height: 800px; overflow: hidden; background: #f5f5f7; color: #1d1d1f; }
.stage { min-height: calc(800px - 36px); }
#dsh-desktop-titlebar .traffic:hover .tl.close::after,
#dsh-desktop-titlebar .traffic:hover .tl.min::after,
#dsh-desktop-titlebar .traffic:hover .tl.zoom::after { opacity: 1; }
#dsh-desktop-titlebar .tl.close::after { content: "×"; opacity: 1; }
#dsh-desktop-titlebar .tl.min::after { content: ""; opacity: 1; }
#dsh-desktop-titlebar .tl.zoom::after { content: "+"; opacity: 1; }
</style>
</head>
<body>
<header id="dsh-desktop-titlebar">
<button class="more open" type="button">•••</button>
<div class="menu open">
<button type="button">重新启动</button>
<button type="button">在浏览器中打开</button>
</div>
<div class="drag"></div>
<div class="traffic">
<button class="tl min"></button>
<button class="tl zoom"></button>
<button class="tl close"></button>
</div>
</header>
<main class="stage">
<section class="hero">
<img class="mark" src="../../../ui/icon.png" alt="" />
<h1>DeepSeek Harness</h1>
<p id="status">已连接到本地 dsh web</p>
</section>
</main>
</body>
</html>

View File

@@ -0,0 +1,135 @@
<!doctype html>
<html lang="zh-CN" class="dsh-desktop-offset">
<head>
<meta charset="utf-8" />
<title>新会话</title>
<link rel="stylesheet" href="chrome.css" />
<style>
:root {
--bg: #f6f6f8;
--sidebar: #efeff2;
--text: #1d1d1f;
--muted: #86868b;
--line: rgba(0,0,0,0.06);
--accent: #0071e3;
--card: #ffffff;
}
html, body {
margin: 0; width: 1280px; height: 800px; overflow: hidden;
background: var(--bg); color: var(--text);
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "Noto Sans SC", system-ui, sans-serif;
-webkit-font-smoothing: antialiased;
}
.shell {
display: grid;
grid-template-columns: 248px 1fr;
height: calc(800px - 36px);
}
.sidebar {
background: var(--sidebar);
border-right: 0.5px solid var(--line);
padding: 16px 12px 18px;
display: flex; flex-direction: column; gap: 14px;
}
.brand {
display: flex; align-items: center; gap: 10px;
padding: 4px 8px 8px;
font-weight: 600; font-size: 13px;
}
.brand img { width: 22px; height: 22px; border-radius: 6px; }
.new-session {
height: 34px; border: 0; border-radius: 10px;
background: var(--card); color: var(--text);
font: 600 13px/1 inherit; box-shadow: 0 1px 2px rgba(0,0,0,0.04);
display: flex; align-items: center; justify-content: center; gap: 6px;
}
.section-label {
margin: 8px 8px 4px; font-size: 11px; color: var(--muted); letter-spacing: 0.04em;
}
.session {
padding: 8px 10px; border-radius: 8px; font-size: 13px;
background: rgba(255,255,255,0.7);
}
.session small { display: block; color: var(--muted); font-size: 11px; margin-top: 2px; }
.main {
display: flex; flex-direction: column; min-width: 0;
background: var(--bg);
}
.hero {
flex: 1; display: flex; flex-direction: column;
align-items: center; justify-content: center; gap: 10px;
padding-bottom: 40px;
}
.hero .mark {
width: 56px; height: 56px; border-radius: 14px; margin-bottom: 8px;
}
.hero h1 { margin: 0; font-size: 28px; font-weight: 600; letter-spacing: -0.03em; }
.badge {
font-size: 11px; color: var(--muted); background: rgba(0,0,0,0.04);
padding: 2px 8px; border-radius: 999px;
}
.hint { color: var(--muted); font-size: 13px; margin: 0; }
.composer {
margin: 0 28px 22px; background: var(--card);
border: 0.5px solid var(--line); border-radius: 16px;
min-height: 92px; padding: 14px 16px 12px;
display: flex; flex-direction: column; justify-content: space-between;
box-shadow: 0 8px 28px rgba(0,0,0,0.04);
}
.placeholder { color: #aeaeb2; font-size: 14px; }
.tools { display: flex; justify-content: space-between; align-items: center; }
.chips { display: flex; gap: 8px; color: var(--muted); font-size: 12px; }
.chip {
border: 0.5px solid var(--line); border-radius: 999px; padding: 4px 10px; background: #fff;
}
.send {
width: 28px; height: 28px; border-radius: 50%; background: var(--accent); color: #fff;
display: grid; place-items: center; font-size: 14px;
}
</style>
</head>
<body>
<header id="dsh-desktop-titlebar">
<button class="more" type="button">•••</button>
<div class="menu"></div>
<div class="drag"></div>
<div class="traffic">
<button class="tl min"></button>
<button class="tl zoom"></button>
<button class="tl close"></button>
</div>
</header>
<div class="shell">
<aside class="sidebar">
<div class="brand">
<img src="../../../ui/icon.png" alt="" />
DeepSeek Harness
</div>
<div class="new-session"> 新会话</div>
<div class="section-label">工作区</div>
<div class="session">
新会话
<small>锚定式标准(实验)</small>
</div>
</aside>
<section class="main">
<div class="hero">
<img class="mark" src="../../../ui/icon.png" alt="" />
<h1>探索未至之境</h1>
<span class="badge">预览版</span>
<p class="hint">官方 WebUI 运行在原生窗口中,凭据仍保存在 ~/.dsh</p>
</div>
<div class="composer">
<div class="placeholder">给 Harness 发送消息</div>
<div class="tools">
<div class="chips">
<span class="chip">锚定式标准(实验)</span>
<span class="chip">工作区</span>
</div>
<div class="send"></div>
</div>
</div>
</section>
</div>
</body>
</html>

View File

@@ -0,0 +1,34 @@
<!doctype html>
<html lang="zh-CN" class="dsh-desktop-offset">
<head>
<meta charset="utf-8" />
<title>启动页</title>
<link rel="stylesheet" href="../../../ui/styles.css" />
<link rel="stylesheet" href="chrome.css" />
<style>
:root { color-scheme: light; --bg: #f5f5f7; --text: #1d1d1f; --muted: #86868b; }
html, body { width: 1280px; height: 800px; overflow: hidden; background: #f5f5f7; color: #1d1d1f; }
.stage { min-height: calc(800px - 36px); padding-top: 48px; }
</style>
</head>
<body>
<header id="dsh-desktop-titlebar">
<button class="more" type="button">•••</button>
<div class="menu"></div>
<div class="drag"></div>
<div class="traffic">
<button class="tl min"></button>
<button class="tl zoom"></button>
<button class="tl close"></button>
</div>
</header>
<main class="stage">
<section class="hero">
<img class="mark" src="../../../ui/icon.png" alt="" />
<h1>DeepSeek Harness</h1>
<p id="status">正在启动官方 WebUI…</p>
<div class="ring" aria-hidden="true"></div>
</section>
</main>
</body>
</html>

View File

@@ -0,0 +1,115 @@
<!doctype html>
<html lang="zh-CN" class="dsh-desktop-offset">
<head>
<meta charset="utf-8" />
<title>视觉模型</title>
<link rel="stylesheet" href="chrome.css" />
<style>
:root {
--bg: #f6f6f8;
--sidebar: #efeff2;
--text: #1d1d1f;
--muted: #86868b;
--line: rgba(0,0,0,0.08);
--accent: #0071e3;
--card: #ffffff;
--ok: #248a3d;
}
html, body {
margin: 0; width: 1280px; height: 800px; overflow: hidden;
background: var(--bg); color: var(--text);
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "Noto Sans SC", system-ui, sans-serif;
-webkit-font-smoothing: antialiased;
}
.shell {
display: grid;
grid-template-columns: 220px 1fr;
height: calc(800px - 36px);
}
.nav {
background: var(--sidebar);
border-right: 0.5px solid var(--line);
padding: 22px 12px;
}
.nav h2 { margin: 0 10px 16px; font-size: 18px; font-weight: 600; }
.nav a {
display: block; padding: 8px 12px; border-radius: 8px;
color: var(--text); text-decoration: none; font-size: 13px;
}
.nav a.active { background: #fff; font-weight: 600; }
.nav a.muted { color: var(--muted); }
.content { padding: 28px 40px; overflow: hidden; }
.content h1 { margin: 0 0 6px; font-size: 22px; font-weight: 600; }
.lead { margin: 0 0 22px; color: var(--muted); font-size: 13px; }
.dshdv { width: 100%; max-width: 640px; display: flex; flex-direction: column; gap: 14px; }
.dshdv h3 { margin: 0; font-size: 15px; font-weight: 600; line-height: 22px; }
.dshdv p { margin: 0; color: var(--muted); font-size: 13px; line-height: 20px; }
.dshdv label { display: flex; flex-direction: column; gap: 6px; font-size: 12px; color: #6e6e73; }
.dshdv .head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.dshdv a { color: var(--accent); text-decoration: none; font-size: 12px; }
.dshdv input, .dshdv select {
height: 36px; border: 1px solid var(--line); background: var(--card);
color: var(--text); border-radius: 8px; padding: 0 12px; font: inherit;
}
.dshdv button {
align-self: flex-start; height: 32px; padding: 0 14px; border: 0;
border-radius: 8px; background: var(--accent); color: #fff; font: inherit;
}
.dshdv .ok { color: var(--ok); }
</style>
</head>
<body>
<header id="dsh-desktop-titlebar">
<button class="more" type="button">•••</button>
<div class="menu"></div>
<div class="drag"></div>
<div class="traffic">
<button class="tl min"></button>
<button class="tl zoom"></button>
<button class="tl close"></button>
</div>
</header>
<div class="shell">
<nav class="nav">
<h2>设置</h2>
<a class="muted" href="#">通用</a>
<a class="muted" href="#">模型</a>
<a class="active" href="#">视觉模型</a>
<a class="muted" href="#">插件</a>
<a class="muted" href="#">技能</a>
</nav>
<section class="content">
<h1>视觉模型</h1>
<p class="lead">内置插件 dsh-desktop-vision · 写入 ~/.modlens/config.json</p>
<div class="dshdv">
<h3>ModLens 视觉模型</h3>
<p>纯文本对话模型读图时使用这里的引擎。已声明视觉能力的模型(如 Qwen不会走这条桥。</p>
<label>
引擎
<select>
<option selected>OpenAI 兼容</option>
<option>Gemini API</option>
<option>Anthropic</option>
<option>Antigravity CLI</option>
<option>Claude CLI</option>
</select>
</label>
<label>
接口地址
<input value="https://api.openai.com/v1" />
</label>
<label>
<span class="head">API 密钥 <a href="#">获取 API</a></span>
<input type="password" value="sk-••••••••••••••••" />
</label>
<label>
视觉模型
<input value="" placeholder="例如 gpt-4o" />
</label>
<button type="button">保存</button>
<p class="ok">已保存</p>
</div>
</section>
</div>
</body>
</html>

BIN
docs/screenshots/vision.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB