dsh-audit-trail
Security auditing and session forensics for DeepSeek Harness (dsh): full tool-invocation-chain recording (who/what/files/status/duration) from the session/event stream and tool-dispatch hook, high-risk pattern flagging, SQLite (WAL) persistence with privacy masking, filter/query with JSON/Markdown/JSONL exports, plain-text session replay, and an audit policy tool-set plus a standalone CLI.
安装
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:JohnXu22786/auditrail说明文档
阅读完整 README ↗Configuration
All fields optional. Defaults shown.
interface AuditConfig {
storage: {
/** null => /audit-trail/audit.sqlite
* dshHome = $DSH_HOME || ~/.dsh; AUDITRAIL_DB overrides for the CLI */
path: string | null;
};
redact: {
/** Mask known secret patterns before storing (default true). */
maskSecrets: boolean;
/** Tool-argument digest cap in chars. */ truncateArgs: number; // 512
/** Summary cap in chars. */ truncateSummary: number; // 240
/** Detail JSON cap in chars. */ truncateDetail: number; // 4096
/** Max file paths captured per record. */ maxFiles: number; // 16
/** Max outbound destinations captured per record.*/ maxNetwork: number; // 16
/** Extra secret regex patterns (regex source). */ extraSecretPatterns: string[];
};
rules: {
/** Built-in rule ids to disable, e.g. ["net:plaintext-http"]. */
disabledIds: string[];
/** Operator rules added to (not replacing) the default table. */
custom: Array;
};
capture: {
chunks: boolean; // false — record assistant_chunk per token?
turnEvents: boolean; // true
stepEvents: boolean; // true
toolDispatch: boolean; // true — record live tool_dispatch rows
toolRegistered: boolean;// true — record tools/change deltas
};
}
Example (cordis.patch.yml override):
- insert:
- id: audit-trail
name: 'dsh-audit-trail'
config:
storage:
path: '/srv/audit/audit.sqlite'
redact:
truncateArgs: 256
extraSecretPatterns:
- '\\bCUSTOM_SECRET_[A-Z0-9]{20,}\\b'
rules:
disabledIds:
- 'net:plaintext-http'
custom:
- id: 'my:purge'
severity: 'critical'
pattern: '\\bpurgelogs\\b'
scope: 'args'
capture:
chunks: false