Commit Graph
166 Commits
Author SHA1 Message Date
turtle1999 ed92c867ed feat(plugin-market): name the plugin and version in a Discover install
A Discover install passes the entry's localized title and version with its
spec. Every install dialog screen names the plugin and version, and shows the
spec, such as a pinned git+https URL, below in smaller monospace text.
2026-10-15 05:37:44 +08:00
turtle1999 b227127d62 fix(plugin-market): keep the Installed tab panel and list the markets bundle under More
The Installed tab panel now wraps its loading, unavailable, and empty states.
Custom plugin markets joins the bundles the More page holds back until the
profile enables them, and the repository field and its directory rule are
documented.
2026-10-15 05:37:44 +08:00
turtle1999 3de3a977e0 feat(plugin-market): add the Custom plugin markets bundle and Discover tab
Read configured plugin market indexes on the Host, search them with fuzzy
multilingual matching, and install a chosen version from the Plugins page.

- dsh-plugin-market-index validates format-1 indexes and builds install
  arguments; inline icons are capped at 32 KiB.
- The pluginMarket service fetches configured http(s) URLs, parses bodies in
  a Worker Thread, caches documents, and pages filtered, ordered results with
  installation status and engines.dsh compatibility.
- Discover is an opt-in experimental bundle; the Plugins page gains a
  plugins.tab slot and confirmed installs.
- The plugin_market tool lists indexes, plugins, and versions for Creator mode.
- Plugin compatibility reads engines.dsh before DSH peer dependencies.
2026-10-15 05:37:44 +08:00
ZiyaZhang c1269a8f75 feat(plugins): standardize built-in previews and illustrate voice input 2026-10-14 02:19:42 -07:00
turtle1999andZiyaZhang a2141868de fix(plugin-manager): reset a failed preview by source instead of a key
Co-authored-by: ZiyaZhang <[email protected]>
2026-10-14 16:55:21 +08:00
turtle1999andZiyaZhang 7fcaf07051 feat(plugin-manager): show a built-in feature preview for the badge skill
Plugin Manager hardcodes feature previews by package name, like its
experimental bundle lists, instead of reading a package manifest field.
The DSH badge skill bundle shows an English or Chinese illustration
below its description. Client bundles embed imported SVG, PNG, and
WebP files as data URLs through the shared tsdown preset, which
replaces the account package's own asset loader.

Co-authored-by: ZiyaZhang <[email protected]>
2026-10-14 16:22:56 +08:00
turtle1999 879ad372ac feat(hmr): replace plugins whose package files changed during profile recomposition
With HMR, installing, enabling, disabling and removing bundles take effect live. Each profile recomposition compares
the loaded modules below the profile directory and its linked targets with disk, stops the plugins whose files
changed, and recomposes the profile through app-boot's recomposeProfile(): the rows the next generation drops are
removed first, the latest runtime resolution is published once, and the generation is applied and judged. Afterwards
HMR evicts the modules below the mappings the recomposition dropped.

- app-boot: recomposeProfile(); PluginPackages.resolution; ResolutionRestartRequired; the resolver accepts in-place
  version changes and relinks, and relocates Node's cached link real paths.
- plugin-manager: with HMR, installBundle refuses an installed package (already-installed), so an upgrade is a
  removal and an installation; every restart-required result carries a restartReason; removal uses the registry the
  package was installed from.
- ui-plugin-manager: the Official Update removes and then installs; restart prompts name their reason.
2026-10-13 22:15:57 +08:00
dsh-portal[bot] 60328899e5 fix(web): pin a plugin enabled on the More page to the main plugins list
Switching on an experimental bundle from the More page left it only on
that page, so a plugin the profile had enabled was missing from the main
Experimental plugins group. Both lists now read one order over the
offered bundles: the main list holds the always-held ones plus the
held-back ones the profile enabled, and a pinned bundle keeps its
More-list position. A bundle's details opened outside the lists return to
the list that shows it.
2026-10-13 15:34:36 +08:00
Yif 9e62c1c229 fix(web): restore the plugin header subtitle row to its flex layout
The responsive change had moved `.pageIntro` off flex, which put the information
icon 1.06px off the subtitle's vertical centre and failed the existing geometry
assertion in `plugin-manager.e2e.ts`. Restore the flex row and the button's
`flex: none`, which keeps the 4px gap and the centring. The header still wraps
its action group onto another line, which is what this change is for.

