DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Goal Pause Guard — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
G

dsh-goal-pause-guard

Goal Pause Guard

DSH 插件:在暂停正在运行的目标前,通过模态框请求确认。确认后会暂停目标,同时中止当前轮次,使正在运行的子任务立即停止;取消则不执行任何操作。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:frederico-kluser/dsh-goal-pause-guard#da751ec533cb0b484377fea152aff90b45702625
README兼容性版本

兼容性与来源证明

Goal Pause Guard 以 dsh-goal-pause-guard 发布,当前版本为 0.1.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/9/18

版本

0.1.0stable
2026/9/18

相关插件

正在加载相关插件…

最新版
0.1.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 1
周下载
0
最近提交
2026/9/18
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 productivity-workflow 分类下经过校验的插件。

Acp App@deepseek-ai/dsh-acp-appdsh ACP 配置文件包:基于 dsh-base 的仅限自动化的 JSON-RPC stdio 和进程生命周期管理Client Ui Task Board@linxin666/dsh-client-ui-task-board面向 DSH Web GUI 的主机权威任务面板,支持实际会话执行、主机 cron 调度以及可选的跨平台空闲睡眠保护;以挂载方式提供,无需修改 DSH 源代码。Web All@linxin666/dsh-web-allDSH Web UI 全家桶聚合插件:一键安装全部功能插件(task-board / git-graph / pet / remote-web-ui / web-ui-settings / skin-center / community-plugins / compat shim)。compat 桥接层已并入本包(src/client),无需独立 compat npm 包。Deepseek Ipptdeepseek-ipptiPolloWork PPT Studio 及其精选幻灯片模板,作为原生 DeepSeek Harness 对话视图。

README

dsh-goal-pause-guard

Plugin para o DeepSeek Harness: modal de confirmação antes de pausar uma atividade rodando.

Pausar uma goal não é um gesto pequeno: ela interrompe a rodada atual e todas as subtarefas em execução na hora. O plugin pede confirmação antes.

Modal de confirmação antes de pausar a goal


Porquê

No harness, pausar uma goal armada dispara uma cascata (motorizada no goal-round-driver, goal/changed → agent.cancel, keepInbox):

  1. a rodada em andamento é abortada — o agente para de executar no meio do que estava fazendo;
  2. as subtarefas em execução param junto (tools, comandos, subagentes);
  3. a continuação automática fica desarmada — nada de novas rodadas até um resume humano.

É exatamente esse efeito que o plugin coloca atrás de um portão: um clique acidental no botão de pause não pode desligar uma atividade que está rodando.

O que o plugin faz

clique em "Pause goal" (clique humano, trusted)
        │
        ▼
  ┌──────────────┐   captura no document (capture phase, antes do React)
  │ GUARD        │   isPauseButton? ── não ──► o clique passa (fail-open)
  └──────┬───────┘
         ▼ sim
  MODAL DE CONFIRMAÇÃO  (pt-BR / en / zh, tema claro-escuro do host)
     ├── Cancelar / Esc / fundo ──► nada acontece
     └── Confirmar ──► re-clique UNTRUSTED no botão de pause ATUAL
                          │  (passa pelo guard sem re-gate)
                          ▼
                    GoalBar → goals.pause (Remote RPC)
                          ▼
                    host: goal paused + rodada abortada + subtasks param
  • Detecção por dois canais — o botão é reconhecido pelo aria-label localizado (Pause goal / 暂停目标, os dois dicionários da barra de goal) ou pelo path SVG do ícone de pause (IconPauseOutline16), sempre dentro de [data-goal-bar] (o marcador que o próprio e2e oficial usa).
  • Fail-open por projeto — se o botão não for identificável, o clique passa e o pause se comporta exatamente como sem o plugin. Um portão de confirmação nunca pode quebrar a ação que protege.
  • Sem loop, sem referência velha — o confirm re-localiza o botão de pause atual antes de re-clicar (um re-render entre abrir e confirmar nunca transforma "confirmar" em "clicar outra coisa"); botão desabilitado ou removido nesse meio-tempo = nada acontece.
  • Um modal por vez — Esc, fundo e Cancelar fecham; o foco vai ao botão de confirmar e volta ao botão de pause no fechar.
  • Determinismo — sem timers, sem rede, sem storage. A metade host é um apply vazio (mesmo padrão do @deepseek-ai/dsh-client-ui-goal): nenhum estado do harness é tocado.

Instalação

Como bundle do profile web — o dsh.bundle.patch do pacote ativa a camada sozinho (insert próprio, sem colidir com nenhum outro id):

dsh plugin --profile web add /caminho/para/dsh-goal-pause-guard
dsh web   # reinicie a instância; plugins entram no boot

Desinstalar: remova a linha do bundle do ~/.dsh/profiles/web/package.json (dsh plugin --profile web remove dsh-goal-pause-guard) e reinicie.

Verificação

Toda a verificação roda isolada — nenhum teste toca uma instância real do DSH (nem a porta 3080, nem o $DSH_HOME):

pnpm install
pnpm run typecheck   # tsc estrito
pnpm run build       # dist/ (host) + lib/client.js (browser, closure-factory)
pnpm test            # 23 testes: detector + comportamento + e2e do artefato
CamadaProva
Detector (unit, jsdom)os dois canais de identificação; rejeição de todo o resto (resume/edit/clear, botões fora da barra, ícones estrangeiros, prefixos parecidos)
Comportamento (jsdom)clique humano abre o modal e nunca chega ao app; confirmar re-clica UMA vez como untrusted; cancelar/Esc/fundo não pausam; segundo clique engolido; botão removido/desabilitado no confirm não dispara; disposer remove tudo
E2E do artefatoo lib/client.js enviado é carregado como o harness carrega (window.__ModuleLoader__.load({id, factory})) e o fluxo inteiro é dirigido sobre ele

O screenshot acima é real: capturado num boot isolado ( $DSH_HOME temporária + porta própria) com Chromium headless, clicando no botão de pause de verdade (evento trusted via CDP) — o guard abriu o modal e o cancelamento não enviou pausa nenhuma.

Estrutura

dsh-goal-pause-guard/
├── package.json             # dsh.bundle.patch + dsh.client (platform web) + exports["./client"]
├── cordis.patch.yml         # camada 1 (bundle): insert próprio, sem !!js, sem config
├── src/index.ts             # host half: apply vazio (entrada do Loader)
├── client/
│   ├── guard-core.ts        # TODA a lógica: detector, textos, modal, install (0 imports)
│   ├── index.ts             # plugin body: inject [] + apply(ctx) via ctx.effect
│   ├── guard.css            # modal com tokens --dsw-* (claro/escuro), classes gpg-
│   └── client.d.ts          # declaração do subpath ./client
├── scripts/build-client.mjs # esbuild → lib/client.js (closure-factory, CSS embutido)
├── test/                    # jsdom + node:test, offline por projeto
└── dist/, lib/              # produtos do build (host half / browser bundle)

Compatibilidade

Verificado contra DSH 0.1.5-alpha.2 (a linha viva instalada, bootada do source). O detector ancora em dois fatos estáveis da superfície — data-goal-bar e o aria-label do action.pause do dicionário goal. Se o harness mudar os dois ao mesmo tempo, o guard fica fail-open (pause sem modal) — nunca quebrado.

Licença

MIT © Frederico Kluser