DSH Plugins Marketplace

DSH Plugins

Plugins

/

dsh-throwtomatoes-plugin

h

dsh-throwtomatoes-plugin

Discovered

No longer at a loss when the model acts up — dsh-throwtomatoes-plugin By DeepSeek-V4.1-flash1017's 53,973,006 tokens

Machine translated

dsh-throwtomatoes-plugin

朝模型扔番茄。当模型正在跑任务、而你的输入框是空的时候,输入框右下角的发送/停止键会变成番茄键。按下去不会发送任何东西——它扔出一个番茄砸向对话区,并让模型反省刚才哪里做错了:轻扔等这一轮跑完再说,猛扔当场打断。提醒是宿主侧直接注入给模型的,对话流里看不到任何多出来的消息。

兼容 DeepSeek Harness 0.2.1-rc.2(dsh.compatibility.dshReleases 已逐条声明)。

它长什么样

┌──────────────────────────────────────────┐
│  输入框(为空,正在跑任务)              │
│  +  权限 · 计划          模型 ▾   🍅  ← │
└──────────────────────────────────────────┘
  • 草稿为空且当前回合运行中:主键位置被番茄键覆盖,点它只扔番茄。
  • 一旦你开始打字(或任务结束),番茄键自动隐藏,主键恢复原样。
  • 原按钮本身没有被替换、没有被删除、也没有被改状态机;番茄键只是一层盖在它上面的独立按钮,所以原按钮的停止/发送逻辑保持完好。

两种扔法

短时按的次数效果
少(1–2 次,1 秒窗口)轻扔。不打断当前任务,等这个任务一结束立刻向模型投递反思要求:承认错误 → 思考「不该这么做该怎么做」→ 用提问工具把替代方案交给你选 → 按你的答复继续。
多(1 秒内连按 ≥ 3 次)猛扔。先强制停止当前任务,再投递同样的反思要求,让模型在干净的上下文里重新想。

无论哪种,都会播放「欢乐斗地主」式的丢番茄特效:番茄沿抛物线从按钮飞向对话区、命中后溅射红色粒子、弹出「啪!」、屏幕轻微颤动;音效是合成的破空声 + 命中闷响。特效和音效可以分别关掉。

一次对话里可以无限次使用,没有一次性限制。

快捷键

不想点时可以直接按键,默认 Alt+S:按一下等于点一下,按三下(1 秒内)等于连点三下,也就是猛扔。

  • 只有模型真的在跑、输入框空着、并且那个位置上确实是停止键时,按键才算数;模型闲着时按它什么都不会发生,按键照常交给编辑器。
  • 组合可以在设置页里改:点一下键帽,然后按下你想要的组合。组合必须带至少一个修饰键(Ctrl/Alt/Shift/Meta),否则会被当成正常打字。

设置页

「设置 → 扔番茄」里有:

  • 🍅 自安装插件以来扔过的番茄总数(存在本机浏览器里);
  • 丢番茄特效开关;
  • 音效开关;
  • 特效强度滑杆(0–100):同时缩放屏幕颤动幅度、溅射粒子数量和音量。0 等于「放个番茄飞过去就完事」,100 是最夸张的一档;
  • 扔番茄快捷键(点键帽后按下新组合,Esc 取消);
  • 「预览特效」(不受真实投递的节流限制,随时按随时看)和「重置计数」。

页面文案跟随浏览器语言:中文环境显示中文,其余显示英文。

安装

# 从 npm(发布后)
dsh plugin add dsh-throwtomatoes-plugin

# 或直接从 GitHub
dsh plugin add github:<你的账号>/dsh-throwtomatoes-plugin

装完重启 DeepSeek Harness。插件通过 cordis.patch.yml 自动进入 profile 的 bundle 栈,不需要手改配置。

它改动了什么(以及没改什么)

  • 不改你的输入:草稿文本、附件、选区都不碰,插件只读取 contenteditable 的 textContent 判断是否为空。
  • 不改模型输出:不接管渲染、不注入消息、不改轨迹。
  • 不在对话里留下任何东西:提醒由宿主半边并进模型请求本身,来源标记为 dsh-throwtomatoes / notice。客户端聊天视图对「来源不是 user」的消息一律不渲染,所以你只会看到番茄飞过去,对话流保持干净——既没有排队中的消息,也没有多出来的一行。
  • 番茄键是 position: fixed 的覆盖层,盖在原生主键上;按下时 preventDefault + stopPropagation,原生按钮收不到这次点击。