Pin the wrap threshold in both header scenarios. Each records whether the action
group sits beside or below the heading, the plugin scenario asserts the wide and
narrow sides explicitly, and the plugin scenario launches its own scaffold so an
install task left by an earlier test cannot move the threshold between runs.
2026-10-12 23:15:20 +08:00
Yif ee558c82d7 feat(web): reflow the Plugins page header at narrow widths
The page header wraps its action group onto another line when the title and the
actions no longer fit together, so the title keeps its width and the actions keep
their labels on one line. The information button follows the subtitle text
instead of a flex row, which keeps it beside the copy at every width.

Cover the header in the plugin-manager browser scenario: the action group stays
inline when it fits, moves below when it does not, keeps its labels on one line,
stays inside the header, and retains focus across the change.
2026-10-12 21:56:08 +08:00
Ziya 640e28cd94 feat(web): reorganize plugin settings and add experimental catalog page (#5922)
Group built-in settings before optional and installed plugins, and open the full experimental catalog on a separate page.

Preserve detail navigation and unsaved configuration when installation finishes, and use the visible More label as the accessible name.
2026-10-08 23:42:56 -07:00
Turtle cdf2f4c4b6 Merge pull request #5839 from deepseek-harness/turtle/revert-preset-insert-80a9ec3a652f
revert(plugin): drop preset-scoped profile patches; ship optional tools as global Host rows
2026-10-08 15:36:24 +08:00
Turtle b173f3e2a2 revert(plugin): drop preset-scoped profile patches; ship optional tools as global Host rows
Remove the `{ preset, insert }` / `{ preset, id, ...override }` profile patch
operation added in #5773, together with the app-boot compiler and reload drain,
config-editor filtering, plugin-manager preset row inventory and retained-module
removal checks, the read-only preset rows on the Plugins page, and the
agent-preset-registry row identities that served them.

Session search, Ralph, persistent terminals, Codex, and Claude Code bundles now
insert ordinary Host rows whose tools register in the global tool layer, like the
earlier optional bundles. Every preset, including minimal, sees them, and toggling
a bundle updates live Agents without new composition generations.
2026-10-07 20:46:37 +08:00
Tianyi Cui 88311637f8 fix(client): focus only overflowing command text 2026-10-07 02:04:33 +08:00
Tianyi Cui f7e5b6d354 fix(plugins): install official source bundles from the running checkout 2026-10-07 01:26:01 +08:00
Tianyi Cui e9a68b2484 fix(plugin): clarify on-demand recovery and preserve package diagnostics 2026-10-07 01:26:00 +08:00
Tianyi Cui 8ed0b530ed feat(plugins): offer official bundles through on-demand installation 2026-10-07 01:26:00 +08:00
Tianyi Cui 7e65d1119b fix(plugin): preserve scoped identities across inspection consumers 2026-10-06 23:48:59 +08:00
Tianyi Cui d84c8f9a6f fix(plugin): distinguish unevaluated preset row conditions 2026-10-06 23:48:59 +08:00
Tianyi Cui 8a9767c25e feat(plugin): validate optional bundle lifecycles and session output 2026-10-06 23:48:58 +08:00
Tianyi Cui 3aa1cab43a feat(plugin): compose optional bundles inside agent presets 2026-10-06 23:48:58 +08:00
Turtle 9c5fb6b0c5 Merge pull request #5550 from deepseek-harness/turtle/plugin-version-hint-66b6a2501f82
feat(plugin-manager): name the exact spec when pnpm installs an older version
2026-10-01 12:36:36 +08:00
Turtle 0bd1492940 fix(ui-plugin-manager): state the supply-chain policy, risk and remedy in the version notice 2026-10-01 12:19:01 +08:00
Turtle 43c5f1e924 fix(plugin-manager): explain another installed version only for one-registry runs 2026-09-30 18:42:32 +08:00
Turtle bab69fbec5 feat(plugin-manager): name the exact spec when pnpm installs an older version 2026-09-30 18:13:26 +08:00
turtle1999 00b363074a fix(plugin-manager): let the page remove a selection no package holds
Desktop loads its profile with `loadProfileDirectory`, so the retired
bundle removal moves there from `loadProfile` and covers every loader.

A name in `dsh.profile.bundles` that neither the profile's dependencies
nor the installation holds had no uninstall on the Plugins page: the
button required `installed`. The Host now reports such a selection as
`removable`, and `removeBundle` deselects it without running pnpm. The
page shows uninstall for `installed || removable`.
2026-09-30 17:36:56 +08:00
Turtle 508e71b686 Merge pull request #5428 from deepseek-harness/turtle/plugin-source-section
feat(plugins): 在组合包详情页显示来源信息
2026-09-30 11:15:39 +08:00
Ziya 4d59dc2dd6 Merge pull request #5399 from deepseek-harness/demo/plugin-first-ui
feat(web): add Creator entry to the plugin menu
2026-09-29 08:03:23 -07:00
ZiyaZhang 57383630a6 Merge updated Creator mode parent and keep shared entry flow 2026-09-29 02:30:07 -07:00
Ziya 2bde15f551 Merge pull request #5410 from deepseek-harness/turtle/plugin-upgrade-copy-66fc552187f2
fix(ui-plugin-manager): tell users to reinstall a plugin to upgrade it
2026-09-29 00:00:44 -07:00
turtle1999 9b79f97010 fix(plugins): keep aliases and whole user information in bundle sources
Address the second ds-review-bot round on the bundle Source section:

- remove an http(s) URL's user information up to its last `@`, so a
  username containing `@` no longer leaves the password behind;
- keep the dependency name before a local or git spec when the package's
  own manifest name differs, so reinstalling restores the alias;
- accept scp-like git addresses with any user name;
- show Built in for a profile dependency whose loaded copy the
  installation supplies, instead of hiding the section;
- align the PackageView, subsystem page, and README wording with the
  shadowing rule and the kept query string, and assert the source of
  not-bundle and unreadable bundles.
2026-09-29 13:27:43 +08:00
turtle1999 6d1e12b237 fix(plugins): keep credentials and shadowed copies out of bundle sources
Address the first ds-review-bot round on the bundle Source section:

- strip the user information of http(s) and git+http(s) URLs so a private
  Git URL's token reaches neither the page nor the plugin_manager tool;
- expand `~` in file:/link: paths to the home directory as pnpm does;
- write jsr: aliases after the dependency name, like npm: aliases;
- give no source for a profile dependency the installation also supplies,
  whose installation copy is the one that loads;
- label the English row "Code source" to match the Chinese copy and hold
  for built-in bundles, and sync the subsystem page, READMEs, CSS comment,
  and tool test.
2026-09-29 12:07:56 +08:00
Yif fd4cd8b348 docs(web): correct the install guide's stale comments, JSDoc, and README
Review follow-up: the guide shows one package-name entry, so the comments
and copy that still described three forms or a displayed Git/local-path
example no longer match. The Git and local-path template strings keep their
replacement reminder for a field that still holds them; the constants' JSDoc
and the package READMEs now say that instead of claiming a displayed example.

Also moves .installSafetyText below the rule its comment heads, and pins the
upgrade assertion to the trust box rather than the whole dialog text.
2026-09-29 12:04:21 +08:00
Yif 7a0c6ebd9e refine(web): show only the package-name example in the install guide
The install guide listed the package name, a GitHub address, and a local
directory as numbered steps; only the package name needs an example. Keep
that entry and drop the index badge, give the item's hint and example the
title's text color, and balance the container's vertical padding.

The trust box above Install also states that installed plugins do not update
automatically, that upgrading means uninstalling and installing the new
version, and that later releases will keep improving that experience.
2026-09-29 11:57:21 +08:00
turtle1999 b96959ecf4 feat(plugins): show where a bundle comes from on its page
The bundle page ends with a Source section: the spec that installs the
bundle elsewhere, as `pnpm add` accepts it, or Built in for an official
bundle the installation ships, followed by its current version.

The Host's listBundles carries the new `source` field for profile
dependencies: git addresses and URLs as recorded, file:/link: paths made
absolute against the profile, and registry ranges, tags, or aliases after
the package name.
2026-09-29 10:51:33 +08:00
Turtle 93996db3c7 fix(ui-plugin-manager): tell an incompatible installed plugin to reinstall a compatible version
An install refused as incompatible keeps asking for a compatible version; an
installed plugin found incompatible now says to uninstall it and install a
version compatible with this DSH.
2026-09-29 10:22:53 +08:00
ZiyaZhang 7a078907b6 fix(web): surface Creator selection failures and trim redundant coverage 2026-09-28 12:43:34 -07:00
ZiyaZhang 66f00a9170 test(web): verify plugin entry across modes and session states 2026-09-28 12:21:45 -07:00
Turtle 05c891200c fix(ui-plugin-manager): word shipped bundles and incompatibility upgrades separately
A bundle the installation ships is refused with a note that it upgrades with
DSH, since it cannot be uninstalled. The reinstall-to-upgrade sentence follows
an incompatibility once, however many packages it names, joined by a
locale-owned sentence separator.
2026-09-28 23:18:07 +08:00
Turtle de1ec63678 fix(ui-plugin-manager): tell users to reinstall a plugin to upgrade it
The already-installed refusal and the incompatible-version reason now say
that upgrading an installed plugin means uninstalling and installing again.
2026-09-28 22:46:51 +08:00
ZiyaZhang 7d88fc9b2b refactor(web): limit plugin UX changes to add and create flows 2026-09-28 06:22:01 -07:00
ZiyaZhang 6200ffe8c7 fix(web): allow one-task Creator entry with Coding Tools off 2026-09-28 06:11:53 -07:00
ZiyaZhang ed50a72fc4 feat(web): connect plugin creation and usage entrypoints 2026-09-28 05:54:26 -07:00
Yif 9e8db21d2f fix(web): distinguish an off switch from a disabled one in dark mode
The off-state thumb reused the palette's primary foreground, which resolves
to near-black in dark mode; against the translucent track it read as
disabled, while a disabled control differs only by half opacity. Give the
off state its own thumb color through the new `--dsw-alias-switch-thumb`
alias: white in light mode and neutral-bluish 400 in dark mode.

The plugin management info button also becomes an 11px caption-colored icon
in a 20px square, keeping the 4px gap beside the subtitle.

Refs #5347
2026-09-28 15:46:43 +08:00
ZiyaZhang adb58a76d1 fix(web): align plugin guidance with review feedback 2026-09-27 09:31:07 -07:00
ZiyaZhang 473fd15101 fix(web): clarify plugin management guidance and warnings 2026-09-27 07:18:09 -07:00
ZiyaZhang 0b3256014c fix(web): center plugin installation example buttons 2026-09-27 04:57:03 -07:00
Yif 142b655241 fix(plugins): use shared focus color for invalid inputs 2026-09-27 14:48:49 +08:00
Yif 69b55fb53b fix(plugins): preserve registry keyboard selection and focus feedback 2026-09-27 14:25:27 +08:00
Yif db5ed22884 test(plugins): make the refresh spinner hold deterministic
Extract settleRefresh() so the spinner-minimum hold has one settle point,
advance the e2e fake clock past the 400ms hold before asserting the button
restores, and drive the disposal-during-hold store test on fake timers for
both success and failure reads.
2026-09-27 12:42:30 +08:00