dsh-recorder

DSH PLUGIN开发与运行时

仓库 tyouter/dsh-recorder

开发与运行时 未标注验证等级 安全审查:未标注 可信度:未标注 可安装插件
安装这个插件

DSH plugin 录制器:像真人一样驱动目标插件的真实界面,并把运行窗口录成 GIF 或截图。

一句话选型结论

按资料字段整理

dsh-recorder 是开发与运行时类的 DSH 可安装插件,未做沙盒验证,暂无安全审查结论,列出 5 项功能,有可直接复制的安装命令。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类开发与运行时 收录类型可安装插件 验证等级未标注验证等级 安全审查未标注
验证等级 UNKNOWN 未标注验证等级
GitHub 星标 0 复刻 0 · 未关闭 issue 未标注
最近更新 2026-11-10 创建于 2026-11-09
README 14.3 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add github:tyouter/dsh-recorder
  1. 1
    确认版本与运行环境

    仓库没有标注兼容版本与 Node.js 要求,先确认你的 DSH 版本能装,再继续。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本未标注版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名未发布到 npm可用 npm view 查看包信息

能做什么

5 项功能
字段来自项目仓库与公开索引,中文说明由本站标注

dsh-recorder:用 DeepSeek Harness 录制插件真实界面并自动操作

  • 真实窗口像素录制为 GIF
  • 脚本化模拟点击与输入
  • 侧边栏录制面板与历史
  • Agent 工具一键录制
  • 可裁剪区域与帧率设置

上游标签

deepseek-harnessdsh-plugin

验证等级与安全审查

未标注验证等级
自动化流程结论,不是人工审核
验证等级未标注验证等级上游未给出验证结论,安装前请自行确认
安全审查未标注静态分析结论,未标注不代表已通过审查
仓库健康度未标注按仓库活跃度与最近更新时间给出
可信度未标注综合仓库活跃度与验证结果

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 有可直接复制的安装命令,不用自己翻文档找入口。
  • 列出了 5 项功能,能直接看出它解决什么问题。

先想清楚的地方

  • 安全审查还没结论,装之前先看仓库改了什么、要什么权限。
  • 没有声明 Node.js 版本要求,版本不匹配可能装不上。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在开发与运行时场景里给 DSH 补能力的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-recorder当前 未做沙盒验证 未标注 0 未标注 有
deepseek-harness L3 · 安装规范通过 低风险 24.6 万 未标注 无
rea L4 · 沙盒安装通过 低风险 2.6 万 0.1.1-rc.2 有
dsh-TUI L4 · 沙盒安装通过 中风险 4,292 0.1.7-rc.2 等 5 个 有
mirage L3 · 安装规范通过 低风险 3,681 未标注 无
dashi-taskboard L4 · 沙盒安装通过 低风险 3,311 0.1.1-rc.2 有

仓库档案

开发与运行时
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方tyouter仓库 dsh-recorder · 默认分支 未标注
分类开发与运行时dev
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言JavaScript仓库主语言
许可证未标注商用或二次分发前请确认条款原文
星标 / 复刻 / issue0 / 0 / 未标注收录时的数值,非实时
创建 / 更新2026-11-09 · 2026-11-10最后推送 未标注
本站收录2026-11-12首次进入本站目录的时间

README 全文

14.3 KB
作者原文,中文版优先;只做安全转义,不改内容

dsh-recorder

Records a DSH plugin's real interface — the pixels of the running app, not a re-render — and turns
that into a GIF or stills. It also drives that interface like a person: typing with real input
events, clicking buttons, selecting a range of text, switching panels.

Two ways to use it:

  • The panel: sidebar → 「录制器」, paste a script, press 「开始录制」. The page executes the script
    while the real window is recorded, then shows the GIF.
  • Agent tools: recorder_scan → recorder_demo for a one-shot recording from a conversation.

Status: v0.1, installed and verified on this machine. A real notes walk produced a 10.8 s,
65-frame, 2.0 MB GIF plus three stills (recordings/rec-20261103-142842/). The plugin is installed as
@tyouter/dsh-recorder in the desktop profile; the row is include:dsh-recorder.

The panel

Sidebar → 「录制器」 opens a page with two tabs.

