dsh-agents-in-the-loop
Verifieddsh-agents-in-the-loop Β· v1.4.1 Β· MIT
DSH plugin: cross-session call center for agents. session_message delivers messages between DSH sessions (idle: visible full-text wake; busy: mid-turn-safe notice; plus runtime-context notes) and resolves targets by registered contact name (stale-id-proof
Install
dsh plugin add dsh-agents-in-the-loop Confirm the layer applied with dsh --profile default --dump-config β see the install guide.
Source
Tags
Readme
dsh-agents-in-the-loop (npm)
Cross-session call center for DeepSeek Harness (DSH)
agents. Two model tools, nothing else: session_message delivers messages
between ANY two sessions on the dsh instance, and contacts is a named
directory over session ids so agents reach each other by alias in one call.
Formerly taskboard-flow β the kanban trigger/triage/task engine was removed in v1.0.0; the messaging core is preserved verbatim.
Compatibility
- DSH
>=0.1.2(hard floor): v0.7.2+ relies onagents.resume({ resumeSessionId }), which dsh 0.1.2 introduced. Declared inpackage.jsonviaengines+ optionalpeerDependencies(the dsh plugin loader does not enforce these fields today β they are the machine-readable contract for installers and humans; npm may warn about the nonstandard@deepseek-ai/dshengines key, which is advisory). - Verified against: dsh 0.1.2 through 0.1.6-alpha.1 (tools service
register(),workspaceRegistry/agentsinject,agent/created/agent/disposedevents, runtime-context notes). - Node
>=20.
Config is file-based (a cordis composition patch). No web UI, no database, no background polling β the plugin is inert until an agent calls a tool.
What it gives your agents
session_messageβ list live sessions; send a message to another session. Delivery rules (battle-tested, preserved):- Target by NAME, not id (v1.3.1):
sendaccepts the REGISTERED CONTACT NAME astargetβ resolved against the live contacts store at call time, so a re-raised agent re-registered under the same name is always reached and stale session ids never bite. Rawsession-β¦ids still work verbatim. Successful sends reportresolvedFrom: <contact>;listannotates each live session with its registeredcontactname. - Idle target + wake (default): the FULL message text is rendered into the target conversation (steer, followup fallback) AND pushed into its runtime context (~30-min TTL). Main GUI sessions start a turn only on user input β the text is visible the moment anyone opens the session.
- Busy target + wake: the full text is injected as a plugin-source notice β visible immediately, mid-turn safe, starts no turn β plus the runtime-context note.
resumeIfDead: trueresurrects a dead target first (opt-in).- Self-send is refused.
- Target by NAME, not id (v1.3.1):
contactsβ a named directory over raw session ids (list/get/call/add/update/remove):- Resolve "advisor" β session id + label + live status in ONE call
(no
session_message list+ guessing). callmessages the contact through the same delivery engine.- Self-registration needs the NAME ONLY:
addwith nosessionIdregisters the calling session automatically (v1.0.0 carries the taskboard-flow v0.7.3 behavior) β never research your own session id. - Names: lowercase
[a-z0-9._-], β€64 chars.
- Resolve "advisor" β session id + label + live status in ONE call
(no
Install
dsh plugin --profile web add link:/path/to/agents-in-the-loop # or: pnpm add dsh-agents-in-the-loop (npm)
cp cordis.patch.yml.example cordis.patch.yml # then edit
Restart dsh web afterwards. The tools appear for every session.
Configuration
One row (see cordis.patch.yml.example):
- insert:
- id: dsh-agents-in-the-loop
name: dsh-agents-in-the-loop
config:
enabled: true
sessionMessage:
enabled: true # kill-switch for the session_message tool
contacts:
enabled: true # kill-switch for the contacts tool
# file: '~/.dsh/taskboard-flow-contacts.json' # default store
The contacts store defaults to ~/.dsh/taskboard-flow-contacts.json β the
historical taskboard-flow path, so contacts created before the rename keep
working. Atomic tmp+rename writes; personal state, never shipped.
Data & cleanup notes
~/.dsh/taskboard-flow-contacts.jsonβ the contacts store (kept).~/.dsh/taskboard-flow-state.jsonβ the old dispatch-state file; the v1.0.0 plugin never reads it and it can be deleted.
Requirements
- A running dsh web deployment (dsh β₯ 0.1.1).
- No other dependencies; no dsh-taskboard needed (the board plugin is no longer required by this plugin).
License
MIT