@chatcode/cco-market 1.45.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +146 -0
- package/README.zh.md +143 -0
- package/UPDATE-API-V1.md +132 -0
- package/client/client.js +11534 -0
- package/cordis.patch.yml +5 -0
- package/lib/accelerate.js +184 -0
- package/lib/agents.js +36 -0
- package/lib/backup.js +572 -0
- package/lib/catalog-local-match.js +126 -0
- package/lib/catalog-npm.js +111 -0
- package/lib/changelog.js +242 -0
- package/lib/channels.js +64 -0
- package/lib/check.js +1067 -0
- package/lib/compatibility.js +198 -0
- package/lib/diagnostics.js +49 -0
- package/lib/discovery-compatibility.js +260 -0
- package/lib/dsh-cli.js +949 -0
- package/lib/dsh-install.js +108 -0
- package/lib/gist.js +352 -0
- package/lib/groups.js +97 -0
- package/lib/home-paths.js +42 -0
- package/lib/hot.js +519 -0
- package/lib/http.js +39 -0
- package/lib/index.js +97 -0
- package/lib/install.js +387 -0
- package/lib/log.js +197 -0
- package/lib/ndjson.js +154 -0
- package/lib/net.js +98 -0
- package/lib/order.js +284 -0
- package/lib/patch.js +521 -0
- package/lib/pnpm-compat.js +490 -0
- package/lib/presets.js +278 -0
- package/lib/profile.js +911 -0
- package/lib/region-probe.js +93 -0
- package/lib/regions.js +253 -0
- package/lib/registry.js +204 -0
- package/lib/restart.js +373 -0
- package/lib/routes.js +4372 -0
- package/lib/settings.js +109 -0
- package/lib/skill-market/api.js +119 -0
- package/lib/skill-market/config.js +29 -0
- package/lib/skill-market/installer.js +352 -0
- package/lib/skill-market/runtime.js +13 -0
- package/lib/skill-market/tui.js +119 -0
- package/lib/skill-market/types.js +1 -0
- package/lib/skill-market/web-routes.js +123 -0
- package/lib/snapshot.js +500 -0
- package/lib/source-migration.js +54 -0
- package/lib/sources.js +596 -0
- package/lib/store.js +91 -0
- package/lib/themes.js +102 -0
- package/lib/trial.js +116 -0
- package/lib/types/accelerate.d.ts +85 -0
- package/lib/types/agents.d.ts +22 -0
- package/lib/types/backup.d.ts +131 -0
- package/lib/types/catalog-local-match.d.ts +50 -0
- package/lib/types/catalog-npm.d.ts +47 -0
- package/lib/types/changelog.d.ts +102 -0
- package/lib/types/channels.d.ts +56 -0
- package/lib/types/check.d.ts +266 -0
- package/lib/types/compatibility.d.ts +64 -0
- package/lib/types/diagnostics.d.ts +29 -0
- package/lib/types/discovery-compatibility.d.ts +80 -0
- package/lib/types/dsh-cli.d.ts +324 -0
- package/lib/types/dsh-install.d.ts +46 -0
- package/lib/types/gist.d.ts +53 -0
- package/lib/types/groups.d.ts +34 -0
- package/lib/types/home-paths.d.ts +16 -0
- package/lib/types/hot.d.ts +221 -0
- package/lib/types/http.d.ts +12 -0
- package/lib/types/index.d.ts +14 -0
- package/lib/types/install.d.ts +172 -0
- package/lib/types/log.d.ts +43 -0
- package/lib/types/ndjson.d.ts +52 -0
- package/lib/types/net.d.ts +58 -0
- package/lib/types/order.d.ts +100 -0
- package/lib/types/patch.d.ts +129 -0
- package/lib/types/pnpm-compat.d.ts +93 -0
- package/lib/types/presets.d.ts +90 -0
- package/lib/types/profile.d.ts +253 -0
- package/lib/types/region-probe.d.ts +50 -0
- package/lib/types/regions.d.ts +122 -0
- package/lib/types/registry.d.ts +86 -0
- package/lib/types/restart.d.ts +194 -0
- package/lib/types/routes.d.ts +67 -0
- package/lib/types/settings.d.ts +78 -0
- package/lib/types/skill-market/api.d.ts +10 -0
- package/lib/types/skill-market/config.d.ts +3 -0
- package/lib/types/skill-market/installer.d.ts +23 -0
- package/lib/types/skill-market/runtime.d.ts +10 -0
- package/lib/types/skill-market/tui.d.ts +4 -0
- package/lib/types/skill-market/types.d.ts +71 -0
- package/lib/types/skill-market/web-routes.d.ts +19 -0
- package/lib/types/snapshot.d.ts +93 -0
- package/lib/types/source-migration.d.ts +11 -0
- package/lib/types/sources.d.ts +216 -0
- package/lib/types/store.d.ts +30 -0
- package/lib/types/themes.d.ts +40 -0
- package/lib/types/trial.d.ts +61 -0
- package/lib/types/update-api-v1.d.ts +66 -0
- package/lib/types/updates.d.ts +123 -0
- package/lib/types/verify.d.ts +139 -0
- package/lib/update-api-v1.js +215 -0
- package/lib/updates.js +361 -0
- package/lib/verify.js +453 -0
- package/package.json +121 -0
- package/src/accelerate.ts +213 -0
- package/src/agents.ts +43 -0
- package/src/backup.ts +583 -0
- package/src/catalog-local-match.ts +144 -0
- package/src/catalog-npm.ts +120 -0
- package/src/changelog.ts +282 -0
- package/src/channels.ts +70 -0
- package/src/check.ts +1239 -0
- package/src/client/CommentsModal.tsx +119 -0
- package/src/client/Diagnostics.tsx +907 -0
- package/src/client/ErrorBoundary.tsx +111 -0
- package/src/client/InstallToast.tsx +31 -0
- package/src/client/Market.module.css +830 -0
- package/src/client/MarketSection.tsx +5301 -0
- package/src/client/OperationsPanel.tsx +365 -0
- package/src/client/SettingsCard.tsx +621 -0
- package/src/client/SkillMarket.module.css +21 -0
- package/src/client/SkillMarketSection.tsx +162 -0
- package/src/client/comments.ts +54 -0
- package/src/client/globals.d.ts +13 -0
- package/src/client/index.ts +180 -0
- package/src/client/locales.ts +1112 -0
- package/src/client/market-data.ts +1321 -0
- package/src/client/operations.ts +201 -0
- package/src/client/preset-panel.tsx +263 -0
- package/src/client/primitives.d.ts +140 -0
- package/src/client/self-check.ts +147 -0
- package/src/client/snapshot-panel.tsx +244 -0
- package/src/compatibility.ts +237 -0
- package/src/diagnostics.ts +84 -0
- package/src/discovery-compatibility.ts +315 -0
- package/src/dsh-cli.ts +1126 -0
- package/src/dsh-install.ts +118 -0
- package/src/gist.ts +362 -0
- package/src/groups.ts +111 -0
- package/src/home-paths.ts +53 -0
- package/src/hot.ts +628 -0
- package/src/http.ts +41 -0
- package/src/index.ts +128 -0
- package/src/install.ts +420 -0
- package/src/log.ts +206 -0
- package/src/ndjson.ts +185 -0
- package/src/net.ts +106 -0
- package/src/order.ts +303 -0
- package/src/patch.ts +522 -0
- package/src/pnpm-compat.ts +527 -0
- package/src/presets.ts +344 -0
- package/src/profile.ts +940 -0
- package/src/region-probe.ts +97 -0
- package/src/regions.ts +310 -0
- package/src/registry.ts +250 -0
- package/src/restart.ts +396 -0
- package/src/routes.ts +4506 -0
- package/src/settings.ts +141 -0
- package/src/skill-market/api.ts +130 -0
- package/src/skill-market/config.ts +32 -0
- package/src/skill-market/installer.ts +337 -0
- package/src/skill-market/runtime.ts +14 -0
- package/src/skill-market/tui.ts +157 -0
- package/src/skill-market/types.ts +80 -0
- package/src/skill-market/web-routes.ts +132 -0
- package/src/snapshot.ts +532 -0
- package/src/source-migration.ts +61 -0
- package/src/sources.ts +565 -0
- package/src/store.ts +89 -0
- package/src/themes.ts +125 -0
- package/src/trial.ts +156 -0
- package/src/update-api-v1.ts +277 -0
- package/src/updates.ts +400 -0
- package/src/verify.ts +492 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 fkysly and dsh-market contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo.svg" width="96" alt="ChatCode CLI Market logo">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# ChatCode CLI Plugin Market
|
|
6
|
+
|
|
7
|
+
English | [中文](README.zh.md)
|
|
8
|
+
|
|
9
|
+
[](https://www.npmjs.com/package/@chatcode/cco-market)
|
|
10
|
+
[](https://github.com/dsh-market/dsh-market)
|
|
11
|
+
|
|
12
|
+
The plugin market for ChatCode CLI. Open Settings → **Plugin Market** → browse, search, one-click install.
|
|
13
|
+
|
|
14
|
+

|
|
15
|
+
|
|
16
|
+
One-click themes: install, switch live, no restart.
|
|
17
|
+
|
|
18
|
+
## Install
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
chatcode-cli plugin --profile web add @chatcode/cco-market
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Restart `chatcode-cli web`, then open **Settings → Plugin Market**.
|
|
25
|
+
|
|
26
|
+
The same package also provides **Settings → Skill Market** in Web and `/skill-market` in the TUI. A project install goes to the nearest Git repository's `.chatcode-cli/skills/<name>` directory; a user install goes to `$CHATCODE_CLI_HOME/skills/<name>` (or `~/.chatcode-cli/skills/<name>` when `CHATCODE_CLI_HOME` is unset). Web resolves the target from the selected live session, while the TUI uses its current channel workspace.
|
|
27
|
+
|
|
28
|
+
Skill archives are size-capped, reject path traversal and symbolic links, require exactly one valid `SKILL.md`, and never replace a same-named skill without matching `.skill-market.json` ownership metadata. The public catalog base URL and archive limits can be changed under `config.skillMarket`.
|
|
29
|
+
|
|
30
|
+
**Requires ChatCode CLI 0.1.0-rc.6 or newer.** On an older host the market
|
|
31
|
+
disables itself and says so in the browser console rather than rendering
|
|
32
|
+
against primitives that are not there — if the Plugin Market entry never
|
|
33
|
+
appears, that is usually why. Worth checking when a desktop build bundles
|
|
34
|
+
its own host package: it may be older than the one `npm` would give you (#139).
|
|
35
|
+
|
|
36
|
+
## What you get
|
|
37
|
+
|
|
38
|
+
- **Browse & search** the full community catalog (2300+ plugins, growing daily) — category filters, star counts, top/new sorting, bilingual descriptions that follow your UI language
|
|
39
|
+
- **Skill Market** — browse and install Agent skills from Web or `/skill-market` without another plugin; choose project or user scope and let ChatCode CLI discover the files
|
|
40
|
+
- **Host-aware discovery** — cards show the DSH requirement declared by `engines.dsh` or lockstep `@deepseek-ai/dsh-*` peers; an opt-in filter hides only confirmed mismatches with the running host. Undeclared, malformed, unavailable, and GitHub-only entries remain visible rather than being guessed incompatible
|
|
41
|
+
- **Screenshots** — AppStore-style screenshots, auto-carousel when there's more than one, click to preview full-size: author-curated shots show right on the card (zero extra requests); plugins without curated shots fall back to automatic README extraction once you open the install dialog. Images load from GitHub hosting only
|
|
42
|
+
- **Comments** — every card opens the plugin's discussion thread in place. It is the same thread its pages on [dshmarket.com](https://dshmarket.com) and the [catalog](https://awesome-dsh-plugin.com) show, so a plugin has one conversation rather than three. Backed by GitHub Discussions through giscus: it loads when you open it, needs a GitHub account only to post, and the note above it says plainly that opening it contacts giscus.app and GitHub. In ChatCode CLI Web, reading stays embedded while a dedicated GitHub action opens the exact discussion in a new tab for sign-in and posting, so the cross-site return never carries or depends on the host session
|
|
43
|
+
- **Favorites** — bookmark plugins and themes from Discover or the Themes tab; a dedicated Favorites tab lists them with search, sort, and install actions. Bookmarks persist in the profile's market state (`state.json`); entries that leave the catalog can be cleared in one click
|
|
44
|
+
- **Themes** — a dedicated tab for community themes and skins: install → active immediately, switch with one click (themes are mutually exclusive, your choice survives restarts), uninstall to revert
|
|
45
|
+
- **One-click install** — confirm the source, watch live progress; most plugins go live after a page refresh, no restart
|
|
46
|
+
- **Backup & restore** — export your profile's plugin list and configuration as readable JSON, import it on another machine, store it on WebDAV with daily auto-backup, or sync through a private GitHub Gist; restores **merge** (plugins installed after the backup are kept), validate before writing, and roll back on failure
|
|
47
|
+
- **Updates** — per-plugin update checks (npm version or pinned commit vs HEAD), one-click update, or update everything at once; the market updates itself the same way
|
|
48
|
+
- **Resilient GitHub routes** — in the China download region, Git refs, README content, and avatars each keep their own fallback order. The market remembers the last working route, switches only after transport/HTTP/payload validation fails, and rejects proxy error pages disguised as HTTP 200. If every built-in route fails, **Settings → Plugins → Plugin configuration → GitHub acceleration** accepts one persistent custom HTTPS prefix; `CHATCODE_CLI_MARKET_GITHUB_PROXY` is the operator-owned override (legacy `DSHM_GITHUB_PROXY` is still read)
|
|
49
|
+
- **Public update API** — plugin-owned settings pages can use the versioned, capability-gated [update API v1](UPDATE-API-V1.md) (beta) instead of copying package-manager logic or depending on private Market UI responses
|
|
50
|
+
- **Uninstall** — two-step confirm; plugins installed this session are removed live
|
|
51
|
+
- **Hot disable / enable** — toggles write `- id: …` + `disabled: true|false` into the profile's `cordis.patch.yml` (the official patch layer, mechanism ported from [dsh-plugin-hub](https://github.com/Noob-stupid/dsh-plugin-hub)): ChatCode CLI re-composes within ~1s, no restart, and the loader re-applies the choice on every boot; hand-edited patch rows show as badges, host-infrastructure plugins are protected from toggling, and a malformed patch file is never made worse
|
|
52
|
+
- **Restart when needed** — changes that cannot hot-load show a one-click restart beside the pending-change banner; the action is restricted to same-origin loopback requests
|
|
53
|
+
- **Zero jargon** — if a component is missing (pnpm), the market detects it and offers a one-click automatic setup
|
|
54
|
+
- **Log export** — one click produces a sanitized plain-text log for bug reports (home paths and credential shapes are masked; nothing is ever sent anywhere). The market's version sits next to the page heading, so a screenshot of a problem already carries it
|
|
55
|
+
- **Settings card** — on ChatCode CLI 0.1.0-rc.7 and newer the market manages *itself* from **Settings → Plugins → Plugin configuration**, next to every other plugin: see the running version, pick a **release channel** (stable, or beta to try builds still being verified — the market only, never your other plugins; a third *dev* channel appears once developer mode is switched on, and carries builds published straight off a branch), update, or remove the market — with an opt-in cleanup that also drops the disable rows it wrote, so plugins it switched off start running again rather than staying off with no UI left to switch them back on
|
|
56
|
+
- **Diagnostics** — the plugin load order and conflict surface, one page: bundle stack with official/community badges, duplicate loader entries, dependency version mismatches, multi-version core packages, overrides and invalid config entries. Plain-language terms, problem blocks highlighted, everything collapsible
|
|
57
|
+
|
|
58
|
+
- **Load order** — drag community bundles into the order you want, or take the suggested one derived from the plugins' own before/after rules. Nothing is written until a trial composition passes, and the panel tells you what the new order would change (overrides, invalid or duplicate entries) before you apply it
|
|
59
|
+
- **AI fix** — one click copies a diagnostics-driven fix prompt (errors/warnings/order conflicts + conservative scope instructions) to the clipboard; you paste it into a new conversation and decide whether to send. The prompt first asks the agent to detect whether it is itself the ChatCode CLI instance running this profile — if so it hard-forbids mutating the live composition, upgrading/restarting ChatCode CLI or core packages, or reinstalling deps, and instead has it write an idempotent `apply` script plus a `rollback` script, have you run them in an external terminal, and paste the output back
|
|
60
|
+
|
|
61
|
+
## Speed
|
|
62
|
+
|
|
63
|
+
Installs prefer repo-verified npm packages, then author-supplied prebuilt GitHub Release tarballs, before falling back to full-repo GitHub source downloads. Prebuilt installs are typically seconds and do not need local build scripts; source-only plugins depend on your connection to GitHub.
|
|
64
|
+
|
|
65
|
+
## Security
|
|
66
|
+
|
|
67
|
+
- Installs are restricted to sources listed in the curated [awesome-dsh-plugin](https://awesome-dsh-plugin.com) registry — anything else is rejected
|
|
68
|
+
- Build scripts stay blocked by default (pnpm ≥10); allowing one is your explicit per-package choice
|
|
69
|
+
- Terminal/CLI-surface plugins are flagged before you install them into the web profile
|
|
70
|
+
- The install endpoint accepts same-origin POST only; the market never phones home
|
|
71
|
+
- Skill installation accepts same-origin POST only in Web, derives its destination from the live session instead of a browser-supplied path, and validates the downloaded ZIP before writing a skill root
|
|
72
|
+
- Backups can contain credentials from your profile config — the UI warns before export and upload; WebDAV sync is https-only, refuses private-network targets, and never stores your password in the browser
|
|
73
|
+
- Authenticated Gist requests always go directly to `api.github.com`; bearer tokens are never sent to a public GitHub acceleration service. GitHub source archives also stay on canonical codeload URLs so pnpm's integrity policy remains in force
|
|
74
|
+
- The restart endpoint additionally requires a direct loopback client (forwarded requests are rejected) and relaunches the exact ChatCode CLI entry, arguments, environment, and working directory
|
|
75
|
+
- One-click restart launches a detached replacement. **When this host is systemd's own service process the button is hidden automatically** — the market would otherwise kill the takeover process along with the unit's cgroup and the service would not come back. The pending-change notice stays visible and says so. Detection requires both a systemd marker AND being the unit's main process, because `INVOCATION_ID` is inherited by every descendant of a unit (an ordinary terminal included) and hiding the button for those would be the worse bug. pm2 and launchd are not detected, so those deployments need the explicit setting below. Either flip **Allow restart** off in **Settings → Plugins → Plugin configuration**, or write it into the profile patch — where it has to sit under `config:`, because the loader passes only that sub-object to a plugin and a top-level `allowRestart:` is silently ignored (#227 by @Fantasymax):
|
|
76
|
+
|
|
77
|
+
```yaml
|
|
78
|
+
- id: dsh-market
|
|
79
|
+
name: dshmarket
|
|
80
|
+
config:
|
|
81
|
+
allowRestart: false # NOT at the top level beside `name:`
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
`GET /dsh-market/status` reports `"restart": false` once it has taken effect.
|
|
85
|
+
- For terminal-attached launches, the detached replacement keeps running after the original terminal closes
|
|
86
|
+
- Listing ≠ endorsement: plugins are third-party code, install sources you trust
|
|
87
|
+
|
|
88
|
+
## Submit your plugin
|
|
89
|
+
|
|
90
|
+
**This repo is the market app, not the catalog.** The plugin list comes from the curated [awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin) registry — to get your plugin listed in the market, open a PR **there** (one entry in the list; the site and this market pick it up automatically, usually within a day). Please don't PR plugin entries against this repo.
|
|
91
|
+
|
|
92
|
+
## Roadmap & feedback
|
|
93
|
+
|
|
94
|
+
- **Bugs** go in [issues](https://github.com/dsh-market/dsh-market/issues) — attaching the market's "Export log" makes diagnosis roughly ten times faster
|
|
95
|
+
- **Feature ideas** go on the [Roadmap](https://github.com/orgs/dsh-market/projects/1). Issues are kept for things that are broken, so a proposal filed as an issue gets moved there and closed; the discussion stays where you wrote it either way
|
|
96
|
+
- Every roadmap item welcomes community PRs — say so on the item before starting, so two people don't build it twice
|
|
97
|
+
|
|
98
|
+
## Data source
|
|
99
|
+
|
|
100
|
+
Fetched live on every open from [awesome-dsh-plugin.com/plugins.json](https://awesome-dsh-plugin.com/plugins.json) — curated entries, npm mapping, and star counts refreshed daily by CI, with no stale cache behind it. A failure reports the actual reason and elapsed time, with a Retry button.
|
|
101
|
+
|
|
102
|
+
There is deliberately no bundled snapshot to fall back on: for a catalog that grows daily, a stale answer is not a degraded one but a wrong one — a plugin published this morning would read as "does not exist".
|
|
103
|
+
|
|
104
|
+
**If that host is unreachable from your network**, point the market at a mirror instead. Set `CHATCODE_CLI_MARKET_REGISTRY_URL` in the ChatCode CLI environment to anything serving the same `plugins.json` shape (legacy `DSHM_REGISTRY_URL` remains accepted):
|
|
105
|
+
|
|
106
|
+
```sh
|
|
107
|
+
CHATCODE_CLI_MARKET_REGISTRY_URL=https://your-mirror.example/plugins.json chatcode-cli web
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Friends
|
|
111
|
+
|
|
112
|
+
### DSH Desktop (dataelement)
|
|
113
|
+
|
|
114
|
+
[dsh-desktop](https://github.com/dataelement/dsh-desktop) — a desktop app for DeepSeek Harness: run and manage a local Harness without installing Node.js yourself. Ships with this plugin market preset as the default. [dshdesktop.com](https://dshdesktop.com)
|
|
115
|
+
|
|
116
|
+
### DeepSeek Harness Desktop (hairyf)
|
|
117
|
+
|
|
118
|
+
[deepseek-harness-desktop](https://github.com/hairyf/deepseek-harness-desktop) — a native desktop app for DeepSeek Harness built with **Tauri** (Rust + Web): one-click local install and launch with no Node.js setup required. On first run it offers to install this plugin market as a recommended preset.
|
|
119
|
+
|
|
120
|
+
### DeepSeek Harness Desktop (anywhere-labs)
|
|
121
|
+
|
|
122
|
+
[deepseek-harness-desktop](https://github.com/anywhere-labs/deepseek-harness-desktop) — an Electron desktop app for DeepSeek Harness built around the idea that everything is a plugin, including the desktop itself: profile switching, a bundled Node and pnpm, and a recoverable install path that snapshots the profile before a change. [dshdesktop.cn](https://dshdesktop.cn)
|
|
123
|
+
|
|
124
|
+
### DSH App
|
|
125
|
+
|
|
126
|
+
[dsh-app](https://github.com/RyensX/dsh-app) — a DeepSeek Harness desktop client built on Tauri 2 rather than Electron, so it ships a much smaller binary and uses the system webview. AGPL-3.0.
|
|
127
|
+
|
|
128
|
+
### Local DSH
|
|
129
|
+
|
|
130
|
+
[local-dsh](https://github.com/liangchen-harold/local-dsh) — a DeepSeek Harness desktop client that can run the model on your own machine: it bundles llama.cpp next to Node, pnpm and DSH, so a downloaded GGUF model answers without any external API. Built on Tauri; Apple Silicon Macs for now. [localdsh.com](https://localdsh.com)
|
|
131
|
+
|
|
132
|
+
### DSH Get
|
|
133
|
+
|
|
134
|
+
[DSH Get](https://www.dshget.com/) — a searchable web directory for discovering DeepSeek Harness plugins: category filters, bilingual descriptions, install commands and per-plugin detail pages. Its normalized catalog snapshot is public at [bobby-sheng/dshget-data](https://github.com/bobby-sheng/dshget-data).
|
|
135
|
+
|
|
136
|
+
### modlens
|
|
137
|
+
|
|
138
|
+
[modlens](https://github.com/liustack/modlens) — the first vision plugin for DeepSeek Harness: bolts visual understanding onto text-only models like DeepSeek and GLM. Paste an image, get structured JSON evidence back — OCR, layout, semantics. Available right in this market:
|
|
139
|
+
|
|
140
|
+
```sh
|
|
141
|
+
chatcode-cli plugin --profile web add @liustack/modlens
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## License
|
|
145
|
+
|
|
146
|
+
MIT · [dshmarket.com](https://dshmarket.com)
|
package/README.zh.md
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo.svg" width="96" alt="ChatCode CLI 插件市场 logo">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# ChatCode CLI 插件市场
|
|
6
|
+
|
|
7
|
+
[English](README.md) | 中文
|
|
8
|
+
|
|
9
|
+
[](https://www.npmjs.com/package/@chatcode/cco-market)
|
|
10
|
+
[](https://github.com/dsh-market/dsh-market)
|
|
11
|
+
|
|
12
|
+
ChatCode CLI 的插件市场。打开设置 → **插件市场** → 逛一逛,点一下,装好。
|
|
13
|
+
|
|
14
|
+

|
|
15
|
+
|
|
16
|
+
主题一键换:装完即生效,点一下切换,不用重启。
|
|
17
|
+
|
|
18
|
+
## 安装
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
chatcode-cli plugin --profile web add @chatcode/cco-market
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
重启 `chatcode-cli web`,打开 **设置 → 插件市场**。
|
|
25
|
+
|
|
26
|
+
同一个包还会在 Web 提供**设置 → 技能市场**,并在 TUI 提供 `/skill-market`。项目安装写入最近 Git 仓库的 `.chatcode-cli/skills/<name>`;个人安装写入 `$CHATCODE_CLI_HOME/skills/<name>`(未设置时为 `~/.chatcode-cli/skills/<name>`)。Web 从选中的活动会话解析目标目录,TUI 使用当前 channel 的工作区。
|
|
27
|
+
|
|
28
|
+
技能压缩包有下载与解压大小限制,会拒绝路径穿越和符号链接,必须且只能包含一个有效 `SKILL.md`,并且不会覆盖缺少匹配 `.skill-market.json` 所有权信息的同名技能。可在 `config.skillMarket` 下修改公开目录地址和压缩包限制。
|
|
29
|
+
|
|
30
|
+
**需要 ChatCode CLI 0.1.0-rc.6 或更新版本。** 宿主太旧时市场会自我禁用,并在浏览器
|
|
31
|
+
控制台说明原因,而不是拿缺失的原语去渲染——如果设置里根本没出现「插件市场」这
|
|
32
|
+
一项,通常就是这个原因。桌面端要留意:它可能内置了比 `npm` 装到的更旧的宿主版本(#139)。
|
|
33
|
+
|
|
34
|
+
## 你会得到
|
|
35
|
+
|
|
36
|
+
- **逛与搜**——完整社区目录(2300+ 插件,每天在涨),分类筛选、star 数、最热/最新排序,中英描述跟随界面语言
|
|
37
|
+
- **技能市场**——Web 和 `/skill-market` 共用一个实现,不需要新增插件;可选择项目或个人目录,安装后的文件由 ChatCode CLI 自动发现
|
|
38
|
+
- **按宿主发现**——卡片展示插件通过 `engines.dsh` 或同版本线 `@deepseek-ai/dsh-*` peer 声明的 DSH 要求;可选筛选只隐藏与当前宿主明确不匹配的插件。未声明、格式异常、暂时取不到清单及仅 GitHub 发布的条目仍保持可见,不猜成不兼容
|
|
39
|
+
- **截图展示**——App Store 式截图,多图自动轮播,点开还能看大图;作者在 registry 里策展的截图列表卡片就直接显示(零额外请求),没有策展的插件则在打开安装弹窗时自动从 README 抽取;图片仅从 GitHub 图床加载
|
|
40
|
+
- **评论**——每张卡片都能就地打开该插件的讨论。它和插件在 [dshmarket.com](https://dshmarket.com) 与[目录站](https://awesome-dsh-plugin.com)上的页面共用同一条讨论,一个插件只有一处对话,而不是三处。底层是 GitHub Discussions(经由 giscus):打开即加载,只有发表评论才需要 GitHub 账号;说明里也直说打开会连接 giscus.app 与 GitHub。ChatCode CLI Web 继续内嵌评论供阅读,登录和发表则通过专用 GitHub 入口在新标签页打开当前插件的精确讨论,不让跨站回跳携带或依赖宿主会话
|
|
41
|
+
- **收藏**——在「发现」或「主题」页点书签即可收藏插件/主题;「收藏」Tab 集中展示,支持搜索、排序与安装。书签写入 profile 的市场状态(`state.json`);已下架条目可一键清除
|
|
42
|
+
- **主题**——独立主题页:装完立即生效,点一下切换(主题互斥、选择跨重启保留),卸载即恢复
|
|
43
|
+
- **一键安装**——确认来源,实时进度;多数插件刷新页面即可用,无需重启
|
|
44
|
+
- **备份与恢复**——把 profile 的插件清单与配置导出为可读 JSON,换机导入,存到 WebDAV 并每日自动备份,或通过私有 GitHub Gist 跨机器同步;恢复采用**合并**方式(备份之后新装的插件会保留),写入前校验、失败自动回滚
|
|
45
|
+
- **更新**——逐插件检测(npm 版本或锁定 commit 对比 HEAD),一键更新或全部更新;市场自己也走同一通道升级
|
|
46
|
+
- **GitHub 多线路容错**——中国大陆下载区域会为 Git ref、README 与头像分别维护 fallback 顺序,记住上次可用线路,只在传输、HTTP 状态或响应内容校验失败后换线,并拒绝公共反代伪装成 HTTP 200 的 HTML 错误页。内置线路全部失效时,可到**设置 → 插件 → 插件配置 → GitHub 加速**填写一个持久化的自定义 HTTPS 前缀;运维设置的 `CHATCODE_CLI_MARKET_GITHUB_PROXY` 始终优先(仍兼容读取 `DSHM_GITHUB_PROXY`)
|
|
47
|
+
- **公共更新接口**——插件自己的设置页可调用带版本号、能力探测和回滚状态的[更新 API v1](UPDATE-API-V1.md)(beta),无需复制包管理逻辑,也不依赖市场 UI 的私有响应字段
|
|
48
|
+
- **卸载**——两步确认防误触;本次会话装的插件即点即卸
|
|
49
|
+
- **热禁用 / 启用**——开关会往 profile 的 `cordis.patch.yml`(官方补丁层,机制移植自 [dsh-plugin-hub](https://github.com/Noob-stupid/dsh-plugin-hub))写入 `- id: …` + `disabled: true|false`:ChatCode CLI 约 1 秒内重新组合,无需重启,loader 每次启动都会重新应用这个选择;手工改过的补丁行会显示成徽标,宿主基础设施插件禁止开关,补丁文件格式不对时绝不会被写得更糟
|
|
50
|
+
- **按需重启**——无法热加载的变更会在待重启提示旁显示一键重启;操作仅接受本机同源请求
|
|
51
|
+
- **零术语**——缺组件(pnpm)时市场自己发现、一键自动装好,全程不见命令行
|
|
52
|
+
- **导出日志**——一键生成脱敏纯文本日志方便反馈(home 路径与密钥形状已打码;任何数据都不会被上传)。市场版本号就在标题旁边,截图反馈时自带版本信息
|
|
53
|
+
- **设置卡片**——ChatCode CLI 0.1.0-rc.7 起,市场在 **设置 → 插件 → 插件配置** 里管理**它自己**,和其它插件并排:看当前版本、选择**更新通道**(稳定版,或 Beta 抢先试用还在验证中的版本——只影响市场自己,不影响你装的其它插件;打开开发者模式后还会多出「开发版」通道,直接取开发分支上的构建)、更新、或者移除市场。移除时可勾选一并清理——包括市场写进补丁层的停用行,被它关掉的插件会恢复运行,而不是保持停用却再没有界面能打开它们
|
|
54
|
+
- **诊断**——插件加载顺序与冲突一页看全:bundle 栈(官方/社区徽标)、重复的 loader 条目、依赖版本不一致、核心包多版本共存、覆盖项与非法配置条目。术语说人话,问题块高亮,全部可折叠
|
|
55
|
+
- **加载顺序**——拖拽调整社区 bundle 的顺序,或直接采用按插件自身 before/after 规则推导出的建议顺序。写入前先跑一次静态组合校验,通过才落盘;应用之前面板会告诉你这个顺序会改变什么(多少处覆盖、多少无效或重复条目)
|
|
56
|
+
- **AI 修复**——一键把诊断结果生成的修复 prompt(错误/警告/顺序冲突 + 保守的改动范围约束)复制到剪贴板,你粘进新对话,自己决定发不发。提示词会先让 Agent 判断自己是不是就是这个 profile 所在的 ChatCode CLI 实例——若是,则严禁改动运行中组合、升级/重启 ChatCode CLI 或核心包、重装依赖,而是让它生成一份幂等的 `apply` 修改脚本和一份 `rollback` 回滚脚本,由你在外部终端执行并把输出拷回给它
|
|
57
|
+
|
|
58
|
+
## 速度
|
|
59
|
+
|
|
60
|
+
安装依次优先使用经仓库验证的 npm 包、作者提供的 GitHub Release 预构建 tarball,最后才回退到整仓 GitHub 源码下载。预构建安装通常只需数秒且无需执行本地构建脚本;仅提供源码的插件仍取决于你到 GitHub 的网络。
|
|
61
|
+
|
|
62
|
+
## 安全
|
|
63
|
+
|
|
64
|
+
- 只允许安装 [awesome-dsh-plugin](https://awesome-dsh-plugin.com) 精选列表内的来源,其它一律拒绝
|
|
65
|
+
- 构建脚本默认禁止执行(pnpm ≥10),放行与否由你按包显式决定
|
|
66
|
+
- 终端/命令行类插件装进网页版前会被明确提醒
|
|
67
|
+
- 安装接口只接受同源 POST;市场不会向任何地方上报数据
|
|
68
|
+
- Web 技能安装只接受同源 POST,目标路径由活动会话解析而不是由浏览器指定,下载的 ZIP 校验通过后才写入技能目录
|
|
69
|
+
- 备份可能包含 profile 配置里的密钥——导出与上传前 UI 会明确提醒;WebDAV 同步仅限 https、拒绝内网地址,且密码永不落盘浏览器
|
|
70
|
+
- 带鉴权的 Gist 请求始终直连 `api.github.com`,Bearer token 不会交给公共 GitHub 加速服务;GitHub 源码归档也保持 canonical codeload URL,以保留 pnpm 的完整性校验边界
|
|
71
|
+
- 重启接口还要求客户端直接来自环回地址(拒绝代理转发请求),并使用原入口、参数、环境和工作目录重新启动 ChatCode CLI
|
|
72
|
+
- 一键重启会启动脱离终端的替代进程。**当本进程就是 systemd 服务的主进程时,按钮会自动隐藏**——否则市场重启会连带杀掉 cgroup 里的接管进程,服务起不来,待重启提示会说明原因。判定要求「systemd 标记」和「本进程是该 unit 的主进程」同时成立:`INVOCATION_ID` 会被 unit 的所有后代继承(包括普通终端),只看它会误伤一大批本来能正常重启的机器。pm2 和 launchd 不做检测,这类部署需要下面的显式配置。两种做法:在**设置 → 插件 → 插件配置**里关掉「允许重启」,或者写进 profile 补丁——注意必须嵌在 `config:` 下面,因为 loader 只把这个子对象传给插件,写在顶层会静默失效(#227,感谢 @Fantasymax):
|
|
73
|
+
|
|
74
|
+
```yaml
|
|
75
|
+
- id: dsh-market
|
|
76
|
+
name: dshmarket
|
|
77
|
+
config:
|
|
78
|
+
allowRestart: false # 不要和 `name:` 并排写在顶层
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
生效后 `GET /dsh-market/status` 会返回 `"restart": false`。
|
|
82
|
+
- 从终端启动时,替代进程脱离原终端,关闭原终端后仍会继续运行
|
|
83
|
+
- 收录 ≠ 背书:插件是第三方代码,请只安装你信任的来源
|
|
84
|
+
|
|
85
|
+
## 提交你的插件
|
|
86
|
+
|
|
87
|
+
**这个仓库是市场应用本身,不是插件目录。** 市场里的插件列表来自精选列表 [awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin)——想让你的插件上架,请去**那边**提 PR(在列表里加一条即可,站点和本市场会自动收录,通常一天内生效)。请不要往本仓库提插件条目。
|
|
88
|
+
|
|
89
|
+
## 路线图与反馈
|
|
90
|
+
|
|
91
|
+
- **Bug** 提 [issue](https://github.com/dsh-market/dsh-market/issues),附上市场页面的「导出日志」能让排查快十倍
|
|
92
|
+
- **功能建议**放 [Roadmap](https://github.com/orgs/dsh-market/projects/1)。issues 只留「坏掉的东西」,所以提成 issue 的建议会被移到那边并关闭;讨论仍留在你写的地方
|
|
93
|
+
- 路线图上的每一项都欢迎社区 PR——动手前在对应条目里说一声,免得两个人重复造
|
|
94
|
+
|
|
95
|
+
## 数据源
|
|
96
|
+
|
|
97
|
+
每次打开都实时请求 [awesome-dsh-plugin.com/plugins.json](https://awesome-dsh-plugin.com/plugins.json)——精选条目、npm 映射、star 数由 CI 每日刷新,不使用过期缓存兜底;连不上时会给出具体原因和耗时,并提供「重试」按钮。
|
|
98
|
+
|
|
99
|
+
刻意不做本地快照兜底:目录每天都在增长,过期的答案不是「差一点」而是「错的」——今早刚发布的插件会显示成「不存在」。
|
|
100
|
+
|
|
101
|
+
**如果你的网络访问不了这个域名**,可以改指到镜像:在 ChatCode CLI 运行环境里设置 `CHATCODE_CLI_MARKET_REGISTRY_URL`,指向任何提供相同 `plugins.json` 结构的地址(仍兼容读取 `DSHM_REGISTRY_URL`):
|
|
102
|
+
|
|
103
|
+
```sh
|
|
104
|
+
CHATCODE_CLI_MARKET_REGISTRY_URL=https://your-mirror.example/plugins.json chatcode-cli web
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## 友情链接
|
|
108
|
+
|
|
109
|
+
### DSH Desktop(dataelement)
|
|
110
|
+
|
|
111
|
+
[dsh-desktop](https://github.com/dataelement/dsh-desktop)——DeepSeek Harness 桌面客户端:无需自装 Node.js 即可运行和管理本地 Harness,并默认预置本插件市场。[dshdesktop.com](https://dshdesktop.com)
|
|
112
|
+
|
|
113
|
+
### DeepSeek Harness Desktop(hairyf)
|
|
114
|
+
|
|
115
|
+
[deepseek-harness-desktop](https://github.com/hairyf/deepseek-harness-desktop)——基于 **Tauri**(Rust + Web)构建的 DeepSeek Harness 原生桌面客户端:一键本地安装并启动,无需自装 Node.js;首次启动可选择安装本插件市场作为推荐插件。
|
|
116
|
+
|
|
117
|
+
### DeepSeek Harness Desktop(anywhere-labs)
|
|
118
|
+
|
|
119
|
+
[deepseek-harness-desktop](https://github.com/anywhere-labs/deepseek-harness-desktop)——基于 Electron 的 DeepSeek Harness 桌面客户端,理念是「万物皆插件,桌面本身也是插件」:支持 profile 切换、内置 Node 与 pnpm,安装前会先给 profile 拍快照以便回滚。[dshdesktop.cn](https://dshdesktop.cn)
|
|
120
|
+
|
|
121
|
+
### DSH App
|
|
122
|
+
|
|
123
|
+
[dsh-app](https://github.com/RyensX/dsh-app)——基于 Tauri 2(而非 Electron)的 DeepSeek Harness 桌面客户端,因此安装包小得多,界面走系统 webview。AGPL-3.0。
|
|
124
|
+
|
|
125
|
+
### Local DSH
|
|
126
|
+
|
|
127
|
+
[local-dsh](https://github.com/liangchen-harold/local-dsh)——可以把模型跑在本机的 DeepSeek Harness 桌面客户端:发行包内置 llama.cpp 与 Node、pnpm、DSH,下载一个 GGUF 模型就能对话,不必接外部 API。基于 Tauri 构建;目前支持 Apple 芯片的 Mac。[localdsh.com](https://localdsh.com)
|
|
128
|
+
|
|
129
|
+
### DSH Get
|
|
130
|
+
|
|
131
|
+
[DSH Get](https://www.dshget.com/)——DeepSeek Harness 插件的网页检索目录:分类筛选、中英描述、安装命令与插件详情页;其规范化的目录快照公开在 [bobby-sheng/dshget-data](https://github.com/bobby-sheng/dshget-data)。
|
|
132
|
+
|
|
133
|
+
### modlens
|
|
134
|
+
|
|
135
|
+
[modlens](https://github.com/liustack/modlens)——全网第一个 DeepSeek Harness 视觉插件,为 DeepSeek、GLM 等纯文本模型外挂视觉能力,粘贴图片即得结构化 JSON 证据(OCR、版面、语义)。本市场内即可直接安装:
|
|
136
|
+
|
|
137
|
+
```sh
|
|
138
|
+
chatcode-cli plugin --profile web add @liustack/modlens
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## 许可
|
|
142
|
+
|
|
143
|
+
MIT · [dshmarket.com](https://dshmarket.com)
|
package/UPDATE-API-V1.md
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# Public plugin update API v1
|
|
2
|
+
|
|
3
|
+
> **Status: beta.** The shape described here may still change between
|
|
4
|
+
> releases. `GET /dsh-market/api/v1/capabilities` reports
|
|
5
|
+
> `"stability": "beta"` while that is true, and `"stable"` once it stops
|
|
6
|
+
> moving — read that field rather than assuming from the `v1` in the path.
|
|
7
|
+
>
|
|
8
|
+
> Nothing here is going away; what is not yet promised is that field names
|
|
9
|
+
> and response shapes will survive untouched. If you ship against it now,
|
|
10
|
+
> say so in an issue: a shape somebody depends on is a much stronger reason
|
|
11
|
+
> not to move it, and it is how this reaches `stable`.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
`dshmarket` exposes a small, versioned, same-origin JSON API for plugin-owned
|
|
15
|
+
update surfaces. It lets a plugin show its own update button without spawning a
|
|
16
|
+
package manager, copying the Market installation algorithm, or binding to the
|
|
17
|
+
Market UI's private response fields.
|
|
18
|
+
|
|
19
|
+
All responses carry:
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{ "schema": "dsh-market/update-api/v1" }
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Clients must discover the API before enabling mutation controls:
|
|
26
|
+
|
|
27
|
+
```http
|
|
28
|
+
GET /dsh-market/api/v1/capabilities
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The response names the Market version, profile, runtime (`web` or `desktop`),
|
|
32
|
+
supported features, restart owner and endpoint paths. A client must hide its
|
|
33
|
+
restart button when `restart.supported` is false. Desktop and supervised hosts
|
|
34
|
+
normally delegate restart to their owning shell or operator.
|
|
35
|
+
|
|
36
|
+
## Check one installed package
|
|
37
|
+
|
|
38
|
+
```http
|
|
39
|
+
GET /dsh-market/api/v1/updates?name=dsh-mcp-connector&force=1
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The response includes the installed version, target version, source kind and
|
|
43
|
+
whether the target is a forward update. Omitting `force=1` allows the Market's
|
|
44
|
+
short update-check cache.
|
|
45
|
+
|
|
46
|
+
## Start and observe an update
|
|
47
|
+
|
|
48
|
+
Mutation requests require the same-origin protection used by the Market UI.
|
|
49
|
+
|
|
50
|
+
```http
|
|
51
|
+
POST /dsh-market/api/v1/updates
|
|
52
|
+
Content-Type: application/json
|
|
53
|
+
|
|
54
|
+
{ "packageName": "dsh-mcp-connector" }
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
An accepted request returns HTTP `202` immediately with an `operationId`.
|
|
58
|
+
Passing `"force": true` opts this one operation out of the registry release-age
|
|
59
|
+
wait; clients should offer it only after the normal operation reports
|
|
60
|
+
`RELEASE_TOO_FRESH` or `VERSION_UNCHANGED`.
|
|
61
|
+
|
|
62
|
+
Poll the operation by id:
|
|
63
|
+
|
|
64
|
+
```http
|
|
65
|
+
GET /dsh-market/api/v1/operations?operationId=<id>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
States are `queued`, `running`, `succeeded`, `failed`, `cancelled` and
|
|
69
|
+
`rolled-back`. Running operations include structured package progress when
|
|
70
|
+
pnpm provides it. Terminal operations include:
|
|
71
|
+
|
|
72
|
+
- the before and actually installed versions;
|
|
73
|
+
- `refreshRequired` and `restartRequired` outcomes;
|
|
74
|
+
- a stable failure code, bounded user-facing message and retryability;
|
|
75
|
+
- whether a compatibility rollback is currently available.
|
|
76
|
+
|
|
77
|
+
For npm updates, Market verifies the package version that pnpm actually placed
|
|
78
|
+
on disk before reporting success. This prevents pnpm's release-age policy or a
|
|
79
|
+
lagging registry mirror from silently turning `@latest` into an older or
|
|
80
|
+
unexpected build. A mismatch is restored from the pre-update recovery point
|
|
81
|
+
and reported as one of these stable failures:
|
|
82
|
+
|
|
83
|
+
- `DOWNGRADE_DETECTED`: the resolved version is older than the version present
|
|
84
|
+
before the operation; not retryable without a new target.
|
|
85
|
+
- `RESOLVED_VERSION_MISMATCH`: the resolved version is BELOW the registry
|
|
86
|
+
target checked immediately before installation; retryable after registry or
|
|
87
|
+
mirror convergence. A version above that target is accepted — `latest` can
|
|
88
|
+
move forward while the install is still running.
|
|
89
|
+
|
|
90
|
+
Provider clients should still compare `beforeVersion`, the target they showed
|
|
91
|
+
to the user, and `installedVersion` before offering restart. That independent
|
|
92
|
+
check protects clients connected to another compatible provider implementation.
|
|
93
|
+
|
|
94
|
+
Up to 50 operation records live in the current Host process. A boot id is
|
|
95
|
+
embedded in every operation id, so a client never mistakes a stale browser
|
|
96
|
+
record for a task belonging to the replacement process.
|
|
97
|
+
|
|
98
|
+
## Roll back
|
|
99
|
+
|
|
100
|
+
```http
|
|
101
|
+
POST /dsh-market/api/v1/rollback
|
|
102
|
+
Content-Type: application/json
|
|
103
|
+
|
|
104
|
+
{ "operationId": "<id>" }
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Rollback is intentionally capability- and operation-scoped. It is available
|
|
108
|
+
only when the Market's compatibility verification retained a recovery point;
|
|
109
|
+
a later mutation may supersede it. The normalized result is written back to
|
|
110
|
+
the same operation record.
|
|
111
|
+
|
|
112
|
+
## Restart
|
|
113
|
+
|
|
114
|
+
```http
|
|
115
|
+
POST /dsh-market/api/v1/restart
|
|
116
|
+
Content-Type: application/json
|
|
117
|
+
|
|
118
|
+
{}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
This preserves the Market's stricter restart guard: direct loopback,
|
|
122
|
+
same-origin, no forwarding headers, no package mutation in progress, and a Host
|
|
123
|
+
whose lifecycle is not owned by Desktop or a supervisor. Clients must feature
|
|
124
|
+
detect it; they must not invent an alternative process-control path.
|
|
125
|
+
|
|
126
|
+
## Compatibility policy
|
|
127
|
+
|
|
128
|
+
- New optional response fields may be added within v1.
|
|
129
|
+
- Existing v1 fields and meanings are not repurposed.
|
|
130
|
+
- A breaking change uses a new path and schema version.
|
|
131
|
+
- When discovery is unavailable, plugin UIs should fall back to opening the
|
|
132
|
+
Market rather than calling legacy `/dsh-market/*` mutation routes directly.
|