Skip to content

Latest commit

 

History

History
155 lines (111 loc) · 6.95 KB

File metadata and controls

155 lines (111 loc) · 6.95 KB
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

npm license tests deps

dsh plugin --profile web add dsh-abyss && dsh web

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
Timeline
Timeline: assignments, messages, reports and failures in real time order; long histories fold.
Stats
Stats: spend, tokens, tool calls, failures, retries, compactions, time blocked on a human, elapsed — plus per-member context load and attendance lanes.
Org
Org: the delegation tree grown from real parent/child sessions.

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 web

Open 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)
Install from source (before the package is on npm)
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 web

dsh 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=.

The panel is embedded in the product's own page and its data is served on the same origin under /abyssno 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 scenes

Invalid configuration fails loudly at load rather than being ignored.

Docs

Tests

npm test        # 113 cases: projection + host wiring + the shipped browser bundle

The 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.