Skip to content

dsh-agents-in-the-loop

Verified

dsh-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 on agents.resume({ resumeSessionId }), which dsh 0.1.2 introduced. Declared in package.json via engines + optional peerDependencies (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/dsh engines key, which is advisory).
  • Verified against: dsh 0.1.2 through 0.1.6-alpha.1 (tools service register(), workspaceRegistry/agents inject, agent/created / agent/disposed events, 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): send accepts the REGISTERED CONTACT NAME as target β€” 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. Raw session-… ids still work verbatim. Successful sends report resolvedFrom: <contact>; list annotates each live session with its registered contact name.
    • 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: true resurrects a dead target first (opt-in).
    • Self-send is refused.
  • 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).
    • call messages the contact through the same delivery engine.
    • Self-registration needs the NAME ONLY: add with no sessionId registers 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.

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