dsh-jev
Verified@buberlo/dsh-jev Β· v0.1.4 Β· MIT Β· Web UI
Jev-powered decision layer plugin for DeepSeek Harness
Install
dsh plugin add @buberlo/dsh-jev Confirm the layer applied with dsh --profile default --dump-config β see the install guide.
Source
Tags
Creators
Readme
@buberlo/dsh-jev
The Jev decision layer plugin and bundle for DeepSeek Harness (DSH).
DSH plans, calls tools, and runs them. Jev makes the small, fast decisions in between β and this plugin maps those decisions onto supported DSH behavior. It can only narrow or gate, never widen a permission.
pre-step βββΆ Jev: which tools are relevant? βββΆ tools.restrict
tool call βββΆ Jev: is this call safe to run? βββΆ ask / hold / deny
result βββΆ deterministic loop guard (no model)
request βββΆ Jev: which configured model? βββΆ verified route
Install
dsh plugin --profile <name> add @buberlo/dsh-jev
dsh --profile <name> --dump-config # shows the "# == @buberlo/dsh-jev" layer
The bundle inserts one row; defaults are provider: mock + mode: shadow:
deterministic, offline, and behavior-neutral.
Configure
- id: jev
name: '@buberlo/dsh-jev'
config:
provider: mock # mock | live
mode: shadow # off | shadow | enforce
selection: # dynamic tool preselection
enabled: true
alwaysAllow: [read_file]
categories:
files: 'Reading or writing workspace files'
tests: 'Running or inspecting tests'
toolCategories:
read_file: [files]
run_tests: [tests]
assessment: # per-call semantic check
enabled: true
onFailure: ask # ask | hold (never an allow)
skills:
enabled: true
modelRouting:
enabled: false
routes:
fast: { provider: deepseek-official, model: deepseek-v4-flash }
reasoning: { provider: deepseek-official, model: deepseek-v4-pro }
Live API β two explicit settings, never implicit:
provider: live
mode: shadow # live + shadow still transmits state
apiKey: !!js process.env.TYPESAFE_API_KEY
Web client
In a web/desktop profile the bundle ships a configuration page on the Plugins page: provider, live mode selector, a write-only API key field, and the five feature toggles. Writes go to the host settings document and reconfigure the running service immediately.
What it does
| Extension point | Decision |
|---|---|
agent/pre-step |
tool selection across independent categories; scoped tools.restrict, recomputed every turn |
tools/pre-execute |
call assessment: task fit, missing information, explicit restriction conflict |
tools/result + tools/guard |
bounded loop detection; identical repeated calls are denied |
agent/request |
model routing to a configured route, only when verified available |
ctx.skills |
at most one skill hint per turn; bodies are never auto-loaded |
Guarantees
- No implicit live access.
provider: livewithout an explicit key fails at plugin load. - No model-derived permissions. Failures, timeouts, stale snapshots, and
validation errors produce
ask/hold. - No premature allow. The listener always delegates first and composes monotonically; later policies are never skipped.
- No widening. A Jev selection intersects with existing restrictions.
- No stale decisions, no cache. Decisions are bound to a turn/catalog snapshot; changed arguments are assessed again.
- Bounded data. Only task text, tool metadata, and bounded/redacted arguments leave the process.
Documentation
- Project: https://github.com/buberlo/dsh-jev
docs/policy.mdΒ·docs/architecture.mdΒ·docs/upstream-compatibility.mddocs/getting-started.mdΒ·docs/skills.mdΒ·docs/publishing.md
License
MIT