dsh-gap-feed
Manifest valid★ 1During long agent thinking, posts a hot-news or reminder message directly into the conversation stream.
dsh-gap-feed
A DeepSeek Harness (dsh) plugin that posts a hot-news or reminder card directly into the conversation stream while the agent is thinking for a long time. Low-frequency, never intrusive.

Features
- In-stream injection — when the agent thinks longer than a threshold, the plugin appends an
assistant/messagedirectly into the session log (session.append+surfaceOp:'append'), rendered as a card in the conversation stream with a clickable link. If a source fails, it silently degrades — never blocks the conversation. - Multiple sources — today's hot news from Toutiao (公开 API, no login), trending GitHub repositories (created this week, sorted by stars), and Bilibili's hot ranking. Sources are fetched in parallel; one failing never affects the others.
- In-chat reminders — just say "remind me to have a meeting at 18:00" in the conversation; the model calls the
gap_feed_reminder_addtool to save it. Due reminders are prioritized over news. - Settings page — the dsh settings page renders the
gap-feedform automatically from a schema: configure limits, manage reminders (CRUD / enable / done). - Rate limiting — configurable thinking threshold + cooldown + per-hour cap, so it stays rare and never spams.
- Priority — due reminder > upcoming reminder > news; the same content is never injected twice.
- Persistence-safe — injected messages inherit a valid
model source(kind/provider/model) from existing session messages, so the session loads fine after a restart (a forged source is rejected by SessionPersistence validation).
Install
dsh plugin --profile web add dsh-gap-feed
Restart dsh web (or just refresh the page).
Published on npm as
dsh-gap-feed— the market prefers prebuilt npm tarballs (noallowBuildsapproval needed).
Usage
When does it inject?
All of the following must hold:
enabledis true;- the agent has been thinking for more than
minThinkSeconds(default 20s) without idling — detected by polling the agent registry, so it's robust to event timing; - more than
cooldownMinutes(default 15) since the last injection; - fewer than
maxPerHour(default 4) injections in the last hour.
Otherwise it stays silent and does nothing.
In-chat reminders
Say something with a time + a task, for example:
- "提醒我 18:00 开会" / "remind me to have a meeting at 18:00"
- "半小时后提醒我回邮件" / "remind me to reply to emails in half an hour"
The model parses it into text (the task) + dueAt (unix ms timestamp, default = now + 1h) and saves it. Parse failures return a friendly error without blocking the conversation. Due reminders are shown before news on the next injection.
Settings
The dsh settings page automatically renders the gap-feed namespace form. Changes take effect immediately and survive restarts.
Configuration
| Key | Type | Default | Description |
|---|---|---|---|
enabled | boolean | true | Master switch |
minThinkSeconds | number | 20 | Only inject after this many seconds of continuous thinking |
cooldownMinutes | number | 15 | Minimum gap between injections (minutes) — the core rate limiter |
maxPerHour | number | 4 | Per-hour injection cap (safety net) |
blacklist | string[] | [] | Title blacklist words; a matching title is filtered out |
Defaults live in DEFAULT_CONFIG in src/types.ts.
Reminder storage
$DSH_HOME/profiles/<profile>/data/gap-feed/reminders.json
DSH_HOMEdefaults to~/.dsh;- JSON array of
id / text / dueAt / done / enabled / createdAt; missing dirs are created, and read/write failures or corrupt JSON silently fall back to in-memory state — never throws.
Development
npm install # dev deps
npm test # vitest: 67 unit + contract tests
npm run typecheck # tsc --noEmit
npm run build # tsc -> dist/ (prepack runs it automatically)
Layering discipline: pure-function layers (decision.ts, picker.ts) have zero dsh dependency and full branch coverage; side-effect layers (news.ts network, reminders.ts file I/O) are mockable via the Source interface; the wiring layer (index.ts) only connects the runtime.
Known limitations
- Bilibili source may be rate-limited (
-352) on datacenter IPs; it degrades silently — other sources are unaffected. - Reminder cards show via the same in-stream card; reminder UI is in the settings page.
- In-session dedup is per-plugin-lifetime (no cross-restart dedup).
License
MIT
Compatibility
Versions
| Latest version | Published | Size |
|---|---|---|
| 0.1.0 | — | — |
| 0.1.1 | — | — |
| 0.1.2 | — | — |
| 0.1.3 | — | — |
| 0.1.7 | — | — |
| 0.1.8 | — | — |
| 0.1.9 | — | — |
Comments
Loading…
Similar plugins
by chromoany
Desktop notifications, sounds and a tab-title marker when the agent needs your input or a reply finishes in the background.
★ 73
↓ 1.9k/wk
MIT
JavaScript
Oct 28, 2026
dsh plugin --profile web add dsh-notify-meby liujianqiao701
DSH web GUI plugin: a bottom-right reminder card when the agent is blocked waiting for your answer, plus a desktop notification and a flashing tab title when you are on another tab.
★ 0
MIT
JavaScript
Sep 24, 2026
dsh plugin --profile web add dsh-ask-notifyby CAOGGL
Notifies you when a conversation finishes: plays a sound and shows a Windows notification when the agent goes idle (configurable sound file, volume, debounce/throttle).
★ 12
MIT
JavaScript
Oct 25, 2026
dsh plugin --profile web add dsh-dingby chintoleung
Telegram pings when your DeepSeek Harness agent needs you — question asked, approval requested, turn done. Notification-only: one file, zero deps, real-DSH compat canary.
★ 0
MIT
JavaScript
Oct 23, 2026
dsh plugin --profile web add dsh-pingWindows toast notifications when a DeepSeek Harness task finishes: the session title, the outcome, and a summary of the final reply, sent once when the agent really stops rather than once per round of
★ 0
dsh plugin --profile web add dsh-notifyWindows only. Autonomous news briefing on user absence or continuous schedule, with native OS desktop alerts for AI completions, delivered to DSH sessions or IM bots.
★ 2
MIT
JavaScript
dsh plugin --profile web add dsh-intel-pulse