Install verification: runtime verified (L5) · tested on dsh 0.2.1-rc.3 · last checked Install verification details →
Showing badges for the 5 most recent dsh versions; older ones are hidden.
Data as of (UTC)
What it doesAI
WeChat channel plugin that maps each WeChat chat to a persistent DSH session with bidirectional text, image, file, voice and video.
- One WeChat conversation = one long-lived, reusable DSH session
- Bidirectional media: images/files/voice/video in, docs/images/zips out
- Single long-poll connection serves many users with separate sessions
Capability tags are AI-inferred or rule-extracted from the README (see badge) — vocabulary-limited, not install-verified. AI = inferred; README = literal keyword from the readme.
Installation
dsh plugin --profile web add github:sxylvlv/dsh-weixin-channel#v0.2.0Install method: GitHub · runtime verified (L5)
Verification & Compatibility
Grouped by plugin version: each card lists the dsh versions actually tested against that artifact version and their install verdicts (L5 wins). Untested combinations are omitted — absence means untested, never assumed compatible. L1–L3 are a plugin-level static archive (independent of the dsh version — the same verdict on every dsh row): they sit in each row's level grid next to L4/L5, marked "static", while their evidence is stored once per plugin inside that row's "checks & evidence" instead of being duplicated per version.
External credentials (plugin-level): none detected
○ The author declares no dsh version requirement — install is not blocked by version.
| plugin \ dsh | dsh 0.2.1-rc.3 current | dsh 0.2.1-rc.2 | dsh 0.2.1-alpha.4 | dsh 0.2.1-alpha.2 | dsh 0.2.0-rc.2 |
|---|---|---|---|---|---|
| v0.2.0 | ✓ | ✓ | ✓ | ✓ | ✓ |
v0.2.0github✓ 12 runtime-verified2026-10-26
https://github.com/sxylvlv/dsh-weixin-channel
✓dsh 0.2.1-rc.3current2026-10-26L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-rc.3
- • Plugin artifact: github · https://github.com/sxylvlv/dsh-weixin-channel#v0.2.0
ID: dsh-weixin-channel@v0.2.0@dsh0.2.1-rc.3 · profile: l4-sandbox
Issued: 2026-10-26 · expires: 2026-11-02
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.2.1-rc.22026-10-20L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-rc.2
- • Plugin artifact: github · https://github.com/sxylvlv/dsh-weixin-channel#v0.2.0
ID: dsh-weixin-channel@v0.2.0@dsh0.2.1-rc.2 · profile: l4-sandbox
Issued: 2026-10-20 · expires: 2026-10-27
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.2.1-alpha.42026-10-18L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-alpha.4
- • Plugin artifact: github · https://github.com/sxylvlv/dsh-weixin-channel#v0.2.0
ID: dsh-weixin-channel@v0.2.0@dsh0.2.1-alpha.4 · profile: l4-sandbox
Issued: 2026-10-18 · expires: 2026-10-25
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.2.1-alpha.22026-10-11L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-alpha.2
- • Plugin artifact: github · https://github.com/sxylvlv/dsh-weixin-channel#v0.2.0
ID: dsh-weixin-channel@v0.2.0@dsh0.2.1-alpha.2 · profile: l4-sandbox
Issued: 2026-10-11 · expires: 2026-10-18
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.2.0-rc.22026-10-09L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.0-rc.2
- • Plugin artifact: github · https://github.com/sxylvlv/dsh-weixin-channel#v0.2.0
ID: dsh-weixin-channel@v0.2.0@dsh0.2.0-rc.2 · profile: l4-sandbox
Issued: 2026-10-09 · expires: 2026-10-16
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.2.0-rc.12026-09-30L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.0-rc.1
- • Plugin artifact: github · https://github.com/sxylvlv/dsh-weixin-channel#v0.2.0
ID: dsh-weixin-channel@v0.2.0@dsh0.2.0-rc.1 · profile: l4-sandbox
Issued: 2026-09-30 · expires: 2026-10-07
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.1.7-rc.22026-09-26L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.1.7-rc.2
- • Plugin artifact: github · https://github.com/sxylvlv/dsh-weixin-channel#v0.2.0
ID: dsh-weixin-channel@v0.2.0@dsh0.1.7-rc.2 · profile: l4-sandbox
Issued: 2026-09-26 · expires: 2026-10-03
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.1.7-rc.12026-09-23L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.1.7-rc.1
- • Plugin artifact: github · https://github.com/sxylvlv/dsh-weixin-channel#v0.2.0
ID: dsh-weixin-channel@v0.2.0@dsh0.1.7-rc.1 · profile: l3-fullscan
Issued: 2026-09-23 · expires: 2026-09-30
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.1.6-alpha.22026-09-20L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.1.6-alpha.2
- • Plugin artifact: github · https://github.com/sxylvlv/dsh-weixin-channel#v0.2.0
ID: dsh-weixin-channel@v0.2.0@dsh0.1.6-alpha.2 · profile: l4-sandbox
Issued: 2026-09-20 · expires: 2026-09-27
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.1.6-alpha.12026-09-17L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.1.6-alpha.1
- • Plugin artifact: github · https://github.com/sxylvlv/dsh-weixin-channel#v0.2.0
ID: dsh-weixin-channel@v0.2.0@dsh0.1.6-alpha.1 · profile: l4-sandbox
Issued: 2026-09-17 · expires: 2026-09-24
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.1.5-rc.22026-09-14L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.1.5-rc.2
- • Plugin artifact: github · https://github.com/sxylvlv/dsh-weixin-channel#v0.2.0
ID: dsh-weixin-channel@v0.2.0@dsh0.1.5-rc.2 · profile: l4-sandbox
Issued: 2026-09-14 · expires: 2026-09-21
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓prehistory2026-10-04L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: unknown
- • Plugin artifact: github · https://github.com/sxylvlv/dsh-weixin-channel#v0.2.0
ID: dsh-weixin-channel@v0.2.0@dshunknown · profile: l4-sandbox
Issued: 2026-10-04 · expires: 2026-10-11
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
Author badges
Embed the dsh.so badges in your README to show this plugin's automated security-scan and install-test status:
`[](https://www.dsh.so/artifact/dsh-weixin-channel/?ref=badge)``[](https://www.dsh.so/artifact/dsh-weixin-channel/?ref=badge-install)``[](https://www.dsh.so/artifact/dsh-weixin-channel/?ref=badge-install)``[](https://www.dsh.so/artifact/dsh-weixin-channel/?ref=badge-install)``[](https://www.dsh.so/artifact/dsh-weixin-channel/?ref=badge-install)``[](https://www.dsh.so/artifact/dsh-weixin-channel/?ref=badge-install)`dsh.so is an independent community project, not affiliated with or endorsed by DeepSeek AI. Badges are maintained by dsh.so; embed links carry a ?ref= attribution parameter.
Security Report
Two automated layers, neither a manual review: a static scan (per-plugin rule checks) and a model-driven dynamic security audit that covers only the subset static-flagged at warn or above and never executes plugin code.
Static low; dynamic medium (authoritative when present) → overall medium.
v0.1.0dsh manifestv0.2.0git2026-10-29v0.2.0same versionclean · gitVet is an AST static scan (npm artifact or git source).
show static findings (6)
- warningfsWrite · files
bin/weixin-login.mjs:99fs.appendFileSync( - warningfsWrite · files
bin/weixin-login.mjs:122try { fs.writeFileSync(path.join(store.root, 'login-qr-url.txt'), url, 'utf-8') } catch { } - warningfsWrite · files
lib/log.mjs:34fs.appendFileSync(file, `${new Date().toISOString()} ${line}\n`, 'utf-8') - warningfsWrite · files
lib/outbound.mjs:44fs.appendFileSync(ledgerPath, `${JSON.stringify({ at: new Date().toISOString(), ...entry })}\n`, 'utf-8') - warningfsWrite · files
lib/store.mjs:43fs.writeFileSync(filePath, JSON.stringify(value, null, 2), 'utf-8') - warningfsWrite · files
lib/store.mjs:46fs.chmodSync(filePath, mode)
show 5 audit findings
- mediumDetached watchdog autonomously rewrites the host profile cordis.patch.yml and survives plugin unload
tools/watchdog.mjs:103An unattended detached process (started from index.mjs according to deploy.mjs comments) loops forever, and when mount-status is not 'running' it performs destructive string surgery on <DSH_HOME>/profiles/*/cordis.patch.yml: it truncates the file to `${prefix} ]` for 10s and then re-inserts the block under a new id. If the target YAML does not match the hard-coded MARKER shape, the write can truncate or corrupt the host's profile configuration while the host is live. It also keeps editing host config after the plugin itself has been unloaded (only a watchdog.off file or total absence of the ro
- mediumLogin QR URL (a bearer credential) is persisted in plaintext into world-readable log/state files
bin/weixin-login.mjs:124The scanned QR URL is the artifact that binds the account to whoever scans it first. It is written with default permissions into <DSH_HOME>/weixin/login-qr-url.txt and appended to login-progress.log (and channel.log via lib/log.mjs appendToFile, which also uses default mode), and nothing in the harvested code deletes these entries after login. Because the state directory is created with default 0755 and files with umask-derived 0644, another local user can read a still-valid QR URL and complete the scan, or read past URLs and login metadata. lib/log.mjs defines redact() but it is not applied t
- lowNon-interactive login accepts the phone verification code from an unauthenticated local file drop
bin/weixin-login.mjs:84When stdin is not a TTY the login flow polls <DSH_HOME>/weixin/verify-code.txt for 180s and forwards whatever is inside to the ilink server as the confirmation code. Any local process or user that can write into that directory can inject or race a code (and the file is read/returned with no ownership, permission or content-length check). Precondition is a login in progress plus local write access, so this is a local-trust hardening gap rather than a remote attack.
- lowcontext_token files are written with default permissions while the bot token correctly uses 0600
lib/store.mjs:179writeJson() only chmods when a mode argument is supplied; saveAccount passes 0o600, but setContextToken (and saveSyncBuf / appendAllowFrom / setSessionId) do not, so <accountId>.context-tokens.json, .sync.json, .allowFrom.json and sessions.json are created with umask-derived 0644 inside a 0755 directory. Context tokens are the per-conversation reply credentials used to send messages as the bot, so they are readable by other local users on a multi-user host.
- lowServer-supplied baseUrl/redirect_host is persisted and then used as the destination for bot-token requests
lib/monitor.mjs:35login.mjs takes status.baseurl on 'confirmed' and https://<status.redirect_host> on 'scaned_but_redirect', and bin/weixin-login.mjs saves result.baseUrl into the account file; store.resolveAccount then returns it as account.baseUrl, which monitor sends the bot token to. Any response from the ilink endpoint (or a compromised/MITM'd TLS peer) can therefore redirect the persisted credential and all subsequent polling to an arbitrary host, with no allow-list check against *.weixin.qq.com.
WeChat long-poll bridge that stores bot tokens and drives a DSH agent; no RCE, but a detached watchdog rewrites host profile YAML and login artifacts land in world-readable logs.
Rule (2026-10-28): when a dynamic conclusion exists it is authoritative (it may raise or lower the level); the static scan tier (vet primary, dsh backstop) applies only when there is none (not queued / audit failed / withdrawn). The audit never writes the exemption list (exemptions are manual only); a wrong conclusion is withdrawn by human review and the tier falls back to the static scan tier.
Disclaimer: the static scan and the dynamic security audit are both automated analysis, not a security guarantee. Always review what you install.
Activity
Last commit 2026-09-14 · activity: Stable
• Repo created: 2026-09-14
• Stars: ★ 0 · Forks: 0
• Health: Stable — committed within 90 days
Source
Author README
View on GitHub ↗The author's original README from the repository — fetched live, unedited (the English page loads the default README).
Frequently asked questions
What is dsh-weixin-channel?
dsh-weixin-channel is a DeepSeek Harness (dsh) plugin listed on dsh.so — an independent community registry that indexes public source repositories and publishes automated security-scan and install-verification results for each entry.
Is dsh.so or this plugin page official?
dsh.so is an independent community registry and is not affiliated with, endorsed by, or sponsored by DeepSeek AI.
How do I install dsh-weixin-channel?
Run dsh plugin --profile web add github:sxylvlv/dsh-weixin-channel#v0.2.0 in a DeepSeek Harness (dsh) environment. That exact command passed a real install inside an isolated sandbox (L4) plus web smoke testing (L5).
How does the security scan relate to a manual audit?
Both layers are automated, not a manual audit. The static scan is heuristic analysis of the repository source, so it can produce false positives and miss context. The model-driven dynamic security audit only covers plugins static-flagged at warn or above, never executes plugin code, and its conclusion is authoritative when there is one (it may raise or lower the static tier); exemptions stay manual. Neither layer is an endorsement: review the repository and the permissions it asks for before installing, together with the verification level and health signals.
How fresh is the data on this page?
The data on this page is as of 2026-10-29 (UTC) — the most recent valid timestamp among the registry refresh, install verification, security scan and dynamic audit. Build time is never used as a data date.