录制 — the whole workflow is one centred column:

Part What it does
录制脚本 The script, front and centre. JSON steps or one step per line (see below); kept in localStorage between visits.
复制给插件 agent 的 prompt One click copies a self-contained prompt (the full spec + what to output). Paste it into the agent that owns the plugin, describe the demo, and it returns a script you paste back. 载入示例 restores the notes walk that the verified GIF came from.
开始录制 The primary action, a large button under the editor. 排练(不录制) runs the same steps without recording (real clicks, no video); 停止 ends early. A rehearsal brings the window forward first — a background window throttles the page's timers and would freeze the walk.
本次录制 The result of this run: a large GIF preview (click it for a full-size lightbox), its length/frames/size, the path, and the per-step log. The lightbox opens at 100% — one GIF pixel per device pixel, so the text is exactly the physical size it had on screen; 适应屏幕 fits the whole frame instead (smaller text).

⚙ 设置 (top right) opens a popover with the parameters — they are no longer mixed into the main
page:

  • 输出工作区 — which registered workspace's recordings/ receives the output.
  • 录制区域 — 功能区 (crop to the main panel), 整个窗口, 自定义区域 + a CSS selector.
  • 帧率 / GIF 宽度 / 截图时间点 — 6 fps. The GIF width defaults to the content's physical pixel
    width (≈1470 on a 125% display) so the preview is never upscaled; lower it to shrink files, and
    remember the encoder cannot add detail beyond the source. Stills are seconds.
  • 铺满当前屏幕 — maximize on the monitor under the cursor.

历史 — a grid of past recordings of the selected workspace (thumbnail, name, length, frames,
size). Click a card to open it with the GIF, meta, path and copy button. Click the preview (the
⤢ 全尺寸 badge) to open the full-size lightbox; click the backdrop or ✕ to close.

The detail view also has 删除这段录制: the first click arms the button, the second confirms and
removes the recording directory from disk. Only directories directly under a recordings root whose
name matches rec-YYYYMMDD-HHMMSS can be deleted (the route refuses anything else).

While a run is active the status pill counts steps (录制中 00:01 · 3/3 click) and the floating REC
pill below the title bar shows the clock and a stop button. A rehearsal gets the same pill in blue
(排练 2/10) with its own stop, so it can be ended even when the script has switched away from this
page. The panel is in the main area, so a script that opens another plugin's panel will hide it — the
pill stays available, and coming back to the recorder panel shows the finished result.

The pill is hidden while the pointer is away from the top strip and appears when the pointer enters
the top 84 px. That keeps it out of the recording (nothing is drawn over the page during a normal
walk), while moving the mouse to the top is the stop control when the panel is not visible. It sits at
top: 46px because the very top strip is the window's drag region; a click there belongs to the window
manager. Pressing 停止 hides the pill immediately while the GIF is assembled, so a long splice never
looks like an ignored click.

Window size

铺满屏幕 (and, when maximizeOnStart is true in the patch, a moment after the plugin activates)
moves the app window to the monitor under the cursor and maximizes it, so a freshly launched Harness
fills the current screen instead of opening at its remembered size. Focusing the window for a rehearsal
never changes its size: a maximized window stays maximized, at the same rect. Window geometry is the
plugin's business; UI scale is not — the interface still follows the Windows display scale of that
monitor (120 DPI = 125% here). For a 1:1 UI, set that monitor to 100% or launch the app with Chromium's
--force-device-scale-factor=1; a page plugin cannot change the process's DPI mode.

Keep the Harness window visible while a walk runs: Chromium throttles a background window's timers,
which freezes every sleep/wait in the script (and delays a stop). The rehearsal brings the window
forward before it starts; the capture does the same by design.

Cursor and click effects

The driver paints the pointer into the page, so the effects are part of the recording — no
post-processing, the frames are the page:

  • a short blue trail follows a move, including a jump across the screen (two breadcrumbs are laid on
    the straight line when the distance is large);
  • two expanding blue rings plus a flash mark the click;
  • the clicked element gets a temporary blue outline, so the target is obvious even when the
    pointer is small.

All of it is disabled under prefers-reduced-motion (the outline and the pointer are still drawn).

Recording area

