Preface¶
People building agents often have this experience: the model talks a big game, but starts hallucinating as soon as you ask about the current version content in a game. Rather than letting the model rely on memory to fabricate level guides, it’s better to turn the knowledge base and real-time data sources into tools and let it query them directly. This article introduces a DSH native plugin (Cordis bundle) for The Outlast Trials, maintained by NormalAorii, which belongs to the networking tools in the community directory.
It does something very straightforward: it wraps the community-organized game database (levels, enemies, items, mechanics) and Steam real-time announcements into 9 tools callable by the model. When combined with the already connected official QQ bot (@tencent-connect/dsh-qqbot), it allows for direct Q&A in QQ group chats or private messages, without needing to write any query logic yourself.
What is This¶
A one-sentence positioning: A native Cordis plugin for DeepSeek Harness, pure ESM, with no build steps and no runtime dependencies. The repository is NormalAorii/dsh-plugin-outlast, has 1 GitHub star, an MIT license, current version 1.0.0, and requires Node >=20. The plugin code is MIT, while the game name, setting, and trademarks belong to Red Barrels; the author declares this is just a fan-oriented query tool.
A few boundaries need to be clarified first: it does not connect to QQ directly; sending images and files depends on another plugin that has already been connected, @tencent-connect/dsh-qqbot. The database content is organized by the community, not a repost of the official wiki; there may be discrepancies after version updates.
Database Scale¶
The database is organized by files, with the following scale:
- 41 Trials (11 Main Story Trials + 30 MK Challenges)
- 14 Programs
- 21 Enemies
- 65 Items/Upgrades/Currency/Mechanics
- 31 Core Mechanics
- 10 News Snapshots
Mapped to four files under data/: trials.json holds level and Program structures, enemies.json holds the enemy bestiary, items.json holds consumables, Rig, prescriptions/upgrades, currency, and operation mechanics, and news.json holds Steam news source test results and offline snapshots. All entries have sources and confidence fields; entries where confidence is not “high” will be explicitly labeled as “Community Organized” in the response.
How the Nine Tools Divide Their Responsibilities¶
The plugin entry index.js registers 9 outlast_* tools and attaches a 4-line system prompt (order 900). Tool definitions are in lib/tools.js, and data loading and Chinese/English fuzzy search are in lib/store.js:
| Tool | Function | Typical Questions |
|---|---|---|
outlast_help |
Function menu and command instructions | Help / Menu / What can you do |
outlast_search |
Full library Chinese/English fuzzy search | “Prison”, “Mother Goose”, “Syringe” |
outlast_trials |
Level list / Progress structure | What levels are there / MK challenges / Level order |
outlast_guide |
Single level guide (goals/steps/tips) | How to beat the Police Station / Orphanage guide |
outlast_enemies |
Enemy bestiary and countermeasures | What enemies are there / How to dodge Mother Goose |
outlast_items |
Consumables / Rig / Prescriptions / Currency | What items are there / How to choose Rig |
outlast_mechanics |
Core mechanics and survival tips | How to hide / Noise mechanics / How to get started for beginners |
outlast_news |
Steam official announcement real-time fetch | What updates are there recently |
outlast_card |
Generate 1080 wide image-text guide card PNG | Give me an image / Image-text guide |
The fetching for outlast_news uses a three-level fallback: it prioritizes real-time fetching from Steam’s ISteamNews (appid=1304930), falls back to RSS on failure, and falls back to a local snapshot if that fails as well, explaining the reason in the response. outlast_card is only responsible for rendering the PNG and returning the local path; the action of sending the image is completed by qqbot_send_file, which the model will call immediately after. The banner at the top of the card is fetched from the official header image on the Steam CDN (cdn.cloudflare.steamstatic.com) at runtime; it is only cached locally and is not distributed with the plugin.
Installation and Activation¶
The official installation method given in the README is “Clone to local, then have DSH install it as a profile bundle,” a two-step process:
# 1) Put the repository into the DSH workspace (or any local directory)
git clone https://github.com/NormalAorii/dsh-plugin-outlast.git
# 2) Have DSH install that directory as a profile bundle (requires approval)
# plugin_manager install_bundle → target = absolute path of that directory
# Example: C:\Users\<you>\Documents\deepseek-harness\default-workspace\dsh-plugin-outlast
Note that this is not a one-line installation in the form of dsh plugin add github:.... After installation, DSH will hang the plugin into the profile’s bundle (the insert entry in cordis.patch.yml), so there is no need to manually modify the profile’s package.json or cordis.patch.yml, nor is pnpm install required. After restarting (or reloading) DSH, 9 new outlast_* tools will appear on the model side.
Post-Installation Verification¶
Run directly in the repository root directory; the DSH host is not required:
node scripts/verify.js # 46 assertions: data integrity, 9 tools, real-time news, PNG card
node scripts/smoke.mjs # Only runs the card + news two segments, produces images faster
The author declares that this plugin has been installed and tested in real execution in their own DSH desktop profile, and node scripts/verify.js passed 46/46. The significance of this step is to verify things yourself after installation rather than going straight to production.
Typical Usage¶
The plugin itself does not bind to QQ. The integration method is: the official QQ bot plugin @tencent-connect/dsh-qqbot on the QQ side is responsible for sending and receiving messages and files, while this plugin is responsible for providing query tools. When a user asks in a group “How do I dodge Mother Goose?”, the model calls outlast_enemies to check for countermeasures; when asking “What updates are there recently?”, the model calls outlast_news to perform a Steam real-time fetch; when replying “Give me an image,” the model calls outlast_card to generate a PNG and then uses qqbot_send_file to send the image back to the group.
Questions that can be reproduced:
帮助/菜单—— Triggersoutlast_help, to understand what capabilities are available监狱、鹅妈妈、注射器—— Goes throughoutlast_search’s Chinese/English fuzzy search有哪些关卡/MK 挑战/关卡顺序—— Goes throughoutlast_trials警局怎么打/孤儿院攻略—— Goes throughoutlast_guideRig 怎么选—— Goes throughoutlast_items噪音机制/新手怎么上手—— Goes throughoutlast_mechanics最近有什么更新—— Goes throughoutlast_news
Applicable Scenarios and Notes¶
Suitable for two types of people: first, developers who deploy QQ bots themselves and want to create an Q&A assistant for The Outlast Trials players, saving themselves the work of writing a guide database and maintaining Steam news fetching; second, people who want to learn the DSH Cordis bundle plugin structure. This repository is not large, and the division of labor between index.js / lib/tools.js / lib/store.js / lib/news.js / lib/cards.js is quite clear, showing everything from tool registration and bundle patching to fallback fetching and local rendering.
A few points to note:
- The plugin runs with the permissions of the current DSH process. Read the source code once before installation to confirm that the directory path, scraping targets, and calling behavior meet expectations.
- Image-text cards depend on Windows PowerShell +
System.Drawing; fonts automatically fallback to Microsoft YaHei UI → Microsoft YaHei → SimHei → Arial; non-Windows environments will explicitly error out and switch to text responses. This means the “Generate card → Send image in QQ” chain is only complete on Windows. - News and network interfaces may be blocked by firewalls or rate-limited; when they fail, the plugin will truthfully report the issue and will not fabricate announcements.
- Single responses are controlled within 3400 characters to fit the QQ markdown message length limit;
lib/render.jsis responsible for automatically finishing the response within this limit. - Guides are community-organized data; there may be discrepancies after version updates. The source is carried by the
sources/confidencefields in the plugin, and the disclaimer is in the README.
Conclusion¶
The value of this plugin lies in turning high-frequency but error-prone needs like “game guide queries” into a standard toolset: the model no longer relies on memory to hard-answer, but instead queries the database, queries real-time sources, and generates an image when necessary, while also providing the source and confidence. The barrier to entry is not high, and the star count is only 1; it is a small project just starting out, and the README clearly describes the functional boundaries and known limitations.
- Community Directory Page: https://www.skillhub.cn/plugins/NormalAorii/dsh-plugin-outlast
- Repository Address: https://github.com/NormalAorii/dsh-plugin-outlast