⚡ dsh-fast
Read-only performance diagnostics for DeepSeek Harness.
Observes the session event stream — never the model hot path — and reports where latency and context budget actually go.
Official repository. This is the only official repository of dsh-fast, maintained by PerryLink. Same-name repositories under other accounts are not affiliated.
DSH Market
English · 简体中文 · Español · Português · हिन्दी
dsh plugin --profile <name> add dsh-fast
📖 Ecosystem knowledge base — measured data, not marketing: plugin development guide · plugin-selection data · maintenance criteria.
Install & uninstall
dsh plugin --profile demo add dsh-fast # install
dsh plugin --profile demo remove dsh-fast # uninstall
Verify the row mounts: dsh --profile demo --dump-config | grep dsh-fast.
⭐ 如果它帮到了你
这个插件是 DSH 插件家族的一员(95 个,全部 Apache-2.0)。如果你在用,给个 star —— 它不会解锁任何功能,但会让下一个人在搜索里更容易找到它。
English: part of a 95 plugin family for DeepSeek Harness. If it is useful, a star helps the next person find it — nothing is gated behind it.
What is dsh-fast?
Read-only performance diagnostics for DeepSeek Harness.
Observes the session event stream — never the model hot path — and reports where latency and context budget actually go.
Workflow diagram for dsh-fast: request → policy / review → verdict.
Workflow overview: request → policy / review → verdict. The examples below use the real command surface.
Compatibility
- DeepSeek Harness
dsh-v0.2.1-alpha.1 (adapted 2026-09-18): the session surface is read through the optional sessionQuery service — the deprecated synchronous Session.eventAt(seq) accessor is gone, with an equivalent synchronous read as the fallback — and every registration now lives in one lifecycle effect that releases them in reverse order. Internal implementation change: the reported metrics are identical for the same log. Verified 2026-10-04 against the local gate chain (three typecheck rulers + 71 tests); the compat workflow re-runs the profile install smoke against the published pins.
- Node
^22.19.0 || >=24.0.0, ESM only ("type": "module").
- Peer dependencies:
@deepseek-ai/cordis ^4.0.2, @deepseek-ai/schemastery ^3.18.4, and @deepseek-ai/dsh-session, @deepseek-ai/dsh-tools, @deepseek-ai/dsh-commands, @deepseek-ai/dsh-compaction, @deepseek-ai/dsh-session-query, @deepseek-ai/dsh-storage-domain at >=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0 || >=0.1.7-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0 (devDependencies pin 0.2.0-rc.2); the 0.1.2-rc.1 line stays supported at runtime through a structural fallback to the pre-0.1.5 header.system.
What you get
- Session load timing — publication-to-first-request latency, classified
open (fresh) vs restore (seeded/resumed), plus the restored seed-event count.
- Spill-hit statistics — how many tool results were spilled to a session-scoped artifact (detected from the durable spill notice).
- Compaction count and trigger — total compactions, split
manual (slash command) vs automatic (pressure), and total shadowed tokens.
- Context-injection volume — system-prompt (AGENTS.md + skills + persona), tool-schema, and surface tokens with their shares of the total; the surface bucket is conversation history only (the meter's surface includes the system node on
0.1.5-alpha.1, which dsh-fast subtracts).
- LLM cache hit rate — input / cache-read / cache-write / output tokens aggregated from provider usage, plus the derived hit rate.
- Optimization suggestions — threshold-driven notes (trim skills, tighten tool schemas, compact earlier, enable prompt caching, enable spill-policy, …).
- Async sampling — metrics are folded O(1) per event and snapshotted on a timer, never on the append path.
Quick start
dsh plugin --profile web add github:PerryLink/dsh-fast
git channel
# From a scratch profile (pins the commit; runs the self-contained `prepare` build)
dsh plugin --profile demo add "github:YOUR_ORG/dsh-fast#<sha>"
# The profile's pnpm-workspace.yaml gains an allowBuilds entry for dsh-fast on first add.
npm channel
dsh plugin --profile demo add dsh-fast
Both channels install the bundle row (see cordis.patch.yml) into the profile's dsh.profile.bundles stack and take effect on restart.
/fast namespace collision
/fast is a host command. If another plugin registers a client commandUi
contribution also named fast, the host command menu can drop the whole /
source. That collision is in the host's client command namespace, not something
this plugin can rename at runtime. Workaround: disable/rename the other
plugin’s fast client command, or remove one of the plugins. /fast itself and
fast_report still work when no duplicate client contribution exists.
Examples
These are the plugin's real entry points; install once, then call one.
Detailed example
Command
/fast
Output
dsh-fast 0.1.0 — performance report
session: abc
## Session load
kind: open
seed events: 0
time to first request: 150 ms
## Spill
detected spilled results: 0 (heuristic)
## Compaction
count: 0 (manual: 0, automatic: 0)
shadowed tokens: 0
## Context volume
total: 1000 tokens
system (AGENTS.md/skills/persona): 400 (40%)
tool schema: 200 (20%)
surface: 400 (40%)
## System prompt breakdown
persona: 100 tokens / 400 chars (25%)
skills: 0 tokens / 0 chars (0%)
AGENTS.md: 0 tokens / 0 chars (0%)
other (harness identity + tool guidance): 300 tokens / 1200 chars (75%)
## LLM cache
input: 800, cache read: 200, cache write: 50, output: 100
hit rate: 20%
## Suggestions
- none
Observed from plugins/dsh-fast/src/analyze.ts:88-131; baseline fixture at test/analyze.spec.ts:12-35, 82-100
Failure branch
Input
/fast --history nope
Output
Usage: /fast [--history [n]]
Observed from plugins/dsh-fast/src/index.ts:241-245
Brief examples
Configuration
All tunables are Schemastery Config fields; invalid values fail the profile load loudly.
| Key | Default | Description |
|---|
enabled | true | Master switch; false mounts nothing. |
privacy.includeCwd | false | Include the sanitized session working directory in reports. |
sampling.snapshotIntervalMs | 60000 | How often active sessions are sampled (ms). |
sampling.maxHistorySamples | 20 | Samples retained per session in the durable history. |
thresholds.systemPromptTokens | 20000 | Warn when the system prompt exceeds this many tokens. |
thresholds.toolSchemaTokens | 8000 | Warn when the tool schema exceeds this many tokens. |
thresholds.surfaceTokens | 60000 | Warn when the conversation surface exceeds this many tokens. |
thresholds.cacheHitRateFloor | 0.1 | Warn when the cache hit rate falls below this (0..1). |
thresholds.compactionCountWarn | 10 | Warn once this many compactions have triggered. |
thresholds.compactionShadowTokens | 40000 | Warn when the average shadowed token count per summary exceeds this. |
spill.detectSpilledResults | true | Detect spilled tool results from the durable notice marker. |
Tools & surfaces
/fast — a human slash command that prints the current session's health report: load timing, spill, compaction, context-volume ranking, cache hit rate, and suggestions.
fast_report — a model tool returning the same report as structured JSON (so the model can reason over it), with a human-readable text render.
Permissions & data
dsh-fast consumes only public seams: session/* and agent/* events, the optional ctx.tokenMeter, ctx.storageDomain, ctx.commands, and ctx.tools. It is strictly read-only over the session log — it never mutates the model request, tool results, or the session surface. Metrics are persisted to the dsh_fast storage domain (one bounded history per session), not to the session log. Report identity and the optional working directory are sanitized before any display or durable write.
Security boundaries
- Read-only, zero model-path overhead — folding is O(1) per event; sampling runs on a timer.
- No network, no credential handling — the plugin makes no outbound requests and stores nothing sensitive.
- Fail-loud configuration — every tunable is validated at mount; invalid bounds throw.
- Sanitized display/durable data — control characters are stripped and strings are budgeted;
cwd is off by default and path-truncated when enabled.
- Reversible registrations — every contribution goes through
ctx.effect() / ctx.on() / register(), so uninstall and hot reload are clean.
Known limitations
- Storage domain, not session events — rc.2
Session.append offers no ignorable marker and no external event-registration surface, so a custom fast/* session event would make the persistence coordinator refuse the log on restore. Metrics are therefore persisted to the storage domain; the raw events remain the reconstructable source of truth.
- Spill detection is heuristic — it reads the durable spill notice (
Full … stored at:); no dedicated session event exists.
- System prompt is one bucket — AGENTS.md, skill directory, and persona are all part of the assembled system prompt; since
0.1.5-alpha.1 it is surface node 0 (a system/message) and carries no per-section token accounting, so they are reported together.
- Load timing starts at publication — the disk-read portion of a restore happens before
session/created (owned by sessionPersistence) and is not observable from this plugin's allowed events; the reported duration is publication-to-first-request.
- Degradations are announced once — a host without
tokenMeter falls back to heuristic token pricing, a host without systemPrompt attributes the whole prompt to one bucket, and a failing inspector outlet is ignored; each of these now says so once per process instead of changing what the numbers mean in silence.
Development
pnpm install
pnpm run typecheck && pnpm run typecheck:ci && pnpm run typecheck:checkout
pnpm test
pnpm run build
pnpm run verify:self-contained && pnpm run verify:artifacts
node scripts/check-readme-sync.mjs
pnpm pack
Topics
dsh, dsh-plugin, deepseek-harness, deepseek, cordis, performance, diagnostics, profiling, context-engineering, llm-cache
Contributors
Thanks to everyone who has contributed to dsh-fast:
- PerryLink — author and maintainer: designed and built the read-only diagnostics (session-load timing, spill-hit counts, compaction metrics, context-injection volume, LLM cache hit rate), the
/fast command and fast_report tool, the dsh_fast storage domain, and the five-language documentation.
PerryLink DSH Plugin Family
This project is part of the DeepSeek Harness plugin family from PerryLink. The roster stays collapsed below so every README keeps a short first screen; expand it to see every row and its status.
Expand all plugins
License
Apache-2.0 — see LICENSE.