一个诚实的取舍:提醒必须成为模型请求的一部分,所以它会以一条「非 user 来源」的消息落在会话历史里(客户端不渲染,但导出原始会话记录能看到)。这是宿主插件能做到的、既不假装成你的输入、又能真正影响模型的最小代价。

实现要点

插件分两半,职责严格分开:

  • 浏览器半边(lib/client.js):番茄键、特效、音效、设置页。按 DSH 客户端模块系统约定注册为 lazy-CJS factory(window.__ModuleLoader__.load({ id, factory })),不依赖打包器注入的 import。
  • 宿主半边(lib/index.js):唯一能碰到 agent 循环的地方。它在 /_dsh/throwtomatoes/throw 上开一个同源 POST 接口,收到「扔了几个、是不是猛扔」之后:
    • 猛扔且 agent 正在跑 → agent.cancel({ kind: 'user' }, { keepInbox: true })(和输入框自己的停止键同形,已排队的输入不会丢);
    • 把提醒投进循环的 next-step 通道(agent.inject(message)),并且只在 agent 空闲时才 wakeDriver()。next-step 的语义正好是「当前正在执行的那一步结束之后」:读文件、跑命令这些动作做完,下一个模型请求就带上提醒,不用等整个交付流程结束;
    • 这就解释了它为什么不是 followup:followup 走 next-turn,会开一整轮新任务,客户端那边看起来就是一条排队消息。inject 走 next-step,聊天视图只把 source.kind === 'user' 的 next-step 项渲染成插话行(dsh-client-ui-chat 的 inboxSteering),而我们的来源是 dsh-throwtomatoes,所以不显示;
    • 提醒进 session 时是 user/message 事件,source: { kind: 'dsh-throwtomatoes', form: 'notice', summary }。这里有个不能用错的地方:不能用 source.kind === 'runtime-context'——agent-loop 会特殊对待这种消息,只拿它触发自带的运行时快照,然后把消息本身丢掉,用它注入等于没注入;
    • 所以模型是在自己的下一次请求里读到提醒的:客户端看不到任何新增内容,也不会出现「等待中」或「排队中」。

浏览器半边只发这一个请求。宿主不可达时不会退回「发一条可见消息」——那正是这个插件绝不该做的事——而是让番茄键短暂变灰并在控制台留一条警告。

其它细节:

  • 通过 slots.inject('conversation.input.overlay', …) 挂一个不可见的「座位」组件,把 [data-composer-card] 和会话 id 关联起来;会话 id 先取 props.sessionId,拿不到时退回读卡片的 [data-conversation-session] 祖先属性,所以 slot 契约变化时插件不会失联。
  • 「是否正在跑任务」优先读会话快照的 running;拿不到快照时退回看主键 SVG 里有没有 <rect>(停止图标)。
  • 主键定位:取 composer card 内最后一个 <button>,并用几何校验(位于卡片右下、尺寸合理)确认它是主键;万一未来布局改动导致定位失败,番茄键会退到卡片右下角固定位置,功能不中断。
  • 显隐完全事件驱动:每张 composer 卡片一个 MutationObserver(只看卡片内部属性/子节点变化),加上 input/keyup/resize/scroll/visibilitychange,用 requestAnimationFrame 合并成每帧最多一次;另有一条 1.5 秒的低频兜底。0.1.x 的 180 毫秒轮询会持续强制布局,这一版已移除。
  • 设置页通过 slots.inject('settings.section', …) 注册,计数与开关存在 localStorage。
  • 连扔多颗、而上一条提醒还没被模型读到(上一轮还没开)时,新的一颗会并进同一条提醒,次数相加、猛扔风味保留;已经被读到的那次不会被改写。所以一次连扔换来一次完整的反思,而不是让模型读一串几乎一样的祈使句。
  • 只有在宿主确认投递后计数才增加;请求被拒或宿主不可达时番茄键会短暂变灰,统计里不会留下虚增的数字。
  • 会话 id 在每次投递时现读卡片所在的 [data-conversation-session],所以切换会话之后不会把番茄扔进上一个会话。

