* feat(release): publish package source, declaration maps, and documentation Every release member publishes its TypeScript source and the declaration maps that resolve into it, and @deepseek-ai/dsh publishes the repository Markdown documentation staged from docs/ at prepack time. The ./src/* export most members already declared now resolves for an installed consumer, and a consumer editor follows a declaration to the implementation. Bundled JavaScript maps stay unpublished; the vendored family and the Desktop runtime file policy are unchanged. Rationale: .agents/notes/implemented/process/2026-10-08-published-source-and-docs.md * feat(release): publish JavaScript maps and compress bundles Every emitted JavaScript map ships beside the bundle it describes, and the workspace build and the client preset compress bundles without mangling identifiers. The documentation payload now mirrors the website publication manifest and is removed again by `postpack`; Desktop and the Python executable exclude the published source, documentation, and maps; `clean` removes a staged copy. Typert's publication contract gains the Remote declaration map. * fix(release): keep node bundles readable for the worker image The browser worker image lowers `yield*` only as a whole statement and rewrites `for await` loops by their source layout, so compressed node-side entries either fail that lowering or lower to unparseable code. Only the browser bundles keep compression, which removes about a third of their text. The bundle-purity assertion now matches the module-loader call regardless of the quote style compression picks, and the release-pack fixture exercises the installed package's new documentation requirement. * feat(release): publish the whole documentation tree `@deepseek-ai/dsh` copies `docs/` in full instead of the website's page set: the maintainer documents, the generated migration records, the translation guidelines, and the `*.i18n.yaml` consistency records ship with the installed package, so the documentation's own links resolve without a checkout. * feat(release): publish the upgrade guides with the documentation The staged documentation keeps the website's page set and adds every `docs/upgrade-guide/` document, which is what an installed reader consults when a released change breaks something. The rest of the maintainer tree stays out. * test(release): expect source and maps in master's new payload cases * feat(release): keep installed docs and source readable in Desktop Desktop keeps the published src/ and docs/ trees inside app.asar, and every model shell call receives DSH_INSTALL_DIR and DSH_NODE_EXECUTABLE so an agent can read them through Electron's Node mode. Staging also generates docs/upgrade-guide/README.md, an index of the upgrade guides grouped by the release they upgrade from. Minified client bundles print string literals with backticks: the worker image packer now recognizes those chunk requests, client license banners are prepended after minification so their text survives, and the affected artifact tests accept either quote. * test(desktop): read archived docs through the Windows PowerShell form Regenerate the config catalog for the shifted shell-env source line. * test(desktop): wait for the GUI-subsystem Electron process from PowerShell * build(release): publish source and maps from the message-quotes package * build(release): publish source and maps from packages new on master * build(release): publish source and maps from the tool-office package
description, kind
| description | kind |
|---|---|
| Read-only projection of the current Cordis Loader plugin state with each agent preset's composition beside it: the pluginInventory service and its pluginInventory/list Remote for web GUI host clients. | package-reference |
@deepseek-ai/dsh-host-plugin-inventory
English | 中文
Summary
Clients can call pluginInventory/list to display the host’s current plugins in load order, including each entry’s identifier, module specifier, effective enablement, live phase, and available display text. Deployments with an agent-preset roster also report each preset’s metadata, health, and flattened plugin composition; without a roster, preset data is absent. Each response is a point-in-time, read-only snapshot for display and diagnostics: it cannot mutate plugins and provides no history or change subscription.
Table of Contents
- Use this package
- Understand the implementation
- Further Exploration
- Model Experience
- Known Limitations and Deferred Work
- Dev Note
Use this package
Call pluginInventory/list when a client or settings page needs to show what is currently composed in the host — which plugins are loaded, enabled, and alive, and what each agent preset would give a session. The Remote is the only entry point: the service is Remote-only and deliberately declares no same-process Cordis Context merge.
What a snapshot contains
Each row is one non-group Loader entry: its entry id, the exact module specifier, the effective enablement (including disabled ancestor groups), and the current root Fiber phase. pending means the entry waits to load, loading that it is being read, active that it is running, failed that its fiber rejected, and unloading that it is being torn down; null means no live root Fiber exists at all. Structural group rows are skipped.
Loader and preset rows can carry optional meta with a title, description, or metadata diagnostic. The Host returns available translations and literal fallbacks; the Client selects its language. Metadata diagnostics do not change enablement or fiber phase.
Per-preset compositions
With a roster composed, agentPresets carries one group per preset in roster order: its id, whether the deployment ships it or the user owns it (trust, which clients use to localize shipped names), published display name, whether a session naming no preset composes it, and flattened plugin rows — entry id (null when the file row declares none), module specifier, effective enablement, the row's own !!js disabled expression when it carries one, and a root-fiber phase when the composition is live. A preset some session already composed answers from its newest standing generation — even when its file has since broken, because the mount is what those sessions run; one never composed since boot answers from its composition file with disabled gates evaluated against the Loader context, and reading never mounts a preset. conditional enablement marks a gate the Host could not evaluate, and a broken preset nothing composed stays listed with its reason and no rows. Without a roster the field is absent.
What you can and cannot do with it
The inventory is a snapshot for display and diagnostics: a client can render the roster, flag failed entries, and detect changes by comparing snapshots. It cannot enable, disable, add, or remove plugins, and it carries no history — a fiber that already failed and was removed is absent. Because the service reads the Loader on every call, the answer always reflects the current composition rather than a cached view.
Failed entries include the current startup diagnostic read from their Cordis fiber. Recovery removes it; inventory reads do not wait for loading entries or retain a separate error cache.
Understand the implementation
Implementation internals — click to expand
Design concept
The gateway is a direct projection with no second lifecycle truth: every list() call reads ctx.loader.entries() and maps each non-group entry to its public row. Cordis's internal plugin/status events already maintain Entry.fiber and Fiber.state, so a cache would only add another lifecycle truth to keep synchronized. The agent-preset roster is an optional peer resolved per call through ctx.get('agentPresets'): its compositionInventory() owns preset composition reads, and this package maps root-fiber states onto the public phases.
Display metadata comes from the optional pluginPackages service using each Loader tree's resolution base, or the gateway context's base for preset rows. Without the service or the applicable base, meta is absent. Reading metadata does not load or activate plugins.
The phase mapping
Fiber states map onto the public phase vocabulary, with disposed folding into null — an entry whose fiber is gone has no live root to report. The phase therefore never distinguishes why no live root exists: the entry may never have started, or its fiber may already have been disposed.
Source map
| File | Role |
|---|---|
src/index.ts |
PluginInventoryGateway: the pluginInventory Remote service and the Loader projection |
src/types.ts |
Public payload types: PluginInventoryEntry, PluginInventorySnapshot, PluginFiberPhase |
Typert generates the Host and Client Remote artifacts exposed by ./typert and ./remote.
Further Exploration
Read these when the inventory contract is not enough: how the Remote reaches clients, then the Loader it projects and the surface that renders it.
- Remote assembly — how clients consume
pluginInventory/listwithout importing the Host implementation. - Cordis plugin loader — the Loader whose entries this package projects.
- Plugin inventory settings surface — the browser-side projection that renders the inventory.
Model Experience
None, as the host-side read-only Loader projection registers nothing model-facing.
KV Cache effect
None; this package neither assembles nor sends a provider request.
Known Limitations and Deferred Work
These limits define what a point-in-time inventory cannot tell a client. They are current package constraints, not a task backlog.
- Point-in-time state only — the result contains no durable failure history or subscription; a missing root Fiber is reported as
null, regardless of why no live root exists. - No layer attribution or mutation — the service does not identify which bundle, profile, or override introduced an entry, and it cannot enable, disable, add, or remove plugins in either plane.
- Presets appear only with a roster — a deployment without
dsh-agent-preset-registryserves Loader entries alone; theagentPresetsfield is absent rather than empty.
Dev Note
Working context for maintainers — click to expand
None.