🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

扩展坞三件套 yanwenzong1-pixel/xinlan-dsh-plugin

DeepSeek Harness
yanwenzong1-pixel3 天前有提交已提供中文文档扫描:含敏感能力

给 DeepSeek HarnessDSH插上更多接口 —— 4 个开箱即用的插件 + 1…

32/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:仓库根目录无 package.json,浅层子目录有 4 份 dsh 插件清单(dsh-dialogue-alert-message/package.json、dsh-quick-append/package.json、dsh-ptc-task/package.json 等),无法唯一定位安装名。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add yanwenzong1-pixel/xinlan-dsh-plugin
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · tool
装得上吗
作者未把包发布到 npm,只能用源码安装
插件本身没问题,是分发方式不同
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库根目录无 package.json,浅层子目录有 4 份 dsh 插件清单(dsh-dialogue-alert-message/package.json、dsh-quick-append/package.json、dsh-ptc-task/package.json 等),无法唯一定位安装名

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包xinlan-dsh-plugin(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/11 22:15:15

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 95 处,展示前 84 条)
  • 发起网络请求
    dsh-anime-desktop-pet/lib/client.js:611
    const response = await fetch(url, { credentials: "include" });
  • 写入剪贴板
    dsh-anime-desktop-pet/lib/client.js:1539
    await clipboard.write([new ClipboardItemCtor({ "image/png": pngBlob })]);
  • 读取本地文件
    dsh-anime-desktop-pet/lib/index.js:121
    body = readFileSync(asset.file);
  • 读取本地文件
    dsh-anime-desktop-pet/lib/index.js:154
    body = readFileSync(asset.file);
  • 读取本地文件
    dsh-anime-desktop-pet/lib/index.js:203
    body = readFileSync(GIF_FILE);
  • 读取本地文件
    dsh-anime-desktop-pet/src/index.ts:132
    body = readFileSync(asset.file)
  • 读取本地文件
    dsh-anime-desktop-pet/src/index.ts:165
    body = readFileSync(asset.file)
  • 读取本地文件
    dsh-anime-desktop-pet/src/index.ts:216
    body = readFileSync(GIF_FILE)
  • 读取本地文件
    dsh-auto-dispatch-specification/support/check-dsh-version.mjs:22
    try { return JSON.parse(readFileSync(file, 'utf8')) } catch { return null }
  • 读取本地文件
    dsh-auto-dispatch-specification/support/check-dsh-version.mjs:29
    const cfg = existsSync(CFG_FILE) ? readJson(CFG_FILE) : null
  • 读取本地文件
    dsh-auto-dispatch-specification/support/check-dsh-version.mjs:41
    const pkg = existsSync(pkgFile) ? readJson(pkgFile) : null
  • 写入本地文件
    dsh-auto-dispatch-specification/support/check-dsh-version.mjs:51
    writeFileSync(CFG_FILE, JSON.stringify(cfg, null, 2) + '\n', 'utf8')
  • 读取本地文件
    dsh-auto-dispatch-specification/support/init-slots.mjs:116
    try { return JSON.parse(readFileSync(file, 'utf8')) } catch { return null }
  • 读取本地文件
    dsh-auto-dispatch-specification/support/init-slots.mjs:121
    const cfg = existsSync(CONFIG_FILE) ? loadJson(CONFIG_FILE) : null
  • 读取本地文件
    dsh-auto-dispatch-specification/support/init-slots.mjs:134
    if (!existsSync(HOOK_SCRIPT)) {
  • 执行外部命令来自配置/变量
    dsh-auto-dispatch-specification/support/init-slots.mjs:142
    res = spawnSync(ps, ['-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Bypass', '-File', HOOK_SCRIPT], {
  • 读取本地文件
    dsh-auto-dispatch-specification/support/init-slots.mjs:175
    const CONFIG = existsSync(CONFIG_FILE) ? loadJson(CONFIG_FILE) : null
  • 读取本地文件
    dsh-auto-dispatch-specification/support/init-slots.mjs:192
    if (!existsSync(CONFIG_FILE)) return { slots: builtin, source: 'builtin(未找到 automation.config.json)' }
  • 读取本地文件
    dsh-auto-dispatch-specification/support/init-slots.mjs:213
    if (!existsSync(ROSTER_FILE)) return { rows: [], source: `无花名册快照(${ROSTER_FILE} 不存在)` }
  • 发起网络请求
    dsh-auto-dispatch-specification/support/init-slots.mjs:228
    const res = await fetch(`${RELAY_BASE}/relay/sessions`, { redirect: 'manual' })
  • 发起网络请求
    dsh-auto-dispatch-specification/support/init-slots.mjs:277
    const res = await fetch(url, { redirect: 'manual' })
  • 发起网络请求
    dsh-auto-dispatch-specification/support/init-slots.mjs:292
    const res = await fetch(`${BASE_URL}/api/${method}`, {
  • 写入本地文件
    dsh-auto-dispatch-specification/support/init-slots.mjs:315
    if (existsSync(MAP_FILE)) copyFileSync(MAP_FILE, `${MAP_FILE}.bak-before-init-slots-${ts}`)
  • 写入本地文件
    dsh-auto-dispatch-specification/support/init-slots.mjs:317
    writeFileSync(tmp, JSON.stringify(next, null, 2) + '\n', 'utf8')
  • 写入本地文件
    dsh-auto-dispatch-specification/support/init-slots.mjs:318
    renameSync(tmp, MAP_FILE)
  • 读取密钥环境变量
    dsh-dialogue-alert-message/integration-check.mjs:171
    const realEnv = process.env.DEEPSEEK_API_KEY
  • 读取密钥环境变量
    dsh-dialogue-alert-message/integration-check.mjs:172
    process.env.DEEPSEEK_API_KEY = 'sk-env-fallback'
  • 读取密钥环境变量
    dsh-dialogue-alert-message/integration-check.mjs:186
    if (realEnv === undefined) delete process.env.DEEPSEEK_API_KEY
  • 读取密钥环境变量
    dsh-dialogue-alert-message/integration-check.mjs:187
    else process.env.DEEPSEEK_API_KEY = realEnv
  • 发起网络请求
    dsh-dialogue-alert-message/lib/client.js:172
    const [statusRes, usageRes] = await Promise.allSettled([fetch(STATUS_URL), fetch(USAGE_URL)]);
  • 发起网络请求
    dsh-dialogue-alert-message/lib/client.js:189
    const alarmBody = await (await fetch(ALARM_URL)).json();
  • 发起网络请求
    dsh-dialogue-alert-message/lib/client.js:200
    if (ids.length > 0) fetch(`${ALARM_URL}/ack`, {
  • 写入本地文件
    dsh-dialogue-alert-message/lib/index.js:81
    mkdirSync(dirname(alarmLogFile), { recursive: true });
  • 写入本地文件
    dsh-dialogue-alert-message/lib/index.js:82
    appendFileSync(alarmLogFile, line + '\n', 'utf8');
  • 写入本地文件
    dsh-dialogue-alert-message/lib/index.js:99
    mkdirSync(dirname(alarmSettingsFile), { recursive: true });
  • 写入本地文件
    dsh-dialogue-alert-message/lib/index.js:101
    writeFileSync(tmp, payload, 'utf8');
  • 写入本地文件
    dsh-dialogue-alert-message/lib/index.js:102
    renameSync(tmp, alarmSettingsFile);
  • 写入本地文件
    dsh-dialogue-alert-message/lib/index.js:201
    mkdirSync(dirname(statsFile), { recursive: true });
  • 发起网络请求
    dsh-dialogue-alert-message/lib/index.js:252
    response = await fetch(`${baseURL()}/user/balance`, {
  • 读取本地文件
    dsh-dialogue-alert-message/lib/index.js:543
    if (!existsSync(path))
  • 读取本地文件
    dsh-dialogue-alert-message/lib/index.js:545
    return JSON.parse(readFileSync(path, 'utf8'));
  • 读取本地文件
    dsh-dialogue-alert-message/lib/index.js:554
    if (!existsSync(path))
  • 读取本地文件
    dsh-dialogue-alert-message/lib/index.js:556
    return JSON.parse(readFileSync(path, 'utf8'));
  • 写入本地文件
    dsh-dialogue-alert-message/src/index.ts:175
    mkdirSync(dirname(alarmLogFile), { recursive: true })
  • 写入本地文件
    dsh-dialogue-alert-message/src/index.ts:176
    appendFileSync(alarmLogFile, line + '\n', 'utf8')
  • 写入本地文件
    dsh-dialogue-alert-message/src/index.ts:193
    mkdirSync(dirname(alarmSettingsFile), { recursive: true })
  • 写入本地文件
    dsh-dialogue-alert-message/src/index.ts:195
    writeFileSync(tmp, payload, 'utf8')
  • 写入本地文件
    dsh-dialogue-alert-message/src/index.ts:196
    renameSync(tmp, alarmSettingsFile)
  • 写入本地文件
    dsh-dialogue-alert-message/src/index.ts:299
    mkdirSync(dirname(statsFile), { recursive: true })
  • 发起网络请求
    dsh-dialogue-alert-message/src/index.ts:344
    response = await fetch(`${baseURL()}/user/balance`, {
  • 读取本地文件
    dsh-dialogue-alert-message/src/index.ts:625
    if (!existsSync(path)) return null
  • 读取本地文件
    dsh-dialogue-alert-message/src/index.ts:626
    return JSON.parse(readFileSync(path, 'utf8'))
  • 读取本地文件
    dsh-dialogue-alert-message/src/index.ts:635
    if (!existsSync(path)) return null
  • 读取本地文件
    dsh-dialogue-alert-message/src/index.ts:636
    return JSON.parse(readFileSync(path, 'utf8'))
  • 读取本地文件
    dsh-quick-append/lib/lib/spec-context.js:58
    const st = await stat(abs);
  • 读取本地文件
    dsh-quick-append/lib/lib/spec-context.js:76
    const entries = await readdir(join(cwd, 'docs'), { withFileTypes: true });
  • 读取本地文件
    dsh-quick-append/lib/lib/spec-context.js:87
    const plugins = await readdir(join(cwd, 'plugins'), { withFileTypes: true });
  • 读取本地文件
    dsh-quick-append/lib/lib/spec-context.js:129
    text = cleanDoc(await readFile(f.abs, 'utf8'));
  • 写入本地文件
    dsh-quick-append/lib/lib/spec-context.js:142
    await writeFile(tmp, data);
  • 写入本地文件
    dsh-quick-append/lib/lib/spec-context.js:143
    await rename(tmp, abs);
  • 写入本地文件
    dsh-quick-append/lib/lib/spec-context.js:182
    await mkdir(cacheDir, { recursive: true });
  • 读取本地文件
    dsh-quick-append/lib/lib/spec-context.js:214
    const manifestRaw = await readFile(join(cacheDir, 'manifest.json'), 'utf8');
  • 读取本地文件
    dsh-quick-append/lib/lib/spec-context.js:222
    const content = gunzipSync(await readFile(join(cacheDir, 'spec-context.cache'))).toString('utf8');
  • 读取本地文件
    dsh-quick-append/src/lib/spec-context.ts:87
    const st = await stat(abs)
  • 读取本地文件
    dsh-quick-append/src/lib/spec-context.ts:103
    const entries = await readdir(join(cwd, 'docs'), { withFileTypes: true })
  • 读取本地文件
    dsh-quick-append/src/lib/spec-context.ts:111
    const plugins = await readdir(join(cwd, 'plugins'), { withFileTypes: true })
  • 读取本地文件
    dsh-quick-append/src/lib/spec-context.ts:150
    text = cleanDoc(await readFile(f.abs, 'utf8'))
  • 写入本地文件
    dsh-quick-append/src/lib/spec-context.ts:162
    await writeFile(tmp, data)
  • 写入本地文件
    dsh-quick-append/src/lib/spec-context.ts:163
    await rename(tmp, abs)
  • 写入本地文件
    dsh-quick-append/src/lib/spec-context.ts:207
    await mkdir(cacheDir, { recursive: true })
  • 读取本地文件
    dsh-quick-append/src/lib/spec-context.ts:244
    const manifestRaw = await readFile(join(cacheDir, 'manifest.json'), 'utf8')
  • 读取本地文件
    dsh-quick-append/src/lib/spec-context.ts:260
    const content = gunzipSync(await readFile(join(cacheDir, 'spec-context.cache'))).toString('utf8')
  • 写入本地文件
    dsh-relay-watch/lib/index.js:104
    try { appendFileSync(LOG, new Date().toISOString() + ' ' + line + '\n') }
  • 写入本地文件
    dsh-relay-watch/lib/index.js:109
    try { mkdirSync(DIR[key], { recursive: true }) } catch (e) { logLine('MKDIR-FAIL ' + key + ' :: ' + (e && e.message)) }
  • 读取本地文件
    dsh-relay-watch/lib/index.js:116
    for (const f of readdirSync(DIR.state)) {
  • 写入本地文件
    dsh-relay-watch/lib/index.js:150
    try { writeFileSync(join(DIR.state, 'relay-status.json'), JSON.stringify(state, null, 1)) } catch (e) { state.lastError = 'status-write :: ' + (e && e
  • 写入本地文件
    dsh-relay-watch/lib/index.js:151
    try { writeFileSync(join(DIR.state, 'sessions.json'), JSON.stringify(roster(), null, 1)) } catch (e) { state.lastError = 'roster-write :: ' + (e && e.
  • 读取本地文件
    dsh-relay-watch/lib/index.js:156
    return readdirSync(dir)
  • 读取本地文件
    dsh-relay-watch/lib/index.js:157
    .filter((n) => { try { return statSync(join(dir, n)).isFile() } catch (e) { return false } })
  • 读取本地文件
    dsh-relay-watch/lib/index.js:158
    .map((n) => { let m = 0; try { m = statSync(join(dir, n)).mtimeMs } catch (e) {} return { name: n, mtimeMs: m } })
  • 读取本地文件
    dsh-relay-watch/lib/index.js:162
    try { return existsSync(p) ? readFileSync(p, 'utf8') : undefined }
  • 读取本地文件
    dsh-relay-watch/lib/index.js:162
    try { return existsSync(p) ? readFileSync(p, 'utf8') : undefined }
  • 写入本地文件
    dsh-relay-watch/lib/index.js:166
    try { writeFileSync(join(DIR.state, key + '.done'), text, { flag: 'wx' }); done.add(key); return true }
  • 写入本地文件
    dsh-relay-watch/lib/index.js:177
    renameSync(join(fromDir, fileName), existsSync(to) ? join(target, fileName + '.' + Date.now()) : to)
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 预存文案一键追加
  • 派任务给子代理
  • 长任务中断分级报警
展开完整介绍(145 字)↓

DSH 扩展坞|给 DeepSeek Harness(DSH)插上更多接口:输入框预存文案或预存命令一键追加、一句话把整件事派给 PTC 子代理、长任务中断分级报警。DeepSeek Harness 的 DSH 插件:quick-append、ptc-task、dialogue-alert

README

由 DeepSeek 最新模型翻译生成
DSH 扩展坞 给 DeepSeek Harness(DSH)插上更多接口 —— 4 个开箱即用的插件 + 1 套全自动派发工作流规格包,clone 完不用构建就能装。 English · 中文 DSH 插件 · DeepSeek Harness · DeepSeek 外部插件 · cordis patch bundle · AI Agent 提效 · 子代理任务派发 · 全自动派发 · 多智能体工作流 平台说明:作者当前使用的是 DeepSeek Harness(DSH)Web 端进行开发与验证;如果你使用的是 Desktop 桌面端,需要自行做兼容化改造(插件加载、WebServer/路由、资源路径、计划任务或权限等),本仓库不保证 Desktop 开箱即用。
展开完整文档(README 剩余 1 节)
DSH 扩展坞

给 DeepSeek Harness(DSH)插上更多接口 —— 4 个开箱即用的插件 + 1 套全自动派发工作流规格包,clone 完不用构建就能装。

English · 中文

DSH 插件 · DeepSeek Harness · DeepSeek 外部插件 · cordis patch bundle · AI Agent 提效 · 子代理任务派发 · 全自动派发 · 多智能体工作流

平台说明:作者当前使用的是 DeepSeek Harness(DSH)Web 端进行开发与验证;如果你使用的是 Desktop 桌面端,需要自行做兼容化改造(插件加载、WebServer/路由、资源路径、计划任务或权限等),本仓库不保证 Desktop 开箱即用。

30 秒看懂它能干什么

| 你每天的麻烦 | 插件 | 装上之后 |
| 反复贴同一段提示词、同一串命令 | ⚡ 闪电追加 | 一键追加预存文案/命令,按工作区各存各的;配 LLM 优化:自动读项目说明文档+最近 3 轮对话,把草稿补成精准需求 |
| 想把一整件事丢给子代理,又受不了中间输出刷屏 | 🧩 一键派活 | 子代理用 PTC(code)模式写一段程序跑完,中间输出留在程序里,只把结论路径回给你 |
| 长任务跑着跑着断了、花超了,事后才发现 | 🔔 报警铃铛 | 被非主动原因中断立刻分级响铃;侧栏顺带显示 DeepSeek 对话数与余额 |
| 上下文重复、token 花得快、缓存命中低 | 🧭 全自动派发 | 用固定槽位与收据/回函纪律复用上下文;作者环境实测 缓存命中 99.6%、约 ¥5.47/亿 token |

四个插件都只在 DSH 侧加载,不改 DSH 源码、不碰你的会话数据;另附一套自动派发工作流规格包。

快速上手(约 1 分钟)

git clone https://github.com/yanwenzong1-pixel/xinlan-dsh-plugin.git
cd xinlan-dsh-plugin

dsh plugin --profile web add ./dsh-quick-append
dsh plugin --profile web add ./dsh-ptc-task
dsh plugin --profile web add ./dsh-dialogue-alert-message

dsh-auto-dispatch-specification(全自动派发规格包,不是 dsh plugin)按该目录 README 复制 skills/、support/ 并初始化槽位

重启 dsh web(或刷新页面)即可。装上「闪电追加」后,输入框右侧会多出 ⚡ 和 🔧 两个按钮。

- --profile web 换成你自己的 profile 名(web / headless / 自定义)即可。
- dsh plugin … add 会把插件装进 profile,并自动把声明了 dsh.bundle.patch 的包登记进 dsh.profile.bundles,不需要手改 JSON。
- 卸载:dsh plugin --profile web remove @dsh-external/dsh-quick-append。
- 不需要构建:四个插件的 lib/ 都已随仓库提交(main 直接指向 lib/index.js),clone 下来即可加载。
- 🧭 全自动派发是规格包,不是 dsh plugin 插件:按 dsh-auto-dispatch-specification/README.md 复制技能/脚本/配置并初始化槽位即可。
- 🐟 动画桌宠为作者自用,默认不写入上面的快速上手命令;需要时再执行 dsh plugin --profile web add ./dsh-anime-desktop-pet。

不想用 CLI?手改 profile(等价做法)

编辑 <DSH_HOME>/profiles/<name>/package.json,把插件加进依赖与 bundles 层栈:

{
"dependencies": {
"@dsh-external/dsh-quick-append": "link:C:/绝对路径/dsh-quick-append" },
"dsh": {
"profile": {
"bundles": [/* 内置 bundle… /, "@dsh-external/dsh-quick-append"]
}
}
}

然后在该 profile 目录跑一次 pnpm install,再重启 dsh web。

界面

| 预存命令菜单(7 条全可见) | 编辑弹窗(视口 460px,20 条可滚动) |
| 预存命令菜单 | 编辑弹窗 |

0.5.2 起,菜单与弹窗都按内容自适应高度、超长列表只有一个滚动区,并且装得下就不滚、装不下给滚动提示——不会再出现"列表被裁掉、最后几条点不到"。

插件清单

| 别名 | 目录 | 包名 | 版本 | 一句话 |
| ⚡ 闪电追加 | dsh-quick-append/ | @dsh-external/dsh-quick-append | 0.5.3 | 输入框「快速追加」按钮 + 预存命令菜单与编辑弹窗(弹窗挂在 body,不被侧栏压住) |
| 🧩 一键派活 | dsh-ptc-task/ | @dsh-external/dsh-ptc-task | 0.1.0 | 向宿主注册 ptc_task 工具,把整件事交给 PTC 作用域子代理 |
| 🔔 报警铃铛 | dsh-dialogue-alert-message/ | @dsh-external/dsh-dialogue-alert-message | 0.2.4 | 对话中断分级报警 + 侧栏对话数与余额显示(空间不够自动收成图标;长连接推送 + 45s 兜底) |
| 🧭 全自动派发 | dsh-auto-dispatch-specification/ | —(工作流规格包) | v1 | 用户决策 → 待办维护 → 执行槽位的自动派发链路;作者环境实测缓存命中 99.6%、约 ¥5.47/亿 token;监控 dashboard 需自建 |
| 🐟 动画桌宠(作者自用) | dsh-anime-desktop-pet/ | @dsh-external/dsh-anime-desktop-pet | 0.9.8 | 作者自己使用的简单桌宠+装饰,无推荐功能;v0.9.8 起默认隐藏,按 Ctrl+Shift+F12 显示。 |

⚡ 闪电追加 · 详细说明

🔥 重点能力:LLM 优化 —— 把一句草稿补成能直接开工的精准需求

开启「LLM 优化」后再点闪电,不是"多接几个字":宿主侧 LLM 会先读你的项目说明文档与最近 3 轮对话,再对提示词做扩充和细节补充。作者自测口径:大幅降低开发难度;提示词优化后精确度提升数倍,有效减少描述歧义。

优化上下文由三部分组成(都有代码落点,不是黑盒):

| 上下文 | 内容 | 依据 |
| 你的草稿 | 输入框现有内容(可带图片,多模态一起交给模型) | 请求字段固定 ['draft','context','cwd','images'],src/lib/optimize.ts |
| 项目说明文档 | 项目根 5 份规范(README.md + 4 份 SPEC)、docs/ 全部文档、各插件 SPEC/README/DESIGN;按标题剔除「更新日志/变更记录/验收清单/路线图」等非约束章节;带增量缓存,源文件变了才重建,不写你的仓库 | src/index.ts:145 → loadSpecContext(cwd);src/lib/spec-context.ts:19-41 |
| 最近 3 轮对话 | 取最近 6 条 user/assistant 消息拼成上下文,改到一半的活儿也能被正确理解 | src/client/index.ts:915-927 |

快速追加文案弹窗:LLM 优化 / goal 模式 开关

- 输入框右侧两个按钮:闪电 = 一键追加当前工作区的预存文案;扳手 = 上拉菜单插入预存命令(左键插入,右键管理)。
- 预存文案按工作区隔离并持久化:换项目自动换文案,不会互相污染。
- 右键闪电打开编辑弹窗(上图):写预存文案、勾「LLM 优化」「goal 模式」、点「插入默认文案」。
- goal 模式(默认开):追加时在草稿最前面插入 /goal,让这段内容直接作为目标交给 DSH;关掉就是普通提示词。
- 快捷键:输入区聚焦时 Shift+Alt+F 等价于点闪电;两个按钮都可 Tab 聚焦,Shift+F10 打开右键菜单。

🧩 一键派活 · 详细说明

- 注册 ptc_task 工具:给 prompt(自包含任务说明)和 resultPath(产出路径),子代理跑完把结果写进文件。
- 子代理的工具面以 PTC(code)模式呈现,一段程序跑完多步操作,中间输出不进你的上下文;主会话工具面保持原生。
- 三道护栏:链长恒 ≤ 1(子代理不能再派发)、递归护栏装不上就拒发(fail-closed)、并发去重 + 连续失败熔断。
- 适合「步骤已确定」的批量活(逐项跑脚本、扫描、对账、汇总);不适合需要边看中间结果再判断的探索型任务。

🔔 报警铃铛 · 详细说明

- 对话正常完成播「叮咚」;被非用户主动原因中断时按等级播报警音(工具报错 / 强制取消 / 会话驱逐 / 宿主重启)。
- 只对非主动中断报警:你按的取消不会响。
- 侧栏状态栏显示 DeepSeek 账号用量:对话数 / 余额(v0.2.2 起不再显示「当日花费」,数据仍在 /api/usage 中保留)。v0.2.3 起按可用宽度自适应:底部动作行被同行插件(如 DSH 内置 Cordis 行)占满时自动收成 12px 图标,完整数据进悬停提示,空间恢复自动还原——不会反过来挤压同行插件。
- v0.2.4 修「http 换长链后余额数字消失」:v0.2.3-push 把 1s 轮询改成长连接推送时,宿主侧在 isolate fiber 里直读未 inject 的 typertGateway,抛错被 apply 兜底吞掉 ⇒ 之后的 Web API 路由/余额定时器都没注册,客户端只能拿到 404。现在 gateway 改为 ctx.get() 惰性可选读取(网关晚到自动接上、push 失败不提交签名下个 tick 重试),推送块独立 try/catch——推送不可用绝不影响 Web API/余额/报警;客户端首拉失败会按 0/1/3/10s 退避重试。
- 报警走本插件自包含通道(宿主队列 /api/alarm → 客户端 WebAudio + ack),不依赖任何第三方插件。

🧭 全自动派发工作流 · 规格包

把作者已经在生产里跑通的「用户决策 → 待办维护 → 执行槽位」自动化开发链路,打包给另一个 DSH 环境复刻。它不是普通插件,而是一套可直接落地的工作流规格包:技能 + 规则 + 派单脚本 + 槽位初始化/备份/版本检查。

🔥 实测收益(作者环境,非通用承诺)

Token 缓存命中率 99.6%

缓存命中 99.6%

近 30 天用量:49,320,381,740 tokens / ¥2,698.76

近 30 天用量

- 缓存命中率 99.6%:作者本机 DSH 状态栏实测,稳定使用自动派发后上下文复用率高。
- 每 1 亿 token 成本约 ¥5.47:¥2,698.76 ÷ 493.2038174 ≈ 5.47 元/亿 token,即 5–6 元/亿 token 口径。
- 前提:严格使用自动派发任务;作者使用开源项目 Ponytail 节省 token;作者全程使用 DeepSeek V4.1-Flash。这是作者单一环境数据,不是通用保证;上下文结构、模型价格和调度纪律都会影响结果。

- 默认 7 槽拓扑:U 用户决策(唯一入口)→ A 待办维护(唯一调度点)→ B/F 生产、C 发布、E 崩溃、G GitHub。一件活只派一个执行槽位;执行方不直接找用户,结果通过回函交回 A→U。
- 收据才算送达:写进 outbox/ 只是投邮筒;必须看到 state/<原名>.done = SENT -> <槽位> 才算派单成功。同名文件只投一次,重发要换号。
- 派单安全链路:体检 → 干跑 → 确认 → 收据 → 台账/回函;角色/类型硬拦;规格必须写「判据」和「边界」,问题前置一次问完。
- 两个技能分工:y-automation-portable 负责装/搬/备份/槽位/版本跟随;y-task-distribution-auto 是日常派单唯一入口。
- 五条回合纪律:禁止回合内 sleep 等待;新任务默认入待办;收据才算送达;重启前后先体检与通知;待办清单每次变更都归拢、跑门禁。
- Windows 本机部署:计划任务、PowerShell 隐藏壳、DSH profile/槽位均按 Windows 平面设计;不承诺 Linux/macOS。
- 安装不是 dsh plugin add:按规格包 README 的三步复制 skills/、support/ 与配置,再执行 node scripts/init-slots.mjs --dry-run 建 7 个默认槽位;通过 relay-dispatch.mjs check 做在线体检。

| DSH 槽位会话示意 | 自建监控 dashboard(不包含在本仓库) |
| 槽位会话示例 | 监控 dashboard 示例 |

⚠️ 第二张监控 dashboard 不在开源代码里:它是作者环境自建的可视化面板,仅用于展示槽位关系/在线状态/当前任务/回函观感。本仓库只开源自动化开发流程本身(技能、规则、派单脚本、槽位初始化、备份与版本检查),不含 dashboard 的前端、后端、数据源或部署代码;使用者需要自己为自动化流程配一个监控面板,或直接使用 DSH 会话列表与 relay-dispatch.mjs check/status 的文本输出。截图中的会话命名、任务标题、槽位 ID 均为演示口径。

🐟 动画桌宠(作者自用)

作者自己使用的简单桌宠+装饰,无推荐功能。技术维护/复现文档见 插件 README,本页不再展开。

先看这条坑(否则可能整个 dsh-web 起不来)

契约:凡是列进 profile dsh.profile.bundles 的包,package.json 必须声明 dsh.bundle.patch 指向真实存在的 cordis.patch.yml。缺一个,宿主加载 profile 时会直接报 profile bundle "<pkg>" declares no dsh.bundle in its package.json 并退出 —— 爆炸半径是整个 dsh-web(你的所有会话与面板),不是「这个插件不生效」。

用 dsh plugin … add 安装时这一条会自动满足;手改 JSON 时请特别小心。

仓库结构

dsh-quick-append/ 宿主半 src/index.ts + 客户端半 src/client/ + 构建产物 lib/ + 测试 test/ dsh-dialogue-alert-message/ 同上(另含 SPEC.md、integration-check.mjs) dsh-ptc-task/ 纯宿主插件:src/index.ts + lib/index.js,无客户端半 dsh-anime-desktop-pet/ 独立覆盖层:Client(Shadow DOM 浮层) + Host(GIF 路由) + assets/ + scripts/ + test/ dsh-auto-dispatch-specification/ 全自动派发工作流规格包:技能 + 规则 + 派单/槽位/备份脚本(不含监控 dashboard) docs/ 设计与迭代记录(含界面截图与踩坑过程)

每个插件目录内的固定文件:

- cordis.patch.yml —— 把该插件插入 profile 层栈的 bundle patch(宿主接入凭据)
- scripts/build.ps1 —— 构建入口(Windows PowerShell)
- lib/ —— 已提交的构建产物(含 lib/types/.d.ts 与 sourcemap)

平台兼容性

- 作者开发与验证环境:DeepSeek Harness Web 端(dsh web + 浏览器),Windows 本机 profile。
- 本仓库的插件、全自动派发规格包、动画桌宠均按 Web 端编写和验证。
- Desktop 桌面端需要自行做兼容化改造:插件加载方式、WebServer/静态资源路由、路径与权限、计划任务/重启方式都可能不同;作者未在 Desktop 上验证,不提供开箱即用保证。

环境要求

- DSH ≥ 0.2.1-rc.2(本仓库在该版本上开发与验证;web profile)
- Node.js ≥ 20;加载插件不需要构建,改源码才需要
- 构建脚本是 Windows PowerShell(scripts/build.ps1,依赖 $env:DSH_CHECKOUT 或 -Checkout 参数)
- 仓库不提交 node_modules/;lib/ 构建产物有意随仓库提交
- 全自动派发规格包面向 Windows 本机 DSH(计划任务/PowerShell);监控 dashboard 不在仓库内

开发与测试

cd dsh-quick-append
$env:DSH_CHECKOUT = "C:\...\deepseek-harness-dsh-v0.2.1-rc.2" # 或给 build.ps1 传 -Checkout
npm run build # build.ps1:建 junction → tsc 编译宿主半 → tsdown 打包客户端半
npm test # node --test

typecheck:仓库不在本地装 tsc,直接用 checkout 里的那个 & "$env:DSH_CHECKOUT\node_modules\.bin\tsc.cmd" -p tsconfig.json --noEmit

npm run typecheck 需要 PATH 上有 tsc(仓库不随包安装),没有就走上面那条命令。

搜索关键词 / Keywords

DSH · DSH 插件 · DeepSeek Harness · DeepSeek Harness 插件 · DeepSeek 外部插件 · cordis · cordis bundle · profile bundle · 预存命令 · 提示词快捷追加 · prompt preset · 子代理任务派发 · subagent dispatch · PTC · 中断报警 · 用量监控 · AI Agent 提效 · 全自动派发 · 多智能体工作流 · auto dispatch · workflow automation

许可

BSD-3-Clause,见 LICENSE。四个插件的 package.json 同样声明 license: BSD-3-Clause。
预览分享卡片长什么样 ↓yanwenzong1-pixel/xinlan-dsh-plugin
分享 · DeepSeek Harness Hub
yanwenzong1-pixel/xinlan-dsh-plugin

给 DeepSeek HarnessDSH插上更多接口 —— 4 个开箱即用的插件 + 1…

这是你的仓库?认领条目

回到顶部