# πŸš€ dsh-ventus-plugins [English](README_EN.md) | δΈ­ζ–‡ ## Ventus Plugin Family β€” One Integrated Plugin **11 self-installed DSH plugins integrated into ONE plugin**, with functionality and settings identical to the multi-plugin era. The plugin list shows a single entry; the sidebar, floating ball, theme, search, desktop pet, skills, and usage stats are all preserved. > **Why integrate**: the plugin list keeps growing and every upgrade means > syncing each plugin individually. After integration: > - The plugin management panel shows only `dsh-ventus-plugins`; > - All sub-plugins share one lifecycle (host aggregate mount + single client bundle); > - Upgrading means replacing one package.

license version plugins runtime

## ✨ Feature Overview
CategorySub-pluginDescription
🎨 Themedsh-theme-endfieldArknights: Endfield industrial editorial theme: cream paper, ink text, signal-yellow accents, zero radius. Contour background, ENDFIELD watermark, glass/solid sidebar surface (dropdown in theme settings), docked hero (toggleable)
πŸ“Š Usagedsh-deepseek-usageFloating ball: live balance, today's R0 multiplier, model hit-rate badge; panel: cumulative/today spend, requests, tokens, per-model usage, trends, login/logout, screenshot
πŸ“ˆ Usage & skillsdsh-usage-skillToken usage heatmaps (day/month/year), multi-provider balance cards, skill bundle manager (**sidebar entry disabled per user request**; components and dictionaries kept)
πŸ“ Right raildsh-better-sidebarVSCode-like right sidebar: file tree / editor (CodeMirror multi-language) / terminal / git / browser, per-session isolation; editor footer info bar (total + selected chars)
πŸ” Searchdsh-ventus-searchBing / 360 / Bilibili multi-engine search + Readability content fetch, registered as DSH search provider with settings card
πŸ‹ Desktop petdsh-ventus-whaleInteractive 3D orca pet overlay: drag / rotate / context menu; size, sensitivity, text configurable
πŸ“Ά Subagent progressdsh-ventus-progressParses `progress-json` progress models from subagents; hover subagent entries to see staged progress bars; ships a skill that teaches the model to emit progress models
πŸ› οΈ Toolchain@dsh-external/dsh-webuiView tiles / message navigation / tool-call aggregation / Markdown rendering / reasoning-effort sync / AnySearch; **floating sidebar** (with popup-keep-open fix) and prompt-optimize popover
🧩 Module injection@dsh-external/dsh-super-injectorRuntime injection of local DSH plugin packages (junction + loader.create, no restart), hot reload + management UI
πŸ‘οΈ Visualization@dsh-external/dsh-visualize`visualize` tool + bundled skill: render interactive HTML fragments as sandboxed cards (Codex `/visualize` semantics)
βš–οΈ Permission policy@nanmicoder/dsh-auto-modeSandbox-first automatic permission policy (the **Auto** permission option, patched into this package)
🌐 UA relaydsh-ua-relayUA-rewriting reverse relay for B.AI (bankofai.io), target `https://api.bankofai.io`
> `@nanmicoder/dsh-agent-teams` (multi-agent team collaboration) stays > **disabled** per user request: its activity scanner repeatedly scans whole > history after abnormal logs and freezes the UI. Host not mounted, client not > embedded β€” identical to the multi-plugin era. ## πŸš€ Installation ```sh dsh plugin --profile web add github:mmzm0808/dsh-ventus-plugins ``` Or local dev: ```sh dsh plugin --profile web add "" ``` - Committed `lib/` artifacts and `vendor/` deps β€” **no build script needed** (pnpm β‰₯10 allowBuilds gate does not affect this plugin) - **Restart dsh** after install (bundle layer loads at boot; client changes via HMR) ## πŸ“– Usage | Feature | Entry | |---|---| | Usage ball | Right-side floating ball: drag vertically, snaps to left half; click to expand | | Usage panel | Balance / spend / tokens / per-model usage / R0 / trends / login / screenshot | | Endfield theme | Settings β†’ Appearance β†’ Theme β†’ `dsh-theme-endfield`; theme card: contour, watermark, sidebar surface (transparent/glass/solid+color), radius, hero dock | | Right rail | Panel button top-right of conversation: files / terminal / git / browser | | Search | `@` or slash command triggers ventus-search provider | | Desktop pet | Bottom-right orca; right-click to configure | | Subagent progress | Delegate a multi-stage task (the model emits `progress-json` per the bundled skill); hover the subagent entry at the bottom of the conversation | | Module injection | Settings β†’ `dsh-ventus-plugins` β†’ drop a local plugin package to hot-load | ## πŸ—οΈ Architecture ``` dsh-ventus-plugins/ β”œβ”€β”€ package.json # single package; dsh.client.platform=web; 34 third-party deps union β”œβ”€β”€ cordis.patch.yml # bundle patch: permission presets (Auto) + insert row β”œβ”€β”€ lib/ β”‚ β”œβ”€β”€ index.js # host aggregate: ctx.plugin each of 10 sub-plugins (agent-teams excluded) β”‚ └── client.js # merged client bundle (generated by build-client.mjs) β”œβ”€β”€ vendor/ # 11 sub-plugins' runtime artifacts (self-contained) β”‚ └── node_modules/ # junction chain: third-party β†’ profile node_modules └── scripts/ β”œβ”€β”€ build-client.mjs # client merge build script β”œβ”€β”€ cdp.mjs # CDP debugging helper (dev) └── extract-dsu-css.mjs # CSS constant extraction (dev) ``` ### Client merge (lib/client.js) DSH loads `/plugins//client.js` per package; the bundle contract is `window.__ModuleLoader__.load({ id, factory })`. Merge strategy (no parsing / no rewriting of minified code): 1. Each sub-bundle's `load` call is **embedded verbatim** into the aggregate factory β€” sub-factories register with the loader at execution time; 2. The aggregate `apply` materializes each sub-module via `require(id)` and calls its `apply`. **Gotchas** (from real incidents): - **Service injection uses short service names**: the aggregate `exports.inject` must be the union of sub-plugin service deps with short names (`slots`, `sessions`, `connection`, `workspaces`, `locale`, `modules`, `settingsScope`, `conversationEvents`, `remote`, `layout`). Package names pend forever; empty throws "cannot get property without inject". - **Variable scopes are naturally isolated**: each sub-bundle has its own factory scope, so same-named top-level `const`s (e.g. `NS`) never collide; verify with `node --check lib/client.js`. - **Style ownership must be explicit**: hand-written `