Bundle
agents-in-the-loop
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 contacts is a named directory over session ids. UI intentionally removed in v1.3.0.
- Source
- markelayan
- License
- MIT
- Updated
- Updated 21 hours ago
Readme
# agents-in-the-loop
**Cross-session call center for [DeepSeek Harness (DSH)](https://github.com/deepseek-ai)
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.
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):
- **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
```bash
dsh plugin --profile web add link:/path/to/agents-in-the-loop
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`):
```yaml
- insert:
- id: agents-in-the-loop
name: 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
Install
dsh plugin --profile web add github:markelayan/agents-in-the-loop#1979c144669013b0ac84aff8b14a2a279c43ff28
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install agents-in-the-loop from the hub