已知限制

  • 提醒必须进入模型请求,所以它会以一条「来源不是 user」的消息落在会话历史里。它不经过输入框、不进循环的收件箱,所以客户端既不会显示它,也不会出现排队/等待中的状态;只有导出原始会话记录时能看到。这是宿主插件能同时做到「不假装成你的输入」和「真正影响模型」的最小代价。
  • 轻扔的等待上限是「当前这一步」:模型正在跑一个很长的工具调用(比如一条跑几分钟的命令)时,提醒要等这次调用结束才送达。它不会跨轮堆积,也不会在你下一次说话时抢答。
  • 猛扔的中断等价于输入框自己的停止键:它中止当前这一轮,但不会回滚已经写进文件的改动。
  • 中断一轮会让该会话的目标(goal)转成 paused——这是 DSH 中断轮次的通用行为,不是插件故障。想继续就在目标条上点 ▶(旁边的 ✕ 是清除,点了就真删)。
  • 番茄键变灰并提示「扔番茄未送达」说明宿主半边没接上(插件刚装还没重启、或宿主拒绝了这个会话)。重启 DSH 后仍然如此,请把提示里的原因贴到 issue。

开发

pnpm install
node --test test/*.test.mjs

测试用 jsdom 造一个和 InputBar 同构的 composer DOM(含停止态/发送态、空/非空草稿),按 DSH 的方式加载 bundle;宿主半边用桩 ctx 驱动路由处理器和 agent/pre-step waterfall。覆盖:模块契约、两个 slot 的注册、显隐条件、不转发点击、轻扔/猛扔发往宿主的载荷、可重复使用、特效开关、sessionId prop 缺失时的 DOM 兜底、主键定位失败时的角标退化、宿主不可达时不产生可见消息,以及宿主侧「请求内注入且来源不是 runtime-context + 一次性 + 先中断后重启 + 参数校验」。

License

MIT

Comments

Loading…

Similar plugins

dsh-plugin-reasoning-efforts

by chuling-lingling

给 DeepSeek Harness (dsh) 的第三方中转模型补上「推理等级」选择器 —— 和官方模型在聊天框里的体验完全一致。

Tools & CapabilitiesDevelopment & InfrastructureManifest valid

★ 0

MIT

JavaScript

Sep 11, 2026

dsh plugin --profile web add dsh-plugin-reasoning-efforts

by ztlovelsw

手动或自动配置模型思考强度、上下文窗口、最大输出token

Development & InfrastructureManifest valid

★ 4

↓ 39/wk

TypeScript

Oct 20, 2026

dsh plugin --profile web add @ztlovelsw/dsh-model-profile

by huguangyu666

DeepSeek Harness 插件:超级搜索 toolkit——集成 TinyFish 结构化检索、AnySearch REST、Bing 免 Key 爬取、Jina 与 DuckDuckGo,接管 DSH 原生 web_search,零 Token 消耗。

Manifest valid

★ 4

↓ 104/wk

MIT

JavaScript

Oct 3, 2026

dsh plugin --profile web add dsh-plugin-ai-super-search

by Hades03

DeepSeek Harness plugin: DeepSeek balance and per-provider/model token usage in a draggable overlay.

Development & InfrastructureTerminal & ClientsManifest valid

★ 0

MIT

JavaScript

Oct 20, 2026

dsh plugin --profile web add dsh-model-quota-usage

by shuxidemosheng

Enhanced todo_write plugin for DeepSeek Harness: floating task panel with capsule mode, priority tags, full checklist rendering. Fork of @deepseek-ai/dsh-tool-todo.

Tools & CapabilitiesDevelopment & InfrastructureManifest valid

★ 96

↓ 355/wk

NOASSERTION

JavaScript

Oct 18, 2026

dsh plugin --profile web add dsh-tool-todo-plus

by jiuaiwo

T专家 — DeepSeek Harness 插件:22 分类 / 623 位专家名册(中文名与简介全量覆盖),@ 菜单召唤子代理

Development & InfrastructureManifest valid

★ 0

MIT

JavaScript

Oct 10, 2026

dsh plugin --profile web add dsh-expert