功能区 is the default and is what most demos want: the page measures the main panel's box and sends
the insets in CSS pixels plus devicePixelRatio; the Host maps them through the window's real
client area (Win32 GetClientRect + ClientToScreen) and crops every frame. The window is still
maximized for the shoot — the crop is what removes the sidebar and the app title bar, and
it stays correct on a mixed-DPI desktop because the mapping is measured, not assumed.

Because the crop is the main panel, the GIF's aspect ratio is the panel's, not the window's
(e.g. 1544×970 for a 1920×1020 window). The image is still scaled proportionally; if the framing has
to match the full window, pick 整个窗口.

  • 整个窗口 records the maximized window as-is (sidebar included).
  • 自定义区域 takes a CSS selector and crops to that element's box; the element must exist when you
    press start.
  • If another app takes the foreground mid-recording, those frames show that app; the result then
    carries a ⚠ warning rather than pretending the footage is clean.

The same walk in 功能区 mode: 10.6 s / 64 frames / 705 KB, against 2.0 MB for the full-window cut —
the sidebar and app title bar are simply not in the frame.

Script syntax

One step per line; | introduces the text for that step. Lines starting with # are comments.

# 打开记事本,写一段笔记,选中一句
open notes
wait .dshn-root
click .dshn-switch[aria-checked="true"]
click .dshn-tabs button.dshn-tab:nth-of-type(1)
set .dshn-textarea |
click .dshn-textarea
type .dshn-textarea | 极简笔记\n\n这不是一个新的工具,而是一个关于文字的哲学思考。\n智能不能成为文字的主角。\n功能应当服务于思想。\n书写带来快乐。
sleep 900
select .dshn-textarea | 智能不能成为文字的主角。
sleep 1200
  • open — switch to another plugin's main panel (notes, wuche, conversation, …).
  • click [| text] — click a button/tab; text picks among matches.
  • type | text — type character by character (60 ms each); \n inserts a newline.
  • set | text — set the value in one go (good for clearing a draft).
  • select | text — highlight that text.
  • wait [timeoutMs] — wait for an element (default 8 s).
  • sleep, key, scroll, focus.

