Adds a visual novel-style dialogue view and visual scene editor to DSH Web GUI session pages. Runs entirely client-side with scene data stored in the browser.
- Language
- JavaScript
- License
- MIT
- Branch
- main
Install
$ dsh plugin --profile web add github:Ayase34/gal-viewRun the command above in your terminal to install this plugin via the dsh CLI. You can switch Profile in the top-right corner. New to dsh? Read the beginner tutorial
One-line Description
Adds a "GAL View" tab to the conversation page of DSH Web GUI, turning the dialogue area into a draggable, image-switchable Galgame stage with a built-in visual scene editor for instant image, dialogue, and layer modifications.
Core Features
- Inserts the "GAL View" tab between "Conversation" and "Trace" tabs in the conversation tab bar (tab order determined by
order: 5) - Renders dialogue in 16:9 stage format: background, character sprites, large dialogue box, typewriter-style text, player input, and four preset function buttons (history/auto/skip/settings)
- Built-in visual editor: drag to move, resize/align/color/font/layer order adjustments, supports undo/redo (up to 100 history steps)
- Import image and font asset libraries, single image max 8 MB, single font max 24 MB, exceeding limits or mismatched types are automatically skipped
- Export current scene along with referenced assets/fonts as JSON via
Ctrl+S, can import in edit mode or one-click reset to default preset - Each conversation independently saves reading progress (current line, page number, typing progress), can resume after switching tabs or refreshing
Technical Implementation
- Language: JavaScript (Node half ESM) + JSX (client half, classic React.createElement transformation)
- Key Dependencies: Only esbuild (devDependency, used to bundle
client/source intoclient.js); runtime has no npm dependencies,reactis external and shares the same instance with the host renderer - Architecture Pattern: Official bundle plugin——
cordis.patch.ymlmounts a layergal-viewon the web composition layer (Node half minimal, no host behavior),package.json#dsh.clientdeclares client kernel composition into the page; view layer registers to the conversation view slot viaslots.inject('conversation.view'), order 5 falls between "Conversation" (0) and "Trace" (10) - Entry Files:
.dsh-plugin/index.mjs(Node half, no side effects) +.dsh-plugin/client/index.mjs(browser half actual logic) + build artifact.dsh-plugin/client.js
Use Cases
Players and creators who want to present AI conversations in Galgame visual novel style within DSH's conversation page. Suitable for customizing conversations with dedicated character sprites/backgrounds/fonts, or using dialogues as interactive story material for screenshots, demos, live streams—localized assets run entirely in the browser, no backend support needed.
Prerequisites & Compatibility
| Dependency | Min Version | Description |
|---|---|---|
| DSH | Not declared | Plugin doesn't declare dsh version constraint in package.json, must execute "restart web" after installation for bundle layer to recompose |
| Node | Not declared | package.json has no engines field; build script esbuild --target=es2020, requires modern Node version supporting ESM |
| Platform | Cross-platform | Runs entirely in browser half (Web GUI), OS independent |
| Native Modules | None | No dependency on node-pty / node:sqlite or other native extensions |
Installation
dsh plugin --profile web add github:Ayase34/gal-view
Configuration
This plugin has no traditional user-facing "configuration form"; the only controllable option is the toggle itself.
| Config | Type | Description | Default |
|---|---|---|---|
| GAL View Tab Visibility | Toggle | Can be turned off/on in Web GUI "Settings → Plugins → GAL View"; after disabling, the "GAL View" tab disappears from conversation tab bar, scene data is preserved | Enabled |
FAQ
Q: Installed plugin but don't see "GAL View" tab on conversation page?
A: Bundle layer composes at web startup, must restart web to load plugin; can run dsh --profile web --dump-config, output should show # == gal-view layer.
Q: Where are scene layouts, imported images and reading progress stored?
A: All stored in browser local——scene JSON goes to localStorage, image/font binary goes to IndexedDB; reinstallation or uninstallation won't lose data, only clearing browser site data will reset.
Q: Can edit mode drag? Supports undo/redo?
A: Edit mode supports dragging, attribute modification, layer switching (move up/down/to top/to bottom); undo/redo based on stack implementation, keeps up to 100 history steps; can export current scene along with referenced assets/fonts as JSON via Ctrl+S.
Q: Will reinstalling plugin clear my scenes?
A: No. Scene data is stored in browser local, decoupled from plugin lifecycle; uninstallation or reinstallation won't lose data, only clearing browser site data will reset.
Q: Any size limits for importing images or fonts?
A: Single image max 8 MB, exceeded will be skipped; single font max 24 MB, exceeded or non-font types will be skipped. Skipped files won't interrupt batch import.
Q: What default scene is included? Where does the content seen on first open come from?
A: gal-scene.json in repository root is the default preset scene distributed with the plugin, includes embedded referenced images and fonts; auto-loads this preset when opening for first time with no local archive, "Reset" in edit mode also returns to this preset.
Q: How to completely uninstall and restore to original state?
A: Execute dsh plugin --profile web remove gal-view then restart web; scene data stays in browser local (doesn't affect uninstallation itself), to completely clear then clear browser site data.
Getting Started Difficulty
Beginner — one command to install, takes effect after restart; edit mode is WYSIWYG, no code writing needed; to customize preset can export JSON then replace repository root gal-scene.json and repackage.
Known Issues & Limitations
- Single image asset limit 8 MB (
MAX_ASSET_BYTESinassets.mjs), single font limit 24 MB (MAX_FONT_BYTESinfonts.mjs), exceeding or non-matching MIME types are silently skipped, no error dialog - Edit mode undo/redo stack keeps max 100 steps (
HISTORY_LIMITinindex.mjs), earlier history discarded after limit - Browser localStorage/IndexedDB quota limits vary by browser and device, importing large amounts of HD assets may trigger persistence failure (code silently ignores with
try/catch, no quota warning UI) - Browser privacy mode swallows exceptions on localStorage read/write, reading progress resets to initial state after refresh
- Editor history menu and "rectangle/circle/decoration" legacy element types only for compatibility display, new menus removed, only nine current types retained: background/character/dialogue/dialogue-text/speaker-name/text/image/button/action-button
English | 中文
DSH Web GUI 会话页的 Galgame 风格对话视图 + 场景元素可视化编辑器(官方 bundle 插件格式)。
在会话标签页栏(「对话」/「轨迹」)中间加入 「GAL视窗」 标签,点开之后会话视窗变成 16:9 Galgame 舞台:占位立绘、大对话框、打字机台词、玩家输入;内置「编辑模式」可像场景 编辑器一样拖拽/改属性/换图层,编辑结果实时同步回游戏模式。

默认预设
仓库根 gal-scene.json 是随包分发的默认预设场景(编辑器导出的格式,内嵌被引用的图片/字体):首次打开「GAL视窗」且本地没有存档场景时自动加载,编辑模式的「重置」也回到该预设。更新预设:编辑场景 → Ctrl+S 导出 → 用导出的 gal-scene.json 替换仓库根同名文件 → npm run build:client 并提交。
安装
本插件以官方 bundle 格式分发,用一条 dsh plugin 命令安装到 web profile,装完重启 web 即可生效。
前置条件
- 已安装 DeepSeek Harness,并且能在终端执行 dsh 命令
- 如果你是从源码 checkout 运行 Harness(日常命令是 pnpm dsh):先 cd 到 Harness 仓库根目录,再把下面的 dsh 全部替换为 pnpm dsh
从 GitHub 安装(一行命令)
dsh plugin --profile web add github:Ayase34/gal-view#main
#main 表示使用仓库的 main 分支;想锁定某个具体版本,可以换成提交哈希,例如 #ae73dca。
完成安装
安装后重启 web(bundle 层在启动时合成,必须重启才会加载插件)。重启后打开 Web GUI 的会话页,标签栏应出现 「GAL视窗」 标签(位于「对话」和「轨迹」之间)。
可选验证:执行 dsh --profile web --dump-config,输出中应能看到 # == gal-view 这一层,说明插件层已进入组合。
更新到新版本
dsh plugin --profile web update gal-view
# 更新后同样要重启 web
卸载
dsh plugin --profile web remove gal-view
# 卸载后同样要重启 web
说明:场景布局、素材图片、字体与阅读进度都保存在你的浏览器里(localStorage / IndexedDB),重装或卸载插件不会丢失;清除浏览器站点数据才会重置它们。
开发
pnpm install # 安装 esbuild devDependency
npm test # 纯逻辑单测(node:test,同进程运行)
npm run build:client # 生成 .dsh-plugin/client.js(生成物勿手改)
npm run check:client # 校验 client.js 新鲜度
npm run smoke # Playwright 冒烟(需 DSH_CHECKOUT 指向 dsh checkout)
结构
.dsh-plugin/index.mjs Node half(极简,无宿主行为)
.dsh-plugin/client/ client 源码:场景模型/打字机/转录映射/组件/样式
.dsh-plugin/client.js 构建产物(scripts/build-client.mjs 生成)
scripts/build-client.mjs esbuild 构建器(--check 守护新鲜度)
tests/ 纯逻辑单测(node:test)