deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:CharlotteN7/dsh-ocsf-forwarder
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
A read-side SIEM forwarder for DeepSeek Harness. It observes the
session event firehose, normalises every event to OCSF 1.9.0 with the native ai_operation
profile, and writes newline-delimited OCSF JSON to a local append-only spool — optionally shipping
it to Splunk HTTP Event Collector or an OTLP/HTTP collector.
📖 Full documentation — including the complete event → OCSF mapping table for all 44 session event types.
session/event, session/created and session/disposed, and sweeps
ctx.sessions.list() at mount.tool/call ↔ tool/result and approval/asked ↔ approval/decided, emitting
approval decision latency — the approval-fatigue signal.mcp__<server>__<tool> call.Session.append() cannot set the envelope's ignorable
flag, so a plugin-owned event type makes the next resume throw SessionFormatUnsupportedError
and refuse the entire session. All durable output goes to our own sink, and the plugin registers
no waterfall listener, so it cannot change a tool call, an approval decision or a model request.bash can delete or rewrite the spool. What it buys you is that records leave the
host promptly and that a gap is visible — metadata.sequence holes per session, and a shipper
cursor that stopped advancing.The profile must already compose a runnable agent — a profile carrying only
@deepseek-ai/dsh-base has no agent loop and this plugin would observe nothing:
dsh plugin --profile <name> add @deepseek-ai/dsh-headless@0.1.0-rc.6
dsh plugin --profile <name> add dsh-ocsf-forwarder
dsh --profile <name> --dump-config # verify the row is mounted
Pin @deepseek-ai/dsh-headless explicitly — its npm latest tag still points at 0.0.1-rc.1.
Install from the registry or a packed tarball, not from a git spec: lib/ is a build output
git does not carry.
- id: dsh-ocsf-forwarder
config:
spoolPath: /var/log/dsh/ocsf.jsonl # absolute; created 0640
splunk:
endpoint: https://splunk.example:8088
token: { source: env, variable: SPLUNK_HEC_TOKEN }
privacy:
hmacKey: { source: env, variable: DSH_OCSF_KEY }
Every numeric key must be a positive finite number, and those counting records or files must be
whole numbers — statsIntervalMs is the one exception, where 0 means "only at unload". A value
outside those ranges fails at load, because the alternative is worse than a refused mount:
batchSize: 0 makes the shipper loop without ever advancing its cursor.
The default privacy posture keeps raw values out of the SOC lane — argument values and command lines are digested, URLs reduced to their host. A second restricted lane carries verbatim payloads and must be explicitly acknowledged before it will open.
Every configuration key → · Record format and the mapping table →
Splunk HEC and OTLP/HTTP are both supported; configure exactly one per spool. Delivery is cursor-based off the spool, so a collector outage costs nothing but disk, and the spool refuses to delete an un-drained generation rather than silently discarding unacknowledged evidence.
Splunk and OTLP setup → · Delivery and failure modes →
dsh-netguardBoth packages emit OCSF into one index and share the correlation_uid scheme
<session>:<callId>, so a Network Activity record from netguard joins to this package's Process
Activity record for the same tool call — answering which tool call opened this connection.
metadata.uid is deliberately not shared: this package's key is <session>:<seq> over the
session log's event sequence, and netguard namespaces its own as <session>:netguard:<seq> so a
SIEM deduplicating on that field cannot mistake one package's records for the other's.
nvm use 22 # Node ^22.19.0 || >=24, and pnpm 11
pnpm install
pnpm run typecheck
pnpm run test:coverage
pnpm run test:e2e # boots a real dsh against a mock model; no API key
Design decisions and their rationale live in ADR.md. Security policy is in SECURITY.md.
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。