A JSON array of step objects works too — starting the box with [ switches the parser. Step objects
use the same op names the agent tools use, and can set ms on type.

A step whose element is missing is reported as failed and the walk continues (unless the JSON sets
strict: true). Selectors come from the plugin's real DOM; the agent tool recorder_scan prints them.

The full, versioned grammar is in docs/script-spec.md. Before spending a
recording, press 排练(不录制): it runs the same steps for real and lists ✓/✗ per step, so a
wrong selector shows up in a second instead of in a wasted GIF.

Writing a script with another agent

The plugin's own agent knows its components and class names, but not the recorder's grammar. Hand it
the prompt:

  1. Press 复制给插件 agent 的 prompt.
  2. Paste it into that plugin's agent conversation, replace the last paragraph with what you want to
    see (打开记录页,点 Structure,输入一句话…), and send.
  3. The agent answers with one code block. Paste it into 录制脚本, press 排练(不录制), then 开始录制.

The prompt carries the whole spec, so the other agent does not need this repository. If you also want
it to use real selectors, send it the output of recorder_scan (the agent tool) for the panel you
mean; the prompt tells it to prefer that list.

Agent tools

Tool What it does
recorder_windows Lists recordable windows (title, screen rect, size) and reports the capture backend.
recorder_scan Reads the live DOM and returns the visible interactive elements with real CSS selectors.
recorder_start / recorder_stop Manual start/stop; start returns a probe frame to check the target.
recorder_drive Runs steps against the live page without recording, or while a recording runs.
recorder_demo start → drive → settle → stop in one call.

How it works

  • Capturing pixels happens in the Host half: screen capture of the real window through
    tools/record-window.py (Win32 + Pillow). It knows nothing about DSH plugins.
  • Driving happens in the page that owns the UI. The recorder's own client half lives in the
    same page as every other plugin, so it operates the target's real DOM. The plugin under test does
    not have to change at all — no dev flag, no injected script, no debug port.
  • Agent-triggered runs use a job bridge: the page polls /recorder/api/poll, runs the handed-out
    steps, and posts the report back. The panel does not use that bridge — it runs the same driver
    locally (POST /start → steps → POST /stop), so a throttled background timer can never stop a
    demo from starting. /progress still feeds the pill's step counter on both paths.
run / recorder_demo (agent path)
│  Host: resolve window → activate → maximize → start frames
├────────► /recorder/api/poll ──► page: run steps (type/click/select/openPanel)
│  Host: wait for the report ◄── /recorder/api/report (and /progress)
│  Host: settle → STOP → GIF assembly (Pillow) → restore window
└── { gif, stills, frames, seconds, walk: [step results] }

panel: POST /start → runSteps() in the page → POST /stop   (no poll involved)

Because a screen grab cannot see through another app, a run raises the window (minimize + restore,
which is the one activation Windows never refuses) and maximizes it for the length of the shoot; the
previous placement is restored afterwards. The painted cursor and the REC pill are part of the page
and are recorded in both modes.

Installing / updating

plugin_manager(install_bundle, target = )

A newly installed bundle's client half appeared in the running page without a reload on this
build. Host-side JavaScript changes are not picked up by editing files: disable and re-enable the
row with plugin_manager(set_plugin), or restart the app.

Limits (v0.1)

  • One recording at a time; output goes to /recordings/rec-/.
  • Screen capture means the screen: if the window is moved or covered mid-recording, the footage shows
    that. recorder_start returns a probe frame for exactly this check.
  • The recorded window is maximized for the shoot and restored afterwards.
  • No zoom, chapter cards, or post-processed cursor: the cursor is a DOM overlay recorded with the page.
  • The panel's output workspace is a registered-workspace picker; the agent tools use the calling
    session's cwd.
  • The plugin under test is untouched. The notes fixture clears its draft and never saves.

Files

index.js               Host half: engine wiring, tools, /recorder/api
lib/engine.js          one recording + one page operation at a time; the job bridge; workspaces
lib/capture.js         capture backends (Electron capturePage when available, else screen) + stills
lib/python.js          locating the bundled Python and running the helper
lib/tools.js           the six model-facing tools
client.js              page half: poll loop, step driver, DOM scan, REC pill, cursor, recorder panel
tools/record-window.py window/rect capture, stop-file protocol, probe frames, GIF assembly
examples/notes-demo.json  the verified walk as JSON steps
docs/panel.png          the recorder page
docs/panel-running.png  the page during a run (REC pill + step counter)
docs/crop-example.png   a 功能区-mode frame (no sidebar, no title bar)
docs/click-effect.png   the pointer, trail and double click ring over a clicked tab
docs/script-spec.md     the versioned script grammar (also the source of the copied prompt)
HANDOFF.md             the original brief (kept as the design record)
docs/findings.md       measurements: what was proved, what failed, and why

常见问题

6 问
答案由本站依据条目字段整理,不引用上游原文
dsh-recorder 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add github:tyouter/dsh-recorder` 即可。

dsh-recorder 的验证等级是什么意思?

未标注验证等级。上游未给出验证结论,安装前请自行确认

dsh-recorder 安全吗?

未标注。

dsh-recorder 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-recorder 有哪些功能?

真实窗口像素录制为 GIF、脚本化模拟点击与输入、侧边栏录制面板与历史、Agent 工具一键录制、可裁剪区域与帧率设置。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

同名或近似条目

1 条
不同作者的仓库分开列,请确认你要装的是哪一个
开发与运行时
按星标排序,可作替代方案

rea

rea

L4 · 沙盒安装通过 2.6 万 星

dsh-TUI

dsh-TUI

Claude Code 风格全屏终端 UI:像素鲸鱼顶栏、实时工作状态行、思考流式展开。

L4 · 沙盒安装通过 4,292 星

mirage

mirage

把文件系统与 bash 提供者换成 mirage 虚拟工作区:文件工具与 shell 命令作用于挂载的资源(RAM、S3、Redis、Sla

L3 · 安装规范通过 3,681 星

dashi-taskboard

dashi-taskboard

把当前已安装并运行中的 Codex Taskboard 嵌入 DeepSeek Harness 侧边栏,并通过 Launcher 运行时描述

L4 · 沙盒安装通过 3,311 星

tyouter 的其它插件

2 个

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 —。