Passer au contenu principal
P

dsh-background-agents

perrylink/dsh-background-agents

Agents d'arrière-plan interactifs à session longue pour DeepSeek Harness : lancez un agent enfant durable et reprenable depuis n'importe quelle session, suivez sa progression dans la barre latérale de la Web UI, envoyez-lui un message à tout moment et interrompez-le — le tout via la jonction officielle de sous-agent.

Installer

dsh plugin --profile web add github:perrylink/dsh-background-agents

README

👥 dsh-background-agents

Interactive long-session background agents plus persistent multi-agent team rooms for DeepSeek Harness — start a durable child agent that keeps working while you keep talking.

Steer live conversations and coordinate a team across sessions; everything survives restarts through the harness's own storage.

License DSH plugin Node CI Version npm version npm downloads

English · 简体中文 · Español · Português · हिन्दी


Compatibility

SurfaceStatus
HarnessDeepSeek Harness 0.1.0-rc.6 (peers >=0.1.0-rc.5 <0.2.0)
Node^22.19.0 || >=24.0.0
PlatformsAll (host tools; optional Web sidebar panel and team rooms via the storage-domain capability)
ModelAny (children inherit the parent's route; childProvider/childModel override)

What you get

dsh-background-agents upgrades DSH's fire-and-forget background jobs into two coordinated surfaces:

  1. Five steering toolsbackground_agent starts a durable, continuable child on the official subagent seam (optional tool_filter — removes tools, never grants new ones; persona; max_depth; childProvider/childModel route). bg_message delivers a later turn; bg_list reports status (or the descendant tree with parentId/depth); bg_result reads the latest result text (reasoning fallback flagged textSource: 'reasoning'); bg_stop requests interruption.
  2. Progress and archiveautoReport injects one throttled progress line after each child turn; reportDelivery: wakeup starts a parent turn when idle. The idle sweep archives quiet children and bg_message wakes them back up (autoArchive: false parks quiet watchers instead).
  3. Dashboard projection + Web panel — the backgroundAgents session projection folds the parent log into rows; a sidebar panel shows live status, jump, message, stop, and result peek. Everything reconstructs from the durable log — no separate database.
  4. Team rooms (v0.5.0+) — the /room command family plus eight room_* tools build persistent multi-agent rooms: members (each an independent session), a message bus (directed/broadcast), a shared task board, and a shared timeline — stored in the team_rooms storage domain (SQLite or JSONL) and recovered across DSH restarts. Cross-member task handoffs route through the official approval seam.

Quick start

# 1. install the bundle into your profile
dsh plugin --profile web add "github:PerryLink/dsh-background-agents#main"

# or from npm (published releases)
dsh plugin --profile web add dsh-background-agents

# 2. restart and verify the row
dsh --profile web --dump-config | grep -A4 'id: background-agents'

The bundle patch carries the plugin row; provider is required. The repo commits its build output (lib/), so git installs need no build step. The plugin needs the subagent spine already mounted (any profile built on @deepseek-ai/dsh-base has it). Team rooms mount wherever the storage domain is composed (@deepseek-ai/dsh-storage-domain); the five bg_* tools work without it.

Then, in any session, just ask the model — or call the tools directly:

background_agent "watch the repo for test failures and keep me posted" (label: test-watch)
bg_list
bg_message <agentId> "also check the snapshot tests now"
bg_stop <agentId>

Install & uninstall

  • git channel (latest main): dsh plugin --profile web add "github:PerryLink/dsh-background-agents#main" — committed lib/, no prepare or allowBuilds step.
  • npm channel (published releases): dsh plugin --profile web add dsh-background-agents.
  • tarball channel: pnpm pack in this repo, then dsh plugin --profile web add ./dsh-background-agents-<version>.tgz.
  • uninstall: dsh plugin --profile web remove dsh-background-agents (or remove the row from the profile patch).

Configuration

Every tunable is a validated Schemastery Config field — change it in cordis.yml, never in code. Only provider is required.

KeyDefaultMeaning
provider(required)ctx.subagents provider name for continuable starts (spawn)
autoReporttrueInject one progress line into the parent after each child turn
reportDeliveryquietquiet appends the line to the next model request; wakeup starts a parent turn when idle
reportThrottleMs15000Minimum gap between two progress injections for one child
reportSummaryMaxChars300Hard cap on the injected progress-line text (ellipsized)
resultMaxChars4000Hard cap on the bg_result text (ellipsized, flagged truncated)
maxBackgroundAgents4Hard cap on non-archived background agents per parent session
autoArchivetrueIdle-archive toggle; when false, the sweep never archives quiet children
idleTimeoutMinutes120Idle window after which a quiet child is archived (>= 1)
idleSweepIntervalMs60000Archive sweep period
maxLabelChars120Display-label cap (ellipsized)
childProvider(inherit)Provider route for child model requests
childModel(inherit)Model id for child model requests
maxChildDepth(none)Config ceiling for a start's max_depth argument
allowedChildTools(none)Allowlist for tool_filter names; empty/absent = no limit
maxRooms16Hard cap on team rooms across the profile
maxMembersPerRoom8Hard cap on members per room
maxRoomsPerMember4Hard cap on rooms one member session may join
busRetention200Bus messages kept per room
timelineRetention500Timeline events kept per room
taskRetention50Completed tasks kept per room
maxMessageChars4000Hard cap on one room message's text (rejected above, never truncated)
injectRoomBrieftrueInject the short room brief into member sessions (join + resume)
roomOpenTimeoutMs15000How long the team_rooms storage-domain open may take before every room operation fails loud (store-unavailable) instead of hanging
allowUnmarkedFactsfalseForce log-only fact events on hosts that drop the ignorable marker (dangerous: unmarked facts make sessions unresumable elsewhere); default is detect-and-skip

Tools & surfaces

SurfaceKindNotes
background_agenttoolStart a durable, continuable child (label, tool_filter, persona, max_depth)
bg_messagetoolDeliver a later turn to a child by agent id
bg_listtoolStatus of your agents (or the descendant tree with recursive: true)
bg_resulttoolFetch a child's latest assistant output text
bg_stoptoolRequest interruption of the current turn
/roomcommandcreate|join|leave|list|send|tasks|task add|assign|claim|done|delete
room_list_rooms / room_post / room_readtoolsMessage bus: roster, post (broadcast/directed), read history
room_list_tasks / room_create_task / room_claim_tasktoolsShared task board
room_transfer_task / room_complete_tasktoolsHandoff (approval-gated) and completion
backgroundAgents projectionsession projectionDashboard rows folded from the parent log
teamRoom projectionsession projectionShared timeline folded from team-room/fact events
Web sidebar panelclientLive status, jump, message, stop, result peek

How it works — and why it survives restarts

Everything rides the official subagent seam: startContinuable, followup, interrupt, listChildren — the plugin performs no lifecycle routing of its own, never touches another session's Agent, and never kills a process tree (stop = request interruption, teardown belongs to the continuation manager).

The plugin writes every fact through one structured channel and one model-visible channel:

  • background-agents/fact structured fact events — the registered / message / stop / progress / archived facts, appended to the parent log as log-only records with the envelope's ignorable: true marker; readers that do not know the type skip the records instead of refusing the log. Hosts whose Session.append predates the marker (every released rc line through 0.1.0-rc.7 drops it silently — the stamping fix exists on harness master only — making unmarked sessions unresumable on stricter builds) are detected before the first append (peer-version pre-check, then a probe of the returned envelope) and fact appends are skipped with a one-time warning — the durable store, the notices, and the tools keep working, and the projections degrade to an empty fact fold.
  • tool/result replay metadata — the same facts in logs written before the structured channel (folded only while a row has no structured provenance).
  • injected user/message notices (model-visible), source { kind: 'plugin', plugin: 'dsh-background-agents' } — the throttled progress lines and archive notices (canonical [background-agent <id>] … prefix).
  • the official subagent-settled notice — the child's durable "settled" fact.
  • Team rooms mirror the same discipline: every delivered room message is a durable user/message in the member's own log, and the shared timeline mirrors as log-only team-room/fact events in the team_rooms storage domain.

The backgroundAgents projection folds the structured channel and keeps the legacy folds; the dashboard value and bg_list facts reconstruct on every reopen without parsing human-readable notice text. When the catalog itself is unavailable, bg_list returns an explicit unrecoverable marker — it never fabricates an empty list.

How this relates to the built-in subagent tools

The harness core ships its own subagent tools (subagent, send_message, interrupt_agent, and the child-side report tool). This plugin's bg_* tools are their session-scoped companions; both can be mounted together:

Built-in toolThis pluginDifference
subagent (backgroundMode: 'continuable')background_agentSame startContinuable seam; this plugin adds per-child tool_filter/persona/max_depth validation and the per-session cap
send_messagebg_messageSame delivery semantics; bg_message addresses this conversation's background agents and maintains the projection facts
interrupt_agentbg_stopSame interrupt semantics; bg_stop also records a structured stop fact
child-side report toolautoReportThe built-in is called by the child model itself; this plugin injects throttled progress after every child turn automatically

What the core tools lack: bg_list, bg_result, idle archiving, and the per-parent folded panel projection.

Not in scope: scheduled triggering (the schedule seam exists), cross-machine/remote agents, and any change to the official subagent activation contract.

Not this plugin

ProjectWhat it doesThe boundary
titanwings/dsh-automationScheduled coding tasks in fresh agent sessionsIt owns when tasks run (scheduling). This plugin owns interactive steering of one long-lived conversation — no scheduler seam, no cron.
vlln/dsh-task-statusStatus bar for background jobs (progress + output tail)It displays tool-level jobs. This plugin creates and steers agent sessions; its dashboard is one panel of it, not the product.
YYTbit/dsh-plugin-agent-dashboardMulti-agent dashboard skillDisplay-oriented. This plugin's rows are actionable: jump into the child session, send messages, stop — through the official control plane.

Permissions & data

  • Permissions: the workshop manifest declares session:append, subagent:spawn, and tools:register.
  • Data: team rooms live in the team_rooms storage domain (SQLite or JSONL — zero extra services); background-agent facts ride the parent session log. No separate database, no network.
  • Session log: background-agents/fact and team-room/fact events are appended with the envelope's ignorable: true marker on hosts that honor it (pre-marker hosts are detected and fact appends are skipped — see allowUnmarkedFacts); the model-visible progress lines and room deliveries are real user/message records.

Security boundaries

  • Official seam only. Start, message, and stop are thin adapters over startContinuable / followup / interrupt; stop requests interruption and never kills processes.
  • tool_filter only restricts. It removes tools from the child's view — never grants new ones; names are validated against allowedChildTools.
  • Approval-gated handoffs. room_transfer_task routes through the official approval seam and fails closed when no answerer grants it.
  • Model-visible ⟺ logged. Every delivered room message is a durable user/message in the member's own log; the shared timeline mirrors as log-only team-room/fact events.
  • No scheduling, no cross-machine agents. Children are process-local continuable sessions of the deployment.

Known limitations

  • Team rooms require the storage domain to be composed; without @deepseek-ai/dsh-storage-domain, the /room command and room_* tools are disabled (the five bg_* tools still load).
  • provider must name a continuable-capable provider (prepareContinuable); a missing provider makes background_agent fail until it appears.
  • maxBackgroundAgents is a shared budget across every continuable direct child of the session, including ones the built-in subagent tool started.
  • One-shot children are never listed or messaged — bg_list keeps continuable rows only.
  • Children are process-local: the schedule seam owns "when", this plugin owns steering a live conversation.

Development

pnpm install        # tooling only; harness packages resolve against a sibling checkout
pnpm run typecheck  # strict TS, node + client programs
pnpm test           # vitest: unit + end-to-end tests (real subagent seam, scripted LLM, jsdom panel)
pnpm run build      # lib/index.js (node half) + lib/client.js (web client bundle)
pnpm run gen-aliases  # re-map harness package paths after the checkout moves

A keyless end-to-end demo drives a real parent session and a background child through a deterministic scripted LLM (no API key; dev/ is gitignored — adapt the paths to your checkout):

$env:DSH_HOME = 'D:/deepseek-harness/Project/Plugins/dsh-background-agents/dev/dsh-home'
pnpm dsh --profile headless --patch dev/cordis.yml "【父会话】驱动后台 agent 演示"

Topics

dsh, dsh-plugin, deepseek-harness, subagent, background-agent, background-agents, agent-dashboard, conversation-steering, team-rooms, multi-agent, message-bus, task-board, collaboration

Contributors

  • @PerryLink — creator and maintainer: the background-agent runtime on the official subagent seam, the team-room hub, the Web UI sidebar panel, the session projections, docs, CI/CD and releases.

This project is one of the DeepSeek Harness plugins maintained by PerryLink. If this one helps you, the others likely will too:

PluginOne-liner
dsh-mcp-panelRead-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors
dsh-doublecheckEngineering-discipline guard: requirements grill, test gates, adversary review
dsh-background-agentsDurable background child agents with a Web UI sidebar, messaging and interrupt
dsh-lsp-actionsLSP diagnostics, formatting, completion, code actions and rename over language servers
dsh-output-stylesClaude Code outputStyles-equivalent runtime style switching
dsh-checkpoint-rewindClaude Code /rewind-equivalent: snapshots, session forks, one-shot restore
dsh-permission-rulesClaude Code-style declarative allow/deny/ask permission rules with audit
dsh-auto-reviewSecond-model auto-review on the approval chain, fail-closed by default
dsh-mementoApproval-gated cross-session memory: ctx.memory seam + SQLite + memory tool
dsh-skill-pack-securitySecurity-audit skill pack: secret scan, dependency and supply-chain review
dsh-session-pinPin sessions in the Web sidebar with durable ordering
dsh-composer-historyTerminal-style input history for the web composer: arrows, Ctrl+R search
dsh-githubGitHub PR/issues integration for DSH, every write gated by approval
dsh-plugin-guidePlugin-development knowledge base as an on-demand agent skill
dsh-claude-moveMigrate Claude Code sessions, memory, skills and CLAUDE.md into DSH

License

Apache License 2.0 © 2026 dsh-background-agents contributors

Plugins associés