deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:royenheart/dsh-plugin-opencode-omo
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
A DeepSeek Harness plugin that adds an opencode-omo agent preset (mode) to the web profile. The mode replicates the behavior of opencode + the omo plugin (oh-my-openagent), scoped to this mode only — other presets (standard/…) keep the default dsh loop, sandboxed fs, and no omo hooks.
default.txt persona (tone, style, proactiveness, conventions, code style, task guidance) + omo's Sisyphus orchestrator identity, declared as the complete system prompt: the dsh harness identity and runtime-context snapshot are suppressed for this mode. The loop shim additionally prepends opencode's live environment block (exact model id, working dir, workspace root, git, platform, date, recomputed every step).conversation.input.left tool-row slot (after the access/plan chips): sisyphus, hephaestus (Deep Agent), prometheus (Plan Builder), atlas (Plan Executor), sisyphus-junior, athena/athena-junior/council-member, metis, momus, oracle, librarian, explore, multimodal-looker. Selecting a role swaps the session's complete system prompt and applies that role's configured model.settings.section): per-role primary model dropdown (follow current / fixed) under a centered "Primary model" label; a dsh-style circle "+" button opens a fallback model list below the role box (repeatable additions, cancel/close adds nothing), persisted in opencode-omo-roles settings. On request failure the loop shim advances through the role's fallback chain before the harness retry policy runs.bash, read/write/edit/read_image, apply_patch, glob/grep, todo_write, skill, web_fetch/web_search, lsp, exit_plan_mode (plan), ask_user_question. tool-surface.mjs overwrites the model-visible descriptions/parameters with opencode's tool/*.txt text and shims read/edit/write/web_search to opencode's parameter names (web_search.query → dsh queries).task() surface — task-shim.mjs registers the omo-style task(category/subagent_type/load_skills/run_in_background/task_id) invocation, mapping it onto dsh named subagents + generic delegation.oracle (read-only advisor), librarian (external docs/code search), explore (codebase grep), metis (pre-planning), momus (plan reviewer), multimodal-looker (media), plus generic subagent/subagent_fork + workflow/ralph.skills/ + omo's rules-injector (.omo/rules, .cursor/rules, .github/instructions, copilot-instructions.md).comment-checker (rejects AI-slop comments on write/edit), hashline (read tagging N#HH|content + hashline_edit stale-ref guard).dsh-fs-local) + persistent PTY shell, isolated from other modes' sandboxed fs/shell.driver.mjs is an ordinary preset plugin using the shipped seams: a dynamic ctx.systemPrompt.section({ complete: true }) recomputes opencode's env block and the selected omo role prompt per assembly; system-prompt/assemble applies opencode's model tool gating; agent/inbox/claimed, agent/pre-step, agent/request, and agent/request-error provide ultrawork detection, maxSteps, role model routing, and fallback retry. Other presets are untouched by construction.cordis.patch.yml # bundle patch: self host row
install.py # idempotent install/uninstall (incl. user preset root)
src/ # host + client plugin halves (role registry, settings, picker UI)
lib/ # built host/client bundles (npm run build)
scripts/build.sh # typecheck + tsdown build
presets/opencode-omo/
agent.cordis.yml # the composition (tools, roles, hooks, LSP)
preset.yml # display metadata
persona.md # opencode default.txt + omo Sisyphus persona
roles/*.md # subagent personas (also main-role prompts)
roles/prompts/*.md # primary-role complete prompts (hephaestus/prometheus/atlas/…)
skills/ # omo shared skills
driver.mjs # native-seam loop shim (prompt/route/fallback/maxSteps/ultrawork)
rules.mjs # rules-injector
comment-checker.mjs # comment-checker hook
apply-patch.mjs # apply_patch tool
hashline.mjs # omo hashline read-tagging + hashline_edit
lib/ is generated locally and is not committed. install.py always builds the repository's own toolchain first (npm install when the toolchain is missing, then npm run build) and only reports an error when npm itself is missing:
python3 install.py install --profile web # install (idempotent)
python3 install.py uninstall --profile web # remove
install.py symlinks the package into ~/.dsh/profiles/<profile>/node_modules/, edits the profile's package.json (adds/removes the dependency + bundle entry), and publishes the preset through dsh's native user preset root as a real directory under $DSH_HOME/.agent-presets/opencode-omo (entries symlinked into the package, so updates stay live):
Manual alternative — the package is a dsh bundle: it declares dsh.bundle.patch and ships the preset. dsh plugin reconciles dsh.profile.bundles from the installed package automatically:
dsh plugin --profile web add link:/path/to/dsh-plugin-opencode-omo
The preset still needs its user-root publication (the bundle patch cannot create $DSH_HOME/.agent-presets entries):
mkdir -p "$DSH_HOME/.agent-presets/opencode-omo"
for f in /path/to/dsh-plugin-opencode-omo/presets/opencode-omo/*; do
ln -s "$f" "$DSH_HOME/.agent-presets/opencode-omo/"
done
Restart dsh and select opencode-omo from the mode picker.
Optional LSP server. The preset preconfigures typescript-language-server for the lsp tool. install.py checks PATH and warns when it is missing; the preset then self-disables its lsp-stdio row so the mode still mounts (LSP queries fail gracefully instead of blocking the whole preset). Install it to enable LSP:
npm install -g typescript-language-server typescript
then restart dsh.
web_fetch provider. The preset enables dsh's native web_fetch tool (fetch: true). Official 0.1.2 already registers @deepseek-ai/dsh-web-fetch-http in the base bundle, so this plugin does not insert a second fetch row (that would throw WEB_DUPLICATE_PROVIDER). web_search keeps using the existing DeepSeek search provider (DEEPSEEK_API_KEY). Other presets keep fetch: false, so their tool surface is unchanged.
This release ships no dsh patches. Official 0.1.2-alpha.2 has no PreStepDecision.assistantPrefill; the plugin no longer carries patches/0001-agent-pre-step-assistant-prefill.patch which is:
maxSteps still fires. The ceiling text is opencode's verbatim MAX_STEPS_PROMPT, injected as a system-prompt section on the step that hits the cap. That is the supported 0.1.2 path (ctx.systemPrompt.section), not a silent drop.
These are intentional and will not match stock opencode until discussion #2407 (or an equivalent) lands upstream:
| Surface | opencode / patched-harness | This plugin on stock 0.1.2 |
|---|---|---|
Role of MAX_STEPS_PROMPT |
Assistant-role continuation at the end of the request | System-prompt prefix for that step |
| Session transcript / stats / compaction | Request-only (header), not a session message | Also not a session message (system section is reassembled) |
| How strictly models stop / wrap up | Tuned for an assistant tail | May treat a system reminder more weakly or more strongly |
| Token placement | Extra assistant tokens on that request | Extra system tokens on that request |
| Reconstructable-requests | Logged on request/header |
Rebuilt from the live prompt assembly |
The plugin no longer scans the installed @deepseek-ai/dsh-agent-loop for a leftover assistantPrefill marker and no longer serves compat.warnings to the browser. Stock 0.1.2 is the only supported path; a local harness with the old seam simply uses the same system-prompt section.
Provider-visible format/toolChoice remains an unpatched proposal; omo's regular path does not use it.
Everything else runs on unmodified dsh seams: the preset is published through $DSH_HOME/.agent-presets and the composer picker occupies the existing conversation.input.left slot.
Runners and reproduction notes live in tests/benches/; reports are written to docs/exps/. The scientific methodology (paired design, McNemar/bootstrap/TOST, A/A noise floor, trace alignment, cache and latency protocols) is documented in docs/exps/2026-08-16-scientific-bench-methodology.md. Design highlights:
opencode-omo mode, isolated $DSH_HOME) and the machine's installed opencode + oh-my-openagent (isolated XDG_CONFIG_HOME).deepseek-official/deepseek-v4-pro (dpsk v4 pro); the API key comes from the DEEPSEEK_API_KEY environment variable. Scripts hardcode no machine paths or secrets.bench_metrics.mjs normalizes token usage (including cacheRead) and tool timestamps on both sides; eval_perf.mjs / eval_swe_perf.mjs produce cache hit rate, TTFT, step duration, and per-tool timing offline (see report §5).entry_point; the scripts infer the function name from the first assert fn(...) or the reference def fn. The old implementation hardcoded Function name: undefined, which was the root cause of MBPP behavioral divergence (see report §0 and §6.4).tests/benches/.data/ and is not versioned; fetch-benches.sh reproduces the downloads and setup-homes.sh reproduces both isolated homes.| level | dsh pass@1 | opencode+omo pass@1 | per-item agreement |
|---|---|---|---|
| HumanEval (30 tasks × 3 repeats) | 1.00 | 1.00 | 1.00 |
| MBPP (corrected entry_point, 5 tasks × 2 repeats) | 1.00 | 1.00 | 1.00 |
SWE-bench-verified-mini sample (sphinx-doc__sphinx-10323) |
same patch | same patch | byte-identical git diff |
Full report: docs/exps/2026-08-15-opencode-omo-equivalence-bench.md; raw transcripts are under tests/benches/.runs/.
tools/pre-execute deny mirror); opencode maxSteps + verbatim MAX_STEPS_PROMPT; verbatim opencode plan.txt / plan-mode.txt with dynamic ${planInfo} and the plan→build BUILD_SWITCH reminder; omo role catalog/display names; sisyphus/hephaestus/atlas/sisyphus-junior + specialist subagents; comment-checker/hashline/rules-injector hooks; generated Sisyphus routing sections; extracted omo Sisyphus model-family templates (GPT-5.5/GPT-5.4/claude-opus-4-7/claude-opus-4-8/claude-fable-5/gemini/kimi-k3/kimi-k2-7/kimi-k2-6/glm-5-2, with the dynamic Sisyphus fallback for unknown families) plus hephaestus GPT variants, all 8 atlas variants, and specialist model variants (oracle/metis/momus); omo-default per-role PRIMARY model resolution (provider-scope ordered) and fallback chains that start AFTER the primary; omo role sampling defaults (sisyphus/hephaestus GPT effort medium, atlas temperature 0.1); omo-style retryable-error gating before fallback advance; reasoning-effort selectors in role settings; ultrawork keyword override; /start-work, /remove-ai-slops, /refactor, /stop-continuation, /handoff, /hyperplan, /team-mode commands; composer role picker + global per-role model/fallback settings; omo skills published as user-dsh so the third-party skills-manager can manage them. The omo rules-injector text is now folded into the complete system prompt (driver.mjs + rules.mjs) instead of being dropped by suppressRuntimeContext(); approved plans are persisted at .opencode/plans/<created>-<session>.md; specialist subagent personas now load the extracted reference prompt files (oracle/librarian/explore/metis/momus/multimodal-looker).dsh-plugin-mcp-support mounts native @deepseek-ai/dsh-mcp-client servers from its bundle-row config or the persisted mcp-support settings namespace.dsh-plugin-structured-output provides opencode-style /json-schema + StructuredOutput validation on native seams (no dsh-side format field). Its visibility is opt-in per preset via Settings → 结构化输出工具 (Structured output); no mode is enabled by default.tool_choice: required; hooks are regex/simplified ports; AGENTS.md injection is dsh-native; child subagents inherit the session model because dsh child headers/descriptors do not carry the subagent role id (primary-role sampling defaults ARE applied).format/toolChoice remains a proposal; the standalone structured-output plugin covers the common route.MAX_STEPS_PROMPT is a system-prompt section, not an assistant-role request tail. Same text and trigger; models may treat the role differently than opencode. Tracked upstream as discussion #2407.GenerateOptions.format / toolChoice. omo's regular path does not use them; the standalone structured-output plugin covers the common route..opencode/plans/* after exit_plan_mode approval. A first-class plan-file seam remains an optional improvement.CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。