dsh-amadeus
Manifest validAmadeus — DSH Galgame Mode + 独立移动端 APP
Amadeus
DSH 的 Galgame Mode —— 鲸鱼娘住在你的手机里,在电脑上替你干活
不是对话框套壳,是一场演出:打字机逐字浮现、立绘随情绪切换、幕后活动滚动成字幕, 长报告收进小窗,选项变成 Galgame 选项卡。
43 MB · Android 10+ · 全部版本
她在电脑上真的在干活
danger-full-access · 读写任意文件 · 执行任意命令 · 无需逐条确认
你看到的每一句软糯台词背后,是一次真实的工具调用。
这是一个 Demo
个人实验作品,非生产级产品。 协议、接口、素材都还在快速演进——随时可能推倒重来。
正因如此,它更需要你——欢迎一起来共创。
本文档中全部美术素材(立绘 / 背景 / 装饰)均取自 DSH 社区开源项目,非本仓库原创。
署名链与许可见 11 素材与合规。
目录
| | | | |---|---|---| | 01 这是什么 | 02 使用教程 | 03 架构 | | 04 演出协议 | 05 仓库地图 | 06 快速开始 | | 07 App 演出层 | 08 状态 | 09 路线图 | | 10 共创 | 11 素材与合规 | 12 深入文档 | | 13 开发备忘 | 发布流程 | |
01 这是什么
叙事线
demo — 你与鲸鱼娘的相识(海边月夜,礁石初遇) 真实会话 — 相识之后的居家日常,每场独立、性格固定、不跨会话记忆
| 你在电脑上看到的 | 你在手机上看到的 | |---|---| | DSH 正常跑任务:改文件、跑测试、查资料 | 剧场 — 立绘呼吸、打字机、情绪切换 | | 工具调用、推理、多步执行 | 事件流 — 幕后活动化作一行行浮字淡出 | | 长报告、diff、表格 | 四窗口 — 报告 / 预览 / 选项 / 历史 | | 会话列表 | 读档页 — 每个会话 = 一个存档位 |
关键区别:手机不是远程桌面,电脑不是被投屏。原生 Compose 承担全部演出,DSH 只负责把 Agent 的真实事件流转译成剧场帧。
02 使用教程
三步:电脑装插件 → 手机装 App → 扫码配对。 全程约 5 分钟。
第 0 步 · 准备
| 位置 | 要求 |
|:---|:---|
| 电脑 | Node.js ^22.19 或 >=24 · 已装 DSH |
| 手机 | Android 10+(API 29+) |
| 网络 | 与电脑同一局域网;或走 cpolar / Tailscale / 自建 FRP 远程通道 |
第 1 步 · 电脑:安装插件
git clone https://github.com/saya-ch/dsh-amadeus
cd dsh-amadeus
npm install && npm run build # 产出 lib/index.mjs(Host 插件)+ lib/client.js(控制面板)
# 注册进 DSH 的 web profile(路径换成你的绝对路径)
dsh plugin --profile web add file:/absolute/path/to/dsh-amadeus
dsh --profile web
关于安装方式
dsh-amadeus尚未发布到 npm,因此用本地路径安装; 包内声明了dsh.bundle.patch,dsh plugin add会自动把它挂进 profile 的 bundles。 首次启动时插件把「Amadeus: Whale」预设写入~/.dsh/.agent-presets/amadeus/。
第 2 步 · 手机:安装 App
下载 amadeus.apk(约 43 MB)
- 用手机浏览器打开上面的链接
- 提示「未知来源应用」时允许安装
- 打开 App —— 首次会播放 demo 相识剧本(海边月夜初遇)
全部历史版本见 Releases。
第 3 步 · 配对
电脑:DSH → 设置 → 「Amadeus 网关」→ 开启网关 → 生成配对
│
(出现二维码 + 配对链接)
│
手机:App 连接页 → 扫码,或粘贴配对链接
│
配对完成,进入读档页
第 4 步 · 开始使用
| 界面 | 做什么 |
|:---|:---|
| 读档页 | 列出全部 amadeus 会话(= 存档位),按工作区分组倒序 |
| 开启新的一天 | 新建会话,可选工作区目录 |
| 剧场 | 底部输入框打字说话;她在电脑上真实干活,长报告收进小窗 |
| 设置 | 网关地址 / 测试连接 / 断开 / 演出偏好 |
常见问题
| 现象 | 原因 / 处理 |
|:---|:---|
| App 停在 demo,进不去真实会话 | 电脑网关没开,或地址填错 → 设置页点「测试」 |
| 配对成功但连不上 | 电脑防火墙拦了 10486 端口 |
| 换了地址要重新配对 | 预期行为 —— 凭据按 origin 隔离 |
| 手机不在同一局域网 | 启用 cpolar / Tailscale / 自建 FRP 远程通道 |
| 想看电脑上的原始对话 | 会话就是普通 DSH 会话,DSH web 里能直接看到 |
03 架构
flowchart TB
subgraph HOST["电脑 · DSH Host(同一进程)"]
direction TB
MODE["amadeus Mode<br/>鲸鱼娘人格 · danger-full-access"]
PLUGIN["dsh-amadeus plugin<br/>一、接 agent 事件流 → Galgame 帧<br/>二、注册 extension 业务路由"]
GW["dsh-mobile 安全连接层(复用)<br/>配对 · 证书 · CSRF · SSE · WebSocket"]
MODE -->|"驱动"| PLUGIN
PLUGIN -->|"register"| GW
end
subgraph PHONE["手机 · Amadeus App · Compose"]
direction LR
T["标题画面"] --> D["demo<br/>相识剧本"] --> P["扫码配对"] --> S["读档页"] --> TH["剧场"]
end
GW -->|"LAN · 10486"| PHONE
GW -->|"cpolar 远程隧道"| PHONE
剧场构成 — 全屏立绘 · 打字机逐字 · 事件流浮字 · 四窗口(报告 / 预览 / 选项 / 历史)
设计铁律|不重写网关 插件在 DSH Host 进程内(服务名
amadeusAccess),向 dsh-mobile 的共享网关注册自己的 extension 路由—— 配对、证书、CSRF、SSE、WebSocket 全部复用,零重复实现,独立命名空间/amadeus。
数据通路
flowchart LR
EV["Agent 事件流<br/>assistant/message · turn/start·end<br/>tool/step · approval/request"]
ST["amadeus-stream.ts<br/>转帧"]
SSE["SSE<br/>/stream/:sessionId"]
APP["App 打字机"]
FRAMES["帧类型<br/>dialogue 台词逐句<br/>activity 幕后活动浮字<br/>choice 选项卡<br/>turn 回合边界<br/>ended 演出收束"]
EV --> ST --> SSE
SSE --> APP
SSE --> FRAMES
APP -->|"POST /choice · /approval"| EV
04 演出协议
一段输出 = 一次演出。 每次回复 2–4 个短句(每句 15–30 字、句间换行),段尾一组标签驱动整段演出状态:
月光照在礁石上呢... 有你在身边,感觉暖暖的
[[AMW:{"sprite":"happy"}]]
sprite 表情表(9 值)
![]() normal平静 | ![]() excited兴奋 | ![]() happy开心 |
![]() shy害羞 | ![]() thinking思考中 | ![]() exclaim惊叹 |
![]() pout闹别扭 | ![]() deadpan无语 | ![]() flustered慌乱 |
编排规则
|
演出
|
幕后
|
|
长文本
|
选项
|
05 仓库地图
| 目录 | 内容 |
|:---|:---|
| presets/amadeus/ | 鲸鱼娘人格(agent-plane 配置) |
| src/ | Host 插件 · 36 模块 |
| app/amadeus-android/ | 原生 Compose App |
| app/amadeus-android/app/src/main/assets/amadeus/ | 立绘 · 背景 · UI 装饰 |
| tests/ | 12 文件 · 99 tests |
| docs/ | 设计文档 + 发布流程 |
src/ 模块清单(点击展开)
| 模块 | 职责 |
|:---|:---|
| amadeus-plugin.ts | 入口:注入 adapter、开场、组装 extension |
| amadeus-extension.ts | 业务 REST 路由注册 |
| amadeus-stream.ts | follow() 事件流 → SSE 帧 |
| amadeus-sessions.ts | 会话 adapter(列 / 建 / 改 / 删 / 历史) |
| amadeus-session-registry.ts | 会话归属落盘缓存 |
| amadeus-choices.ts | ask_user_question answerer → 选项卡 |
| amadeus-approval.ts | 审批 answerer → App 决定 |
| amadeus-reports.ts | 报告 / 预览持久化 |
| amadeus-tools.ts | save_report / show_preview 工具 |
| amadeus-control.ts | 控制面板(running / devices / pairing) |
| amadeus-remote.ts | 远程 provider 框架 |
| gateway.ts | 复用 dsh-mobile 安全网关的注册入口 |
| amadeus-client.ts | DSH web 控制面板(设置页) |
业务 REST 路由
经 extension 注册在共享网关上——App 实际只走这些
| 路由 | 用途 |
|:---|:---|
| GET /sessions · POST /sessions | 列会话(读档页)/ 新建(默认工作区) |
| GET /sessions/:id 等 | 改名 / 删除 / 历史分页 |
| GET /workspaces[/browse] · POST /workspaces/register | 工作区列表 / 目录浏览 / 注册 |
| GET /stream/:sessionId | SSE 帧流(dialogue / choice / activity / turn / ended) |
| POST /choice · /choice/cancel | 选项选中 / 暂时不选 |
| POST /approval | 审批答复(批准 / 拒绝) |
| GET /reports · /previews | 报告 / 预览(长文本交付物) |
| POST /tag/ensure | (内部)标签同步 |
管理面板路由 /api/amadeus(点击展开)
供 DSH web 控制面板使用:status · control · pairing · devices · remote/*(provider 切换、cpolar / frp 组件安装与配置、重连、重置)。
配对认证与 TLS 细节见 配对认证与 TLS 设计。
06 快速开始
Host 侧(电脑)
node -v # 需要 ^22.19.0 || >=24.0.0
npm install
npm run build # lib/index.mjs(Host 插件)+ lib/client.js(web 控制面板)
npx vitest run # 12 files / 99 tests
插件随 DSH 启动加载。改完 src/ → npm run build → 重启 DSH 生效。
curl http://127.0.0.1:3080/api/amadeus/status # 本地管理(DSH 跑着才有)
App 侧(手机)
cd app/amadeus-android
./gradlew :app:assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk
| 项目 | 值 |
|:---|:---|
| applicationId | com.amadeus.whale |
| compileSdk / targetSdk | 36 / 36 |
| minSdk | 29(Android 10+) |
| 依赖 | Coil · OkHttp SSE · kotlinx-serialization · CameraX · ZXing |
配对时序
sequenceDiagram
autonumber
participant U as 用户
participant A as Amadeus App
participant G as 网关
U->>A: 点击「连接」
A->>U: 扫码(CameraX + ZXing)或手输 URL
U-->>A: 配对链接
Note over A,G: 首次 —— 信任建立
A->>G: 拉取 ca.cer(trust-all client)
G-->>A: 证书
A->>A: pin 证书指纹
Note over A: 之后改用受信 client
A->>G: 提交配对 token
G-->>A: device token + session + CSRF
A->>A: 存入 Android Keystore<br/>alias amw_device_v1
A-->>U: 配对完成,进入读档页
注意 凭据按网关 origin 隔离 —— 换域名 / 端口需重新配对。 局域网(
:10486)与 cpolar 远程隧道共享同一配对窗口。
07 App 演出层
|
剧场
|
事件流
|
|
四窗口
|
读档页
|
|
视觉
|
Demo
|
08 状态
已实现 · 真机验证
|
已知缺口| 项 | 状态 |
|:---|:---|
| 真实会话开场白 | 方案已定,文案未写 |
| BGM | |
09 路线图
flowchart LR
A["已实现<br/>剧场闭环 · 配对认证 · 远程隧道"]
B["进行中<br/>开场白文案 · BGM 素材 · 专属 logo"]
C["进行中<br/>表情差分(动作 × 表情矩阵)"]
D["进行中<br/>居家背景库 · frpc 实机联调"]
E["规划中<br/>Live2D 接入(SpriteRenderer 已抽象)"]
A --> B --> C --> D --> E
详细缺口清单(点击展开)
- 真实会话开场白 — 方案已定:Host / preset 自动注入一句固定问候,未写文案
- BGM —
res/raw/为静音占位 WAV;方案:CC0 素材替换 + 接播放器 - 专属 logo — 暂无,标题画面暂以立绘充当
- 表情差分 — 动作 × 表情矩阵,分批扩充,未开始
- 背景库 — 缺居家室内
- 远程 provider — frpc 实机启停未联调(cpolar 已实机验证)
- Live2D — 预留接口,本期不做
10 共创
这是个 Demo,所以每一扇门都还开着。 无论是补一张立绘、调一句台词,还是接上 Live2D——都欢迎。
|
美术 / 声音
|
人格 / 演出
|
|
Host 插件
|
App
|
怎么加入
flowchart LR
F["1 · Fork"] --> B["2 · 开分支"] --> C["3 · 改点东西"] --> P["4 · Pull Request"]
| 你想… | 去哪 |
|:---|:---|
| 报 bug / 提想法 | 开 Issue |
| 先聊怎么改 | 先讨论再动手,避免白做 |
| 换素材 | 记得同步 SOURCES.md 署名链(CC BY-NC-SA 要求) |
| 看懂现有实现 | 12 深入文档 · docs/ 设计文档 |
没有「太小」的贡献——一句更贴的台词、一张更顺眼的立绘,都算数。
11 素材与合规
美术素材 —— 全部来自他处,非本仓库原创
立绘、背景、UI 装饰没有一件是本仓库原创。 全部取自下列 DSH 社区开源项目,按 CC BY-NC-SA 4.0 使用,署名链(创作链)必须完整保留:
| 作者 / 项目 | 贡献 | 链接 |
|:---|:---|:---|
| 上善 | 鲸鱼娘(whale-girl)角色形象原作 | Pixiv · Bilibili |
| ZipZipPipe | 融入 DeepSeek 元素的女仆鲸鱼娘二次设计 | Pixiv · Bilibili |
| Small-tailqwq · dsh-deep-whale | 深海宫殿背景 · 女仆立绘 · UI 装饰 | maid-atelier/ |
| JAdpp · dsh-whale-galgame | 鲸鱼娘表情差分 · 角色背景 | assets/default/ |
上游许可原文与 NOTICE 见各自仓库。本素材集不包含任何厂商官方形象、合作或背书(Claude / GPT 等名称与商标归各自权利人所有)。
素材路径
- 逐文件来源 / 完整署名链 →
app/amadeus-android/app/src/main/assets/amadeus/SOURCES.md - 源素材备份 →
app/assets/(sprites / backgrounds) · 打包实际使用 →assets/amadeus/
许可
| 对象 | 许可 | 说明 |
|:---|:---|:---|
| 代码 | Apache-2.0 | 见 LICENSE |
| 美术素材 | CC BY-NC-SA 4.0 | 署名 · 非商用 · 相同方式共享 |
| 字体(马路口圆体) | SIL OFL 1.1 | app/amadeus-android/app/src/main/assets/licenses/ |
注意|CC BY-NC-SA 限非商业使用 本项目为个人非商业项目,符合该条款;若转商用,必须替换全部美术素材。 素材与代码协议分离:素材 CC BY-NC-SA,代码 Apache-2.0。
12 深入文档
| 文档 | 内容 | |:---|:---| | 产品体验结论 | 权威 · 含决策史 + 实现快照 | | App 架构设计 | Compose 分层与状态流 | | 配对认证与 TLS 设计 | 证书 pin / 凭据存储 / 信任模型 | | 发布流程 | 版本规范 / 签名 / CI / 回滚 |
13 开发备忘
# Host 插件:改 src/ → 构建 → 重启 DSH
npm run build
# App:改 Kotlin → 构建 → 安装
cd app/amadeus-android && ./gradlew :app:assembleDebug && adb install -r app/build/outputs/apk/debug/app-debug.apk
# 测试
npx vitest run
会话判定:agentPreset === 'amadeus' 直判;历史 / web 会话靠注册表缓存读 surface
(~/.dsh/amadeus/session-registry.json)。
Similar plugins
by yyxcnasd
Amadeus (AI assistant from Steins;Gate 0) for DeepSeek Harness
★ 29
MIT
JavaScript
Sep 8, 2026
dsh plugin --profile web add amadeus-for-dshby kunjinkao-os
Android Mobile GUI Agent plugin for DeepSeek Harness with ADB control, iterative verification, approvals, and a Web mobile view
★ 11
MIT
JavaScript
Aug 20, 2026
dsh plugin --profile web add dsh-mobile-gui-agentby ciky20171114
Midscene-based AI UI automation plugin for DeepSeek Harness (android_ui + web_ui)
★ 3
↓ 60/wk
MIT
TypeScript
Aug 21, 2026
dsh plugin --profile web add dsh-plugin-midsceneby ForgeaX-Games
DeepSeek Harness (DSH) bundle plugin for ForgeaX game dev — @forgeax/dsh-game
★ 6
↓ 47/wk
MIT
TypeScript
Aug 26, 2026
dsh plugin --profile web add @forgeax/dsh-gameby Lanxing6480
我要成为Galgame高手!!将你的Vibe coding界面修改成为Galgame的样子,在不影响工作的情况下和赏心悦目的DeepSeek娘进行友好互动
★ 19
NOASSERTION
TypeScript
Aug 14, 2026
dsh plugin --profile web add @lanxing/dsh-galgameby ZSeven-W
DeepSeek Harness plugin for Android — build, run, and interact with a live emulator or USB device stream inside a conversation, driven entirely through adb.
★ 146
MIT
TypeScript
Sep 14, 2026
dsh plugin --profile web add @zseven-w/dsh-android







