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

扔番茄 hj9178/dsh-throwtomatoes-plugin

DeepSeek Harness
hj917811 天前有提交已提供中文文档扫描:未发现敏感能力

任务运行时向模型扔番茄,提醒它反省错误

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add hj9178/dsh-throwtomatoes-plugin
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/05·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 11 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

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

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

发起外部网络请求
查看扫描证据(共 1 处,展示前 1 条)
  • 发起网络请求
    lib/client.js:606
    const response = await fetch(`${HOST_ROUTE}/throw`, {
扫描于 2026/11/5(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

朝模型扔番茄:任务运行时,发送键变成番茄键。一个 DSH 插件。

README

由 DeepSeek 最新模型翻译生成
dsh-throwtomatoes-plugin 朝模型扔番茄。模型正在跑任务、你的输入框又是空的时候,输入框右下角的发送/停止键会变成番茄键。按下去不会发送任何东西——它扔出一个番茄砸向对话区,让模型反省刚才哪里做错了:轻扔等这一轮跑完再说,猛扔当场打断。提醒由宿主侧直接注入给模型,对话流里看不到任何多出来的消息。 兼容 DeepSeek Harness 0.2.1-rc.2(dsh.compatibility.dshReleases 已逐条声明)。 它长什么样 ┌──────────────────────────────────────────┐ │ 输入框(为空,正在跑任务) │ │ + 权限 · 计划 模型 ▾ 🍅 ← │ └──────────────────────────────────────────┘ - 草稿为空且当前回合运行中:主键位置被番茄键覆盖,点它只扔番茄。 - 一旦你开始打字(或任务结束),番茄键自动隐藏,主键恢复原样。 - 原按钮本身没有被替换、没有被删除、也没有被改状态机;番茄键只是一层盖在它上面的独立按钮,所以原按钮的停止/发送逻辑保持完好。 两种扔法 | 短时按的次数 | 效果 | | 少(1–2 次,1 秒窗口) | 轻扔。
展开完整文档(README 剩余 1 节)
dsh-throwtomatoes-plugin

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

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

它长什么样

┌──────────────────────────────────────────┐
│ 输入框(为空,正在跑任务) │ │ + 权限 · 计划 模型 ▾ 🍅 ← │ └──────────────────────────────────────────┘

- 草稿为空且当前回合运行中:主键位置被番茄键覆盖,点它只扔番茄。
- 一旦你开始打字(或任务结束),番茄键自动隐藏,主键恢复原样。
- 原按钮本身没有被替换、没有被删除、也没有被改状态机;番茄键只是一层盖在它上面的独立按钮,所以原按钮的停止/发送逻辑保持完好。

两种扔法

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

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

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

设置页

「设置 → 扔番茄」里有:

- 🍅 自安装插件以来扔过的番茄总数(存在本机浏览器里);
- 丢番茄特效开关;
- 音效开关;
- 「预览特效」和「重置计数」。

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

安装

从 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):唯一能碰到模型请求的地方。它在 /_dsh/throwtomatoes/throw 上开一个同源 POST 接口,收到「扔了几个、是不是猛扔」之后:
- 把一条提醒武装在这个会话上(一次性,120 秒过期);
- 猛扔且 agent 正在跑 → agent.cancel({ kind: 'user' }, { keepInbox: true })(和输入框自己的停止键同形,已排队的输入不会丢);
- 等当前这一轮把驱动器让出来(agent.whenIdle())再 agent.wakeDriver() 开新的一轮,所以轻扔是「当前任务结束后」、猛扔是「中断之后立刻」;
- 新的一轮走到第一步时,agent/pre-step waterfall 把提醒并进这次 LLM 请求的 messages(source: { kind: 'dsh-throwtomatoes', form: 'notice' })。这里有一个不能用错的地方:agent-loop 会特殊对待 source.kind === 'runtime-context' 的消息——它只拿那条消息去触发自带的运行时快照,然后把消息本身丢掉,所以用它注入等于没注入;换成一个普通来源后,这条消息会被记进派生历史,从而真正出现在请求里,而客户端又不会渲染它;
- 所以模型是在请求里读到提醒的:不是排队发一条消息、不是 steer、也不占用你的输入。

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

其它细节:

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

已知限制

- 提醒必须进入模型请求,所以它会以一条「来源不是 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
预览分享卡片长什么样 ↓hj9178/dsh-throwtomatoes-plugin
分享 · DeepSeek Harness Hub
hj9178/dsh-throwtomatoes-plugin

任务运行时向模型扔番茄,提醒它反省错误

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部