<div align="center">
<img src="assets/logo.svg" width="96" height="96" alt="Abyss">
Abyss · 深海事务所
Turns a DeepSeek Harness agent fleet into an office you can watch.
Who is working, what it cost, where it is stuck — every number and every line comes from the durable session log.
中文 · English
   !deps
dsh plugin --profile web add dsh-abyss && dsh web</div>
---
<img src="assets/screen-floor.png" alt="The floor: six colleagues working one case in parallel">
The problem
Once a dsh session is running you cannot actually see what happens inside it: how many subagents it hired, who is waiting on whom, which step failed, what the run cost. The terminal shows a stream of text, and when the session ends it is gone.
Abyss draws all of it — and every number, every spoken line traces back to a log in ~/.dsh/sessions. It changes no dsh code; install it and it is there.
Four tabs, four questions
| Tab | The question | Lens |
|---|---|---|
| 🧑 Floor | who is here and what they are doing right now | the present, by person |
| 💬 Timeline | what happened, oldest first | the process, by time |
| 📈 Stats | what it cost, where it is stuck, who is waiting | the totals, by account |
| 🌿 Org | who handed work to whom | the lineage, by relation |
<table> <tr> <td width="50%"><img src="assets/screen-timeline.png" alt="Timeline"><br><b>Timeline</b>: assignments, messages, reports and failures in real time order; long histories fold.</td> <td width="50%"><img src="assets/screen-stats.png" alt="Stats"><br><b>Stats</b>: spend, tokens, tool calls, failures, retries, compactions, time blocked on a human, elapsed — plus per-member context load and attendance lanes.</td> </tr> <tr> <td colspan="2"><img src="assets/screen-org.png" alt="Org"><br><b>Org</b>: the delegation tree grown from real parent/child sessions.</td> </tr> </table>
Why this is not another desktop pet
The ecosystem's pets are decoration. Here every character acts out the record:
| On stage | The dsh fact behind it |
|---|---|
| a staff member | one agent's session |
| their job title | subagent/descriptor.label |
| which firm they came from | subagent/descriptor.provider (claude-code / codex are real other-vendor agents) |
| handing work down | tool/call subagent — its arguments are the brief in the bubble |
| a note flying between desks | tool/call send_message — its text is the line |
| standing at your door | approval/asked / approval/decided — the wait is measured |
| a job going wrong | tool/result.error or the result block's isError |
| filing papers away | compaction/summary.shadowedTokenCount |
| the wage on the nameplate | assistant/message.usage × a configurable price table |
| context load | usage ÷ request/context.contextWindow |
Because dsh enforces model-visible ⟺ logged, replaying a case replays exactly what happened.
Install
Requires a DeepSeek Harness web profile (anything where dsh web runs).
# 1. add it to the web profile
dsh plugin --profile web add dsh-abyss
# 2. restart the web app
dsh webOpen http://127.0.0.1:3080 — the dock sits in the bottom-right corner. No configuration needed.
dsh plugin --profile web add dsh-abyss@latest # upgrade
dsh plugin --profile web remove dsh-abyss # uninstall (takes effect on restart)<details> <summary><b>Install from source (before the package is on npm)</b></summary>
git clone https://github.com/Zongwei9888/dsh-abyss.git && cd dsh-abyss
npm install && npm run build && npm pack
dsh plugin --profile web add ./dsh-abyss-<version>.tgz
dsh webdsh plugin add runs pnpm inside the profile directory, so it honours that directory's .npmrc — point a private registry at $DSH_HOME/profiles/web/.npmrc with registry=. </details>
> The panel is embedded in the product's own page and its data is served on the same origin under /abyss — no second port, no cross-origin allowance.
Small things that matter
- A session is an office, and it survives a restart. Open yesterday's session and the panel rebuilds that office from the logs on disk — staff, the temps that clocked off, and their scenes.
- Ten concurrent sessions stay legible. A session tree is a case; three scopes (this case / this project / all) switch instantly, live cases lead, finished ones fold to one line.
- Export a write-up. One click produces Markdown: staff table, incident list, full transcript — ready for a PR or a weekly report.
- Past cases. The logs on disk are the archive; a case that ended days ago still replays and reports.
- It says when it cannot read something. If a member's log is corrupt the report states it up front — totals that are quietly too small are worse than no report.
- Draggable and resizable, both remembered; double-click the header to send it back to its corner.
Configuration
None required. To change anything, edit the profile's cordis.yml:
- id: dsh-abyss
config:
prices: # per 1M tokens
deepseek-v4-pro: { input: 0.55, output: 2.19, cacheRead: 0.07 }
currency: "$" # unit for wages and write-ups
vendors: # per-firm label, colour and icon
claude-code: { label: "Consultant", color: "#f59e0b", icon: "brain" }
sceneHistory: 200 # scenes a newly connected panel receives
maxTeams: 20 # cases retained (only finished ones are evicted)
caseList: 30 # how many past cases to list
watchPolicy: true # draw other plugins' denials as guard scenesInvalid configuration fails loudly at load rather than being ignored.
Docs
- 📖 [Five-minute tutorial](docs/tutorial.en.md)
- 🏗 [How it is put together](docs/architecture.en.md) — host/browser halves, endpoints, event mapping, testing
- 📝 [Changelog](CHANGELOG.md)
Tests
npm test # 113 cases: projection + host wiring + the shipped browser bundleThe browser tests drive the shipped bundle through a DOM stand-in rather than a copy of its logic — every client defect this project has hit (a shadowed global, an unescaped quote, state held only in the DOM, an inverted toggle, a motion class landing on text) is invisible to a test that reimplements the code.
Critical paths were also driven against the real product: real tasks, three real concurrent sessions, a real approval escalation and real tool failures, with the plugin's numbers reconciled line by line against the raw logs.
Licence
MIT. Icons from Lucide (ISC); the whale, octopus, crab and starfish are drawn to Lucide's spec — see [LICENSE](LICENSE).