- 1024 store channel:
npm i -g dsh1024once, thendsh1024 plugin --profile web add dsh-fast(counts toward the deepseek1024.com install ranking).
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.
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.
dsh plugin --profile demo add dsh-fast # install
dsh plugin --profile demo remove dsh-fast # uninstallVerify 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.
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 overview: request → policy / review → verdict. The examples below use the real command surface.
- DeepSeek Harness
dsh-v0.2.1-alpha.1(adapted 2026-09-18): the session surface is read through the optionalsessionQueryservice — the deprecated synchronousSession.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-domainat>=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 pin0.2.0-rc.2); the0.1.2-rc.1line stays supported at runtime through a structural fallback to the pre-0.1.5header.system.
- Session load timing — publication-to-first-request latency, classified
open(fresh) vsrestore(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) vsautomatic(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.
dsh plugin --profile web add github:PerryLink/dsh-fast# 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.dsh plugin --profile demo add dsh-fastBoth channels install the bundle row (see cordis.patch.yml) into the profile's dsh.profile.bundles stack and take effect on restart.
/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.
These are the plugin's real entry points; install once, then call one.
Command
/fastOutput
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
Input
/fast --history nope
Output
Usage: /fast [--history [n]]
Observed from plugins/dsh-fast/src/index.ts:241-245
fast_report
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. |
/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.
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.
- 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;
cwdis 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.
- Storage domain, not session events — rc.2
Session.appendoffers noignorablemarker and no external event-registration surface, so a customfast/*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.1it is surface node 0 (asystem/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 bysessionPersistence) 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
tokenMeterfalls back to heuristic token pricing, a host withoutsystemPromptattributes the whole prompt to one bucket, and a failinginspectoroutlet is ignored; each of these now says so once per process instead of changing what the numbers mean in silence.
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 packdsh, dsh-plugin, deepseek-harness, deepseek, cordis, performance, diagnostics, profiling, context-engineering, llm-cache
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
/fastcommand andfast_reporttool, thedsh_faststorage domain, and the five-language documentation.
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
Apache-2.0 — see LICENSE.