envoy-dsh
Verifiedenvoy-dsh ยท v0.1.26 ยท Apache-2.0
Paste a link, get citable material: articles, PDFs, audio, Douyin/Bilibili/Xiaohongshu. Same 60 turns with vs without: finishes reading 22%->92%, times out 68%->0%, cites a real fact 23%->82%. On 123 live links 80% came back usable (93% of the pages that
Install
dsh plugin add envoy-dsh Confirm the layer applied with dsh --profile default --dump-config โ see the install guide.
Source
Tags
Readme
Envoy for DeepSeek Harness
This package is a DeepSeek Harness bundle for Envoy. It does three things in one install:
- mounts Envoy's stdio MCP bridge with
@deepseek-ai/dsh-mcp-client; - registers an adapted Envoy Agent Skill on the public
ctx.skillsservice; - listens to the
agent/pre-stepevent and, on the first step of a turn whose user message contains a public link, prepends one short routing message.
The adaptation keeps Envoy's reading, discovery, expansion, visual handoff, and
capability behavior. It changes only the integration surface: the skill uses
the mcp__envoy__* tool names that DeepSeek Harness assigns to the mounted
server.
ไธญๆๅฟซ้ๅฎ่ฃ ยท Envoy ๅฎ่ฃ ๆๅ
One link in, AI-ready material out
Whatever you are looking at, hand it over and get the thing you wanted out:
Markdown, a wiki page, a knowledge-base entry. Douyin, Bilibili, Xiaohongshu,
Zhihu, WeChat posts, articles, PDFs and podcasts all take the same path. A read
returns a source-linked transcript with timestamps, frames, and a material_id
you can quote, so the agent writes from what was actually said, not from the title. For a whole feed,
envoy collect checkpoints every item, so an interrupted run resumes instead
of restarting.
Measured on 123 live links across those platforms: 80% usable as source material โ that is 93% of the links that answered at all โ with 0 failures and every gap named.
Same 60 turns per arm, with and without the bundle: finishes reading 22% โ 92%,
times out 68% โ 0, answer quotes a real fact from the source 23% โ 82%.
That A/B is exploratory (different caps, no human correctness review); the per-read
behaviour is what the tests assert.
The harness is in docs/experiments/link-compatibility.md; rerun it with
scripts/acceptance/link_coverage.py.
The same Envoy skill ships for Codex and Claude Code; this package is the DeepSeek Harness build, and the deliverables are the same Markdown, wiki, or knowledge-base material on all three hosts.
What changes when it is installed
Same model, same links. The difference is what a read puts in front of the agent.
| Ask | Harness on its own | With this bundle |
|---|---|---|
| Long article, WeChat post, Zhihu column | Truncated text, or only the digest | Body text with headings and source locators |
| First pages, or a screenshot of the page | Per-page text with page numbers and locators | |
| Video (Douyin, Bilibili) | Title, cover, description, danmaku | Bound player file; captions or ASR with a coverage figure; frames when the host declares it can show them |
| Audio | Nothing usable | Timestamped transcript; low confidence and no-speech are stated, not hidden |
| Login wall | 403, empty body, or a captcha page | challenge_required plus the human step: import cookies for one site scope, or sign in once |
| Unreadable page | A plausible guess | partial with the part that was read, and the gap named |
The turn-level A/B we ran is exploratory, not a claim: the two arms had different time limits (900 s and 2400 s) and one arm was graded terminal-only. Article-level citation counts came out level within noise over 60 turns per arm. What this bundle guarantees is the per-read behaviour above, and the tests assert it.
What stays the same without the bundle
Reading a link without Envoy still works. What the bundle adds is not a new capability the model lacks, but a bounded one: declared visual input, a retained material you can search instead of re-fetching, an explicit gap when a source cannot be read, and a human step instead of an executable command when the page needs one.
Requirements
- DeepSeek Harness with the Plugin Manager (
engines.dshis>=0.1.5). - macOS, Linux, or Windows. The launcher is plain Node (
node -e <script>), written once inlaunch.cjs, so every platform mounts the same bridge. On Windows the private runtime lives under%LOCALAPPDATA%\envoy-dsh\runtimeand its executables areScripts\envoy.exe/Scripts\python.exe.
Nothing else. No separate CLI install, no envoy browser setup, no Python
preflight: on first use the bundle provisions the pinned runtime wheel into
~/.local/share/envoy-dsh/runtime (%LOCALAPPDATA%\envoy-dsh\runtime on
Windows) with uv or the system Python's venv, and the isolated Chromium is
installed the first time a page actually needs a browser. An envoy already on
PATH is used as-is when it is new enough. The one machine it cannot cover has
neither envoy nor uv nor python; the mount then fails with a single line
naming uv. Browser profiles, ASR, and OCR stay optional and on-demand โ see
INSTALL.md when a task needs them.
A visible window is not the agent's to open
Envoy reads headlessly. When a page needs the user's identity, the tool returns
requires_human: true inside details.needs_user_action; relay the question and
options to the user, stop, and wait for their answer. Do not set
ENVOY_VISIBLE_BROWSER, and do not run a command that opens a window. Visible
mode only works for a human at an interactive terminal (stdin and stdout both a
TTY, with explicit opt-in); the CLI refuses it under this plugin's stdio
transport, so a login prompt with no window on screen is expected.
Install
In the app: Plugin Manager โ search Envoy โ Install. That is the whole flow โ
the bundle ships its own Harness patch, so nothing in the profile is edited by
hand.
From a shell, one command (it finds the CLI inside the desktop app when dsh
is not on PATH):
curl -fsSL https://raw.githubusercontent.com/regrevia/Envoy/main/integrations/install.sh | sh -s -- dsh
Without the script it is the same single command, optionally with
--profile <name>:
dsh plugin --profile web add envoy-dsh
A release tarball (envoy-dsh-<version>.tgz on the GitHub release) installs
with the same command and does not wait on the npm registry, which publishes
separately.
Developing against a checkout instead: Plugin Manager โ Install bundle โ
/absolute/path/to/Envoy/integrations/dsh/envoy-dsh, or plugin_manager with
action: install_bundle and that directory as target.
The first link read is slower than the rest: that is the one-time runtime
download, plus the Chromium install when the page needs a browser. Set
ENVOY_DISABLE_AUTO_BROWSER_SETUP=1 before Harness starts to keep the browser
install manual (envoy browser setup) instead.
Which profile did it land in
A bundle install targets one profile, so a machine with several profiles can have Envoy in one and not the other. Confirm the profile of the session you are actually using before concluding it is missing:
echo "$DSH_PROFILE" # the profile this shell serves
readlink ~/.dsh/profiles/$DSH_PROFILE/node_modules/envoy-dsh
A symlink pointing at this directory means the repo copy is live and edits apply
without reinstalling. The envoy skill appearing in the skill catalog is the
same evidence seen from inside a session.
The bundle inserts two rows:
| Row | Package | Purpose |
|---|---|---|
envoy-mcp |
@deepseek-ai/dsh-mcp-client |
Starts envoy mcp (core toolset) and exposes four link tools as mcp__envoy__*. |
envoy-skill |
envoy-dsh |
Registers the Envoy skill provider and the link-routing agent/pre-step hook. |
core exposes envoy_read, envoy_expand, envoy_search, and
envoy_observe. The full toolset adds local-video, discovery,
collection, replay, visual-history, and doctor tools. Export
ENVOY_MCP_TOOLSET=full in the Harness environment and restart the bundle
when those are needed. Starting with
core keeps the MCP tool declarations, which enter every request prefix, small
for ordinary link reading. The choice is static for the process lifetime.
Runtime resolution
The Harness GUI may not inherit a login shell's PATH, so the patch prepends the usual uv and Homebrew entries and then takes the first of these that answers:
| Order | Source | When it applies |
|---|---|---|
| 1 | ENVOY_BIN |
A pinned binary, including builds newer than the release wheel. |
| 2 | envoy on PATH |
uv tool install, Homebrew, or a manual install. |
| 3 | ~/.local/share/envoy-dsh/runtime/bin/envoy |
Provisioned from the pinned release wheel on first start. |
Set ENVOY_DSH_VERSION to provision another released version. To point the
bridge at a source checkout or a development build, set ENVOY_BIN to its
absolute path. toolCallTimeoutMs is 300 seconds, above Envoy's default
180-second work budget.
Verify
After installation, check that:
- Plugin Manager shows Envoy Link Reader / Envoy ้พๆฅ้ ่ฏปๅจ with the bundled bird icon.
- The agent's tool list contains
mcp__envoy__envoy_read,mcp__envoy__envoy_expand,mcp__envoy__envoy_search, andmcp__envoy__envoy_observe. The advanced tools appear only after a restart withENVOY_MCP_TOOLSET=fullin the Harness environment. - The skill catalog contains
envoy; loading it shows# Envoy Link Reader in DeepSeek Harnessandmcp__envoy__tool names. envoy doctor --jsonreports0.1.9and the expected capability catalog. When the bridge runs withfull,mcp__envoy__envoy_doctoris equivalent.- On the first step of a turn that contains a public URL, the model sees one
injected
[envoy-link-routing]message. A linkless prompt, a follow-up step, a localhost/private URL, or a prompt containingไธ่ฆ็จ Envoygets no injection. The hook fails open: if anything throws, the original turn continues unchanged.
failOnStartupError: true makes a missing or broken runtime visible as a
failed envoy-mcp row instead of silently leaving the agent without the
tools. The rest of the profile remains usable.
Layout
integrations/dsh/envoy-dsh/
โโโ package.json # bundle manifest and display exports
โโโ cordis.patch.yml # MCP client + skill provider rows
โโโ index.js # skill provider + agent/pre-step link hook
โโโ locale/{en,zh}.json # Plugin Manager title and description
โโโ icon.png # downscaled Envoy bird artwork
โโโ skill/
โ โโโ envoy.md # generated DSH skill body
โ โโโ manifest.json # generated name/description
โ โโโ references/
โ โโโ protocol.md # generated protocol reference
โโโ README.md
โโโ LICENSE
โโโ NOTICE
index.js is hand-written and mirrors the shared policy in
packages/envoy-cli/src/envoy_cli/hooks.py (URL extraction, private-address
filtering, opt-out, six-point wording) without importing host internals. Keep
the two in sync when the policy changes; tests/test_dsh_plugin.py runs the
same parity corpus through both implementations.
The skill assets are generated from the canonical
integrations/skills/envoy/SKILL.md and
integrations/skills/envoy/references/protocol.md. Do not edit them by hand.
Regenerate and test
python3 scripts/build_envoy_dsh_plugin.py
python3 scripts/build_envoy_dsh_plugin.py --check
pytest -q tests/test_dsh_plugin.py
The generator prefixes Envoy tool names, keeps the CLI commands unchanged,
replaces the generic โMCP-compatible hostโ launch section with the
DeepSeek Harness host description, and synchronizes the package version with
packages/envoy-cli/pyproject.toml.
License
Apache-2.0. See LICENSE and NOTICE. The icon is the Envoy
bird artwork from frontend/public/brand/envoy-bird.png, redistributed under
the same license.