mirror of
https://github.com/deepseek-ai/deepseek-harness.git
synced 2026-10-26 16:55:08 +00:00
Merge pull request #6979 from deepseek-harness/turtle/rename-plugin-index-again-2424dbab6ad1
fix(plugin-market): present custom plugin markets as custom plugin indexes
This commit is contained in:
commit
d10f417f13
46 files changed
+184
-184
No files matched your search
@@ -9,8 +9,8 @@
|
||||
en: 329c6ff947559b11
|
||||
zh: 5c4c1053236d319b
|
||||
/agent-note-plugin-market-discover-page-and-index-reader/decision:
|
||||
en: cc4d17a51dd479b7
|
||||
zh: 1fecf669b117f51c
|
||||
en: dd32bedaa763a4cb
|
||||
zh: 27b1a81bd744d8c1
|
||||
/agent-note-plugin-market-discover-page-and-index-reader/alternatives-considered:
|
||||
en: 62e7691dc8efd5c0
|
||||
zh: b13769634979b950
|
||||
|
||||
@@ -12,7 +12,7 @@ The plugin manager owns profile package operations and must not remount while an
|
||||
|
||||
## Decision
|
||||
|
||||
The feature ships as the experimental optional [custom plugin markets bundle](../../../../packages/experimental/plugin-market-bundle/README.md), off by default, which mounts both rows below; with it off, neither the service, the Discover tab, nor the `plugin_market` tool exists, and the Plugins page shows no tabs. A separate Host service, [`pluginMarket`](../../../../packages/boot/plugin-market/README.md), reads indexes. It requires `pluginManager` for read-only calls and never writes the profile. Its `indexes` configuration field is volatile: Settings writes only volatile fields, and the Loader commits a volatile-only change into the running reference without remounting any plugin. Other fields (`fetchTimeoutMs`, `maxBytes`, `cacheTtlMs`) are ordinary configuration.
|
||||
The feature ships as the experimental optional [custom plugin indexes bundle](../../../../packages/experimental/plugin-market-bundle/README.md), off by default, which mounts both rows below; with it off, neither the service, the Discover tab, nor the `plugin_market` tool exists, and the Plugins page shows no tabs. A separate Host service, [`pluginMarket`](../../../../packages/boot/plugin-market/README.md), reads indexes. It requires `pluginManager` for read-only calls and never writes the profile. Its `indexes` configuration field is volatile: Settings writes only volatile fields, and the Loader commits a volatile-only change into the running reference without remounting any plugin. Other fields (`fetchTimeoutMs`, `maxBytes`, `cacheTtlMs`) are ordinary configuration.
|
||||
|
||||
Index URLs use `http:` or `https:`, without credentials or fragment. `file:` is excluded because relative icon references would resolve to URLs a browser cannot load. `search` and `entry` accept only a configured URL, so the Host never fetches an address a client supplies. The Host fetches through the process proxy, refuses redirects, bounds the body, and validates with the shared format package; an invalid index affects only its own URL.
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ Status: implemented
|
||||
|
||||
## 决策
|
||||
|
||||
该功能以实验性的可选[自定义插件市场组合包](../../../../packages/experimental/plugin-market-bundle/README.zh.md)发布,默认关闭,并挂载下面两行;关闭时,服务、「发现」标签页和 `plugin_market` 工具都不存在,插件页也不显示标签页。由独立的 Host 服务 [`pluginMarket`](../../../../packages/boot/plugin-market/README.zh.md) 读取索引。它依赖 `pluginManager` 进行只读调用,从不写入 profile。它的 `indexes` 配置字段是 volatile 字段:Settings 只写入 volatile 字段,Loader 把只涉及 volatile 字段的变更提交到运行中的引用,不重新挂载任何插件。其他字段(`fetchTimeoutMs`、`maxBytes`、`cacheTtlMs`)是普通配置。
|
||||
该功能以实验性的可选[自定义插件索引组合包](../../../../packages/experimental/plugin-market-bundle/README.zh.md)发布,默认关闭,并挂载下面两行;关闭时,服务、「发现」标签页和 `plugin_market` 工具都不存在,插件页也不显示标签页。由独立的 Host 服务 [`pluginMarket`](../../../../packages/boot/plugin-market/README.zh.md) 读取索引。它依赖 `pluginManager` 进行只读调用,从不写入 profile。它的 `indexes` 配置字段是 volatile 字段:Settings 只写入 volatile 字段,Loader 把只涉及 volatile 字段的变更提交到运行中的引用,不重新挂载任何插件。其他字段(`fetchTimeoutMs`、`maxBytes`、`cacheTtlMs`)是普通配置。
|
||||
|
||||
索引 URL 使用 `http:` 或 `https:`,不含凭据或片段。排除 `file:`,因为相对图标引用会解析为浏览器无法加载的 URL。`search` 和 `entry` 只接受已配置的 URL,因此 Host 从不获取客户端提供的地址。Host 通过进程代理获取,拒绝重定向,限制响应体大小,并用共享的格式包校验;无效索引只影响它自己的 URL。
|
||||
|
||||
|
||||
@@ -33,10 +33,10 @@
|
||||
- status
|
||||
- switch "启用 语音输入"
|
||||
- listitem:
|
||||
- button "查看 自定义插件市场": 自定义插件市场
|
||||
- text: 实验性 在插件页添加「发现」标签页,从你添加的插件市场索引浏览和安装插件。
|
||||
- button "查看 自定义插件索引": 自定义插件索引
|
||||
- text: 实验性 在插件页添加「发现」标签页,从你添加的插件索引浏览和安装插件。
|
||||
- status
|
||||
- switch "启用 自定义插件市场"
|
||||
- switch "启用 自定义插件索引"
|
||||
- listitem:
|
||||
- button "查看 自动授权审查": 自动授权审查
|
||||
- text: 实验性 提供自动审查权限模式,由模型在每次工具调用前判断是否授权。
|
||||
|
||||
@@ -33,10 +33,10 @@
|
||||
- status
|
||||
- switch "启用 语音输入"
|
||||
- listitem:
|
||||
- button "查看 自定义插件市场": 自定义插件市场
|
||||
- text: 实验性 在插件页添加「发现」标签页,从你添加的插件市场索引浏览和安装插件。
|
||||
- button "查看 自定义插件索引": 自定义插件索引
|
||||
- text: 实验性 在插件页添加「发现」标签页,从你添加的插件索引浏览和安装插件。
|
||||
- status
|
||||
- switch "启用 自定义插件市场"
|
||||
- switch "启用 自定义插件索引"
|
||||
- listitem:
|
||||
- button "查看 自动授权审查": 自动授权审查
|
||||
- text: 实验性 提供自动审查权限模式,由模型在每次工具调用前判断是否授权。
|
||||
|
||||
@@ -33,10 +33,10 @@
|
||||
- status
|
||||
- switch "启用 语音输入"
|
||||
- listitem:
|
||||
- button "查看 自定义插件市场": 自定义插件市场
|
||||
- text: 实验性 在插件页添加「发现」标签页,从你添加的插件市场索引浏览和安装插件。
|
||||
- button "查看 自定义插件索引": 自定义插件索引
|
||||
- text: 实验性 在插件页添加「发现」标签页,从你添加的插件索引浏览和安装插件。
|
||||
- status
|
||||
- switch "启用 自定义插件市场"
|
||||
- switch "启用 自定义插件索引"
|
||||
- listitem:
|
||||
- button "查看 自动授权审查": 自动授权审查
|
||||
- text: 实验性 提供自动审查权限模式,由模型在每次工具调用前判断是否授权。
|
||||
|
||||
@@ -837,7 +837,7 @@ describe('web e2e: plugin manager', () => {
|
||||
expect(await panel.locator('[data-plugin-group="basic"] [data-plugin-item]').count()).toBe(4)
|
||||
expect(await panel.locator('[data-plugin-package="@deepseek-ai/dsh-experimental-inspector"]').count()).toBe(0)
|
||||
expect(await panel.getByRole('switch', { name: '启用 语音输入', exact: true }).getAttribute('aria-checked')).toBe('false')
|
||||
expect(await panel.getByRole('switch', { name: '启用 自定义插件市场', exact: true }).getAttribute('aria-checked')).toBe('false')
|
||||
expect(await panel.getByRole('switch', { name: '启用 自定义插件索引', exact: true }).getAttribute('aria-checked')).toBe('false')
|
||||
expect(await panel.getByRole('switch', { name: '启用 开发者工具', exact: true }).count()).toBe(0)
|
||||
expect(await panel.getByText(/Cordis|Chrome DevTools/).count()).toBe(0)
|
||||
await panel.getByRole('button', { name: '更多', exact: true }).click()
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
en: 0894bd9f35430753
|
||||
zh: 2d28090e71134edd
|
||||
/cookbook-adding-a-workspace-package/5-add-optional-plugin-display-metadata:
|
||||
en: 1238eaea376391d1
|
||||
zh: c7e606f95d8980bf
|
||||
en: afa5e8169fb42ecc
|
||||
zh: 14b1b85354436766
|
||||
/cookbook-adding-a-workspace-package/6-verify:
|
||||
en: 80c7fb90b1175aae
|
||||
zh: 2ba37962dbc57299
|
||||
@@ -147,7 +147,7 @@ Export `<package name>/locale/en.json` for locale lookup; expose `<package name>
|
||||
|
||||
For an image on bundle cards, details, and component rows, a package-root plugin sets top-level `"icon": "./icon.svg"` in its exported manifest, or exports `./icon` when that field is omitted. A subpath plugin exports its own icon, such as `"./search/icon": "./search.svg"`. Include each image in `files`. A manifest `icon` is relative to the manifest's directory; absolute paths, URLs, paths outside that directory, and symlinks resolving outside it are rejected. An exported icon resolves through Node exports like locale resources and must remain inside its package. SVG, PNG, JPEG (`.jpg`/`.jpeg`), and WebP files are supported up to 256 KiB. Images must be self-contained; SVG is rendered as an image, not inline HTML. The Host returns a data URL without activating the plugin. Invalid declarations or unreadable files produce a metadata diagnostic while retaining valid text, without trying the export; missing or undecodable images use the panel's default artwork.
|
||||
|
||||
A bundle can also set `meta.detail` to a Markdown file path relative to the package root, such as `"docs/DETAIL.md"` in `locale/en.json` and `"docs/DETAIL.zh.md"` in `locale/zh.json`; it is read from these files at the package root. The path uses `/`, stays inside the package, ends in `.md` or `.markdown`, and has no package-field fallback; keep its images beside it, and list its top-level directory, such as `docs`, in `files` right after the locale resources, as `check-workspace-constraints` requires. The named file must exist in a subdirectory of the package; a root-level document is rejected because its neighboring images would not be published. A bundle's page in **Plugins**, and its market entry page when the [custom plugin markets bundle](../../packages/experimental/plugin-market-bundle/README.md) is on, show the file for the active UI language as the plugin's detail document. Without `meta.detail` they show the package README, and a market entry page then falls back to the declared repository's README; the [document order](../../packages/util/plugin-detail/README.md#document-order) defines the rules. Write it for users, and reference images by paths relative to the file.
|
||||
A bundle can also set `meta.detail` to a Markdown file path relative to the package root, such as `"docs/DETAIL.md"` in `locale/en.json` and `"docs/DETAIL.zh.md"` in `locale/zh.json`; it is read from these files at the package root. The path uses `/`, stays inside the package, ends in `.md` or `.markdown`, and has no package-field fallback; keep its images beside it, and list its top-level directory, such as `docs`, in `files` right after the locale resources, as `check-workspace-constraints` requires. The named file must exist in a subdirectory of the package; a root-level document is rejected because its neighboring images would not be published. A bundle's page in **Plugins**, and its index entry page when the [custom plugin indexes bundle](../../packages/experimental/plugin-market-bundle/README.md) is on, show the file for the active UI language as the plugin's detail document. Without `meta.detail` they show the package README, and an index entry page then falls back to the declared repository's README; the [document order](../../packages/util/plugin-detail/README.md#document-order) defines the rules. Write it for users, and reference images by paths relative to the file.
|
||||
|
||||
Installed bundle cards and details, component lists and configuration details, and Settings' plugin inventory display this metadata, including disabled and preset plugins. Reads do not activate plugins.
|
||||
|
||||
|
||||
@@ -147,7 +147,7 @@ Append-only, prefix-stable, replacing, or independent behavior, including the ex
|
||||
|
||||
要在组合包卡片、详情和组件行显示图片,包根插件在导出清单顶层设置 `"icon": "./icon.svg"`,或在省略该字段时导出 `./icon`。子路径插件导出自己的图标,例如 `"./search/icon": "./search.svg"`。将每张图片加入 `files`。清单 `icon` 相对于清单所在目录;绝对路径、URL、目录外路径,以及解析到目录外的符号链接均被拒绝。导出的图标像 locale 资源一样经 Node exports 解析,且必须位于所属包内。支持不超过 256 KiB 的 SVG、PNG、JPEG(`.jpg`/`.jpeg`)和 WebP 文件。图片必须自包含;SVG 作为图片渲染,不作为内联 HTML。Host 返回 data URL,不激活插件。声明无效或文件不可读时,显示元信息诊断并保留有效文本,不再尝试导出的图标;图片缺失或无法解码时使用面板的默认插画。
|
||||
|
||||
组合包还可以把 `meta.detail` 设为相对于包根目录的 Markdown 文件路径,例如在 `locale/en.json` 中设为 `"docs/DETAIL.md"`,在 `locale/zh.json` 中设为 `"docs/DETAIL.zh.md"`;读取时使用包根目录下的这些文件。路径使用 `/`,必须位于包内,以 `.md` 或 `.markdown` 结尾,且没有包字段回退;图片放在该文件旁边,并按 `check-workspace-constraints` 的要求,在 `files` 中紧接语言资源之后列出该文件的顶层目录,例如 `docs`。该文件必须位于包的子目录中且已存在;包根目录下的文档会被拒绝,因为其旁边的图片不会被发布。组合包在**插件**中的页面,以及启用[自定义插件市场组合包](../../packages/experimental/plugin-market-bundle/README.zh.md)时其市场条目页面,把当前界面语言对应的该文件作为插件的详细介绍文档显示。没有 `meta.detail` 时,它们显示包 README;市场条目页面在此之后还会回退到所声明仓库的 README;规则由[文档顺序](../../packages/util/plugin-detail/README.zh.md#document-order)定义。该文档面向用户编写,图片使用相对于该文件的路径引用。
|
||||
组合包还可以把 `meta.detail` 设为相对于包根目录的 Markdown 文件路径,例如在 `locale/en.json` 中设为 `"docs/DETAIL.md"`,在 `locale/zh.json` 中设为 `"docs/DETAIL.zh.md"`;读取时使用包根目录下的这些文件。路径使用 `/`,必须位于包内,以 `.md` 或 `.markdown` 结尾,且没有包字段回退;图片放在该文件旁边,并按 `check-workspace-constraints` 的要求,在 `files` 中紧接语言资源之后列出该文件的顶层目录,例如 `docs`。该文件必须位于包的子目录中且已存在;包根目录下的文档会被拒绝,因为其旁边的图片不会被发布。组合包在**插件**中的页面,以及启用[自定义插件索引组合包](../../packages/experimental/plugin-market-bundle/README.zh.md)时其索引条目页面,把当前界面语言对应的该文件作为插件的详细介绍文档显示。没有 `meta.detail` 时,它们显示包 README;索引条目页面在此之后还会回退到所声明仓库的 README;规则由[文档顺序](../../packages/util/plugin-detail/README.zh.md#document-order)定义。该文档面向用户编写,图片使用相对于该文件的路径引用。
|
||||
|
||||
已安装 bundle 的卡片和详情、组件列表与配置详情、设置中的插件清单都展示这些元信息,包括禁用插件和预设内插件。读取时不激活插件。
|
||||
|
||||
|
||||
@@ -2,33 +2,33 @@
|
||||
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
|
||||
# After editing either side, bring the other along and re-record with:
|
||||
# pnpm run verify-translation-pairing --write docs/user/guide/plugin-market.md
|
||||
/plugin-markets:
|
||||
en: 09b2a6328dcae63c
|
||||
zh: ac7bce767e4f5011
|
||||
/plugin-markets/summary:
|
||||
en: 2716b194b8a12aa7
|
||||
zh: b90773d095851969
|
||||
/plugin-markets/table-of-contents:
|
||||
/plugin-indexes:
|
||||
en: 5ee6a364e2708ab9
|
||||
zh: 369781529be73628
|
||||
/plugin-indexes/summary:
|
||||
en: a1d8f17e7c4b8357
|
||||
zh: 13b95dcedde344f2
|
||||
/plugin-indexes/table-of-contents:
|
||||
en: a8d1e6785c3c3c30
|
||||
zh: 7ea1eaa8204a5a1e
|
||||
/plugin-markets/turn-on-discover:
|
||||
en: a5024e57052f6e36
|
||||
zh: 39b84e247adc9a18
|
||||
/plugin-markets/browse-and-install:
|
||||
en: cf616bba26958533
|
||||
zh: 1e32df16a6f4bba7
|
||||
/plugin-markets/publish-an-index:
|
||||
/plugin-indexes/turn-on-discover:
|
||||
en: f98bc0913d4bd046
|
||||
zh: 104094714786507e
|
||||
/plugin-indexes/browse-and-install:
|
||||
en: 0f5a4082d5debe9b
|
||||
zh: c0e53f186cb31cd4
|
||||
/plugin-indexes/publish-an-index:
|
||||
en: b85b82b22c1e14b8
|
||||
zh: 920c0d6f20956c07
|
||||
/plugin-markets/generate-an-index-with-the-reference-generator:
|
||||
/plugin-indexes/generate-an-index-with-the-reference-generator:
|
||||
en: 6501406f530ffe33
|
||||
zh: 700acae3f466c985
|
||||
/plugin-markets/index-format-reference:
|
||||
en: d058d12c27433f64
|
||||
zh: f43b85e4934817f3
|
||||
/plugin-markets/further-exploration:
|
||||
en: 3c0a90e8bf73c89b
|
||||
zh: 95608eb4f6278cb4
|
||||
/plugin-markets/dev-note:
|
||||
/plugin-indexes/index-format-reference:
|
||||
en: 8fed66180a76f815
|
||||
zh: 7069ac4eed4bdfd9
|
||||
/plugin-indexes/further-exploration:
|
||||
en: 2223e92806e7e79a
|
||||
zh: 093309e1c40caa6c
|
||||
/plugin-indexes/dev-note:
|
||||
en: b75c8458928b72b9
|
||||
zh: 003ba4e17b4b5269
|
||||
@@ -1,10 +1,10 @@
|
||||
# Plugin markets
|
||||
# Plugin indexes
|
||||
|
||||
English | [中文](plugin-market.zh.md)
|
||||
|
||||
## Summary
|
||||
|
||||
A plugin market is one JSON index file that lists installable DSH bundles with their titles, icons, authors, and versions. Turn on the experimental **Custom plugin markets** bundle to browse markets in a **Discover** tab on the Plugins page and install a listed version after a confirmation. To publish a market, write or generate an index file and serve it, together with its icon files, from any static host.
|
||||
A plugin index is one JSON file that lists installable DSH bundles with their titles, icons, authors, and versions. Turn on the experimental **Custom plugin indexes** bundle to browse indexes in a **Discover** tab on the Plugins page and install a listed version after a confirmation. To publish an index, write or generate an index file and serve it, together with its icon files, from any static host.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
@@ -18,20 +18,20 @@ A plugin market is one JSON index file that lists installable DSH bundles with t
|
||||
<a id="turn-on"></a>
|
||||
## Turn on Discover
|
||||
|
||||
Open **Plugins**, find **Custom plugin markets** under **Experimental plugins**, and switch it on. A **Discover** tab appears next to **Installed**, and Creator mode gains the read-only `plugin_market` tool. Switching the bundle off removes both again.
|
||||
Open **Plugins**, find **Custom plugin indexes** under **Experimental plugins**, and switch it on. A **Discover** tab appears next to **Installed**, and Creator mode gains the read-only `plugin_market` tool. Switching the bundle off removes both again.
|
||||
|
||||
DSH ships no index source. Select **Discover**, choose **Add index source**, and enter the URL of an index file. A URL must use `http:` or `https:` and must not contain a user name, password, or `#` fragment. Anyone on the network path can change an `http:` index, including the install specs it lists, so use `https:` for a market reached over a network you do not control. Each source belongs to the current profile.
|
||||
DSH ships no index source. Select **Discover**, choose **Add index source**, and enter the URL of an index file. A URL must use `http:` or `https:` and must not contain a user name, password, or `#` fragment. Anyone on the network path can change an `http:` index, including the install specs it lists, so use `https:` for an index reached over a network you do not control. Each source belongs to the current profile.
|
||||
|
||||
<a id="browse-and-install"></a>
|
||||
## Browse and install
|
||||
|
||||
The market menu at the left of the toolbar switches between sources and opens **Manage index sources…**, where each source shows its last error. Search matches names, authors, keywords, and titles, descriptions, categories, and labels in every language, and tolerates typos; results come in best-match order until you choose another. The **Labels** menu, category pills, and **Sort** menu use the categories, labels, and sort keys that the market declares, and **Publish date** sorts by each plugin's latest version.
|
||||
The index menu at the left of the toolbar switches between sources and opens **Manage index sources…**, where each source shows its last error. Search matches names, authors, keywords, and titles, descriptions, categories, and labels in every language, and tolerates typos; results come in best-match order until you choose another. The **Labels** menu, category pills, and **Sort** menu use the categories, labels, and sort keys that the index declares, and **Publish date** sorts by each plugin's latest version.
|
||||
|
||||
Each card shows the plugin's recommended version: the highest version compatible with the running DSH that is not a prerelease, or the highest compatible prerelease when the plugin lists no version without a prerelease tag. **Install** opens a confirmation with that version's source: the npm package and registry, or the Git repository, commit, and directory. Confirming starts the normal plugin installation, including its compatibility and registry checks; nothing is installed without that confirmation.
|
||||
|
||||
Select a card to open its page. The **Versions** list shows every listed version with its compatibility and offers **Install** for any version DSH accepts, including older releases and prereleases. A card that shows **Installed**, **Update available**, or **Provided by DSH** opens the installed bundle instead.
|
||||
|
||||
Markets are third-party content. A market chooses each plugin's title, description, icon, author, and source; DSH checks the file format but not those claims. Add only sources you trust, and check the source in the confirmation before installing.
|
||||
Indexes are third-party content. An index chooses each plugin's title, description, icon, author, and source; DSH checks the file format but not those claims. Add only sources you trust, and check the source in the confirmation before installing.
|
||||
|
||||
<a id="publish-an-index"></a>
|
||||
## Publish an index
|
||||
@@ -109,10 +109,10 @@ Text fields marked `LocalizedText` are a string or an object of strings keyed by
|
||||
| Index field | Required | Meaning |
|
||||
|---|---|---|
|
||||
| `format` | yes | `1`. |
|
||||
| `title`, `description` | `title` only | Market name and description, `LocalizedText`. |
|
||||
| `title`, `description` | `title` only | Index name and description, `LocalizedText`. |
|
||||
| `metadata.categories`, `metadata.labels` | no | Objects mapping an id to `{ "title": LocalizedText }`. |
|
||||
| `metadata.sortKeys` | no | Object mapping an id to `{ "title": LocalizedText, "order": "asc" \| "desc" }`; `order` is the initial direction. |
|
||||
| `plugins` | yes | Plugins in the market's default order. |
|
||||
| `plugins` | yes | Plugins in the index's default order. |
|
||||
|
||||
| Plugin field | Required | Meaning |
|
||||
|---|---|---|
|
||||
@@ -140,7 +140,7 @@ DSH installs an npm version as `name@version`, asking `registry` first when pres
|
||||
## Further Exploration
|
||||
|
||||
- [Discover tab reference](../../../packages/client/ui-plugin-market/README.md) describes the tab's controls and states.
|
||||
- [Plugin market service](../../../packages/boot/plugin-market/README.md) covers fetch limits, caching, and the `plugin_market` tool.
|
||||
- [Plugin index service](../../../packages/boot/plugin-market/README.md) covers fetch limits, caching, and the `plugin_market` tool.
|
||||
- [Index validator](../../../packages/util/plugin-market-index/README.md) is the library generators can use to check an index before publishing it.
|
||||
|
||||
## Dev Note
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# 插件市场
|
||||
# 插件索引
|
||||
|
||||
[English](plugin-market.md) | 中文
|
||||
|
||||
## 概述
|
||||
|
||||
插件市场是一个 JSON 索引文件,列出可安装的 DSH 组合包(bundle)及其标题、图标、作者和版本。打开实验性的**自定义插件市场**组合包后,可以在插件页的**发现**标签页中浏览市场,并在确认后安装列出的版本。要发布市场,编写或生成一个索引文件,并把它和图标文件一起放到任意静态主机上。
|
||||
插件索引是一个 JSON 文件,列出可安装的 DSH 组合包(bundle)及其标题、图标、作者和版本。打开实验性的**自定义插件索引**组合包后,可以在插件页的**发现**标签页中浏览索引,并在确认后安装列出的版本。要发布索引,编写或生成一个索引文件,并把它和图标文件一起放到任意静态主机上。
|
||||
|
||||
## 目录
|
||||
|
||||
@@ -18,20 +18,20 @@
|
||||
<a id="turn-on"></a>
|
||||
## 打开「发现」
|
||||
|
||||
打开**插件**,在**实验性插件**下找到**自定义插件市场**并打开开关。**已安装**旁边会出现**发现**标签页,Creator 模式也会获得只读的 `plugin_market` 工具。关闭该组合包会再次移除这两者。
|
||||
打开**插件**,在**实验性插件**下找到**自定义插件索引**并打开开关。**已安装**旁边会出现**发现**标签页,Creator 模式也会获得只读的 `plugin_market` 工具。关闭该组合包会再次移除这两者。
|
||||
|
||||
DSH 不内置任何索引源。选择**发现**,点击**添加索引源**,输入一个索引文件的 URL。URL 必须使用 `http:` 或 `https:`,并且不能包含用户名、密码或 `#` 片段。网络路径上的任何人都能修改 `http:` 索引,包括其中列出的安装 spec,因此经由不受你控制的网络访问的市场应使用 `https:`。每个索引源属于当前 profile。
|
||||
DSH 不内置任何索引源。选择**发现**,点击**添加索引源**,输入一个索引文件的 URL。URL 必须使用 `http:` 或 `https:`,并且不能包含用户名、密码或 `#` 片段。网络路径上的任何人都能修改 `http:` 索引,包括其中列出的安装 spec,因此经由不受你控制的网络访问的索引应使用 `https:`。每个索引源属于当前 profile。
|
||||
|
||||
<a id="browse-and-install"></a>
|
||||
## 浏览和安装
|
||||
|
||||
工具栏左侧的市场菜单用于切换索引源,并可打开**管理索引源…**,其中每个索引源显示它最近一次的错误。搜索匹配名称、作者、关键词,以及所有语言的标题、描述、分类和标签,并容忍拼写错误;在你选择其他排序之前,结果按最佳匹配排序。**标签**菜单、分类按钮和**排序**菜单使用市场声明的分类、标签和排序键,**发布时间**按每个插件最新版本的时间排序。
|
||||
工具栏左侧的索引菜单用于切换索引源,并可打开**管理索引源…**,其中每个索引源显示它最近一次的错误。搜索匹配名称、作者、关键词,以及所有语言的标题、描述、分类和标签,并容忍拼写错误;在你选择其他排序之前,结果按最佳匹配排序。**标签**菜单、分类按钮和**排序**菜单使用索引声明的分类、标签和排序键,**发布时间**按每个插件最新版本的时间排序。
|
||||
|
||||
每张卡片显示插件的推荐版本:与当前运行的 DSH 兼容、且不是预发布版本的最高版本;插件没有列出任何非预发布版本时,则是兼容的最高预发布版本。**安装**会打开确认框,显示该版本的来源:npm 包和注册表,或 Git 仓库、提交和目录。确认后开始常规的插件安装,包括其中的兼容性检查和注册表检查;未经确认不会安装任何内容。
|
||||
|
||||
选择卡片会打开插件页面。**版本**列表显示列出的每个版本及其兼容性,并为 DSH 接受的任何版本提供**安装**,包括旧版本和预发布版本。显示**已安装**、**有新版本**或**随 DSH 提供**的卡片会改为打开已安装的组合包。
|
||||
|
||||
市场是第三方内容。每个插件的标题、描述、图标、作者和来源都由市场决定;DSH 检查文件格式,但不验证这些声明。只添加你信任的索引源,并在安装前核对确认框中的来源。
|
||||
索引是第三方内容。每个插件的标题、描述、图标、作者和来源都由索引决定;DSH 检查文件格式,但不验证这些声明。只添加你信任的索引源,并在安装前核对确认框中的来源。
|
||||
|
||||
<a id="publish-an-index"></a>
|
||||
## 发布索引
|
||||
@@ -109,10 +109,10 @@ pnpm --filter @deepseek-ai/dsh-plugin-market-generator start --input plugins.txt
|
||||
| 索引字段 | 必填 | 含义 |
|
||||
|---|---|---|
|
||||
| `format` | 是 | `1`。 |
|
||||
| `title`、`description` | 仅 `title` | 市场名称和描述,类型为 `LocalizedText`。 |
|
||||
| `title`、`description` | 仅 `title` | 索引名称和描述,类型为 `LocalizedText`。 |
|
||||
| `metadata.categories`、`metadata.labels` | 否 | 将 id 映射为 `{ "title": LocalizedText }` 的对象。 |
|
||||
| `metadata.sortKeys` | 否 | 将 id 映射为 `{ "title": LocalizedText, "order": "asc" \| "desc" }` 的对象;`order` 是初始方向。 |
|
||||
| `plugins` | 是 | 按市场默认顺序排列的插件。 |
|
||||
| `plugins` | 是 | 按索引默认顺序排列的插件。 |
|
||||
|
||||
| 插件字段 | 必填 | 含义 |
|
||||
|---|---|---|
|
||||
@@ -140,7 +140,7 @@ DSH 将 npm 版本安装为 `name@version`,存在 `registry` 时先询问它
|
||||
## 延伸阅读
|
||||
|
||||
- [「发现」标签页参考](../../../packages/client/ui-plugin-market/README.zh.md)说明该标签页的控件和状态。
|
||||
- [插件市场服务](../../../packages/boot/plugin-market/README.zh.md)说明获取限制、缓存和 `plugin_market` 工具。
|
||||
- [插件索引服务](../../../packages/boot/plugin-market/README.zh.md)说明获取限制、缓存和 `plugin_market` 工具。
|
||||
- [索引校验器](../../../packages/util/plugin-market-index/README.zh.md)是生成器可以用来在发布前检查索引的库。
|
||||
|
||||
## 开发备注
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
en: 09848f4d056e4fc1
|
||||
zh: 8df6139cff0288f6
|
||||
/boot-shared-app-bin-boot-glue/packages:
|
||||
en: 71736c39fd71952c
|
||||
zh: 2033a18debd8a2d8
|
||||
en: c97ae01c92f6756e
|
||||
zh: 2ebb832078874b7a
|
||||
/boot-shared-app-bin-boot-glue/related-documentation:
|
||||
en: 77af4b40ee7b98a3
|
||||
zh: e9b4e817823b973d
|
||||
|
||||
@@ -28,7 +28,7 @@ The boot group launches profile applications and manages their installed composi
|
||||
| [`hmr`](hmr/README.md) | Coordinates module and configuration reloads with package mutations | `hmr` |
|
||||
| [`config-editor`](config-editor/README.md) | Persists active profile configuration through Loader reconciliation | `configEditor` |
|
||||
| [`plugin-manager`](plugin-manager/README.md) | Manages current-profile plugins and bundle packages through shared CLI operations | `pluginManager` |
|
||||
| [`plugin-market`](plugin-market/README.md) | Reads the plugin market indexes the user configures for Discover and the `plugin_market` tool | `pluginMarket` |
|
||||
| [`plugin-market`](plugin-market/README.md) | Reads the plugin indexes the user configures for Discover and the `plugin_market` tool | `pluginMarket` |
|
||||
|
||||
<a id="related-documentation"></a>
|
||||
## Related documentation
|
||||
|
||||
@@ -28,7 +28,7 @@ boot 组负责启动 profile 应用并管理其已安装组合。`app-boot` 解
|
||||
| [`hmr`](hmr/README.zh.md) | 协调模块与配置重载,并与包修改互斥执行 | `hmr` |
|
||||
| [`config-editor`](config-editor/README.zh.md) | 通过 Loader 应用并持久化当前 profile 配置 | `configEditor` |
|
||||
| [`plugin-manager`](plugin-manager/README.zh.md) | 通过共享 CLI 操作管理当前 profile 插件与组合包 | `pluginManager` |
|
||||
| [`plugin-market`](plugin-market/README.zh.md) | 读取用户配置的插件市场索引,供发现页和 `plugin_market` 工具使用 | `pluginMarket` |
|
||||
| [`plugin-market`](plugin-market/README.zh.md) | 读取用户配置的插件索引,供发现页和 `plugin_market` 工具使用 | `pluginMarket` |
|
||||
|
||||
<a id="related-documentation"></a>
|
||||
## 相关文档
|
||||
|
||||
@@ -3,20 +3,20 @@
|
||||
# After editing either side, bring the other along and re-record with:
|
||||
# pnpm run verify-translation-pairing --write packages/boot/plugin-market/README.md
|
||||
/:
|
||||
en: 847c61ab6dac5fd2
|
||||
zh: 4107ba58fbda723e
|
||||
en: 043de7aa04105a53
|
||||
zh: b3d966c6029037e1
|
||||
/deepseek-ai-dsh-plugin-market:
|
||||
en: ee5478f5717295df
|
||||
zh: 75a03a6db791fc6b
|
||||
/deepseek-ai-dsh-plugin-market/summary:
|
||||
en: 5fc3f5439344cb9a
|
||||
zh: 73e549c0b21b3843
|
||||
en: 4def97be3ad32ece
|
||||
zh: f855102a82dbb6ec
|
||||
/deepseek-ai-dsh-plugin-market/table-of-contents:
|
||||
en: 76368b6b1da79c80
|
||||
zh: 52384aee991ac542
|
||||
/deepseek-ai-dsh-plugin-market/use-this-package:
|
||||
en: 0553ab42ee4d83ff
|
||||
zh: 4cc8163884357247
|
||||
en: fef9850d643e327f
|
||||
zh: c6e8cab773cf93b9
|
||||
/deepseek-ai-dsh-plugin-market/use-this-package/plugin-detail-documents:
|
||||
en: 0e15de273c9acaae
|
||||
zh: 4fd93c92b71d4398
|
||||
@@ -39,8 +39,8 @@
|
||||
en: 02cf6033092eb236
|
||||
zh: cb928bfa6d39a7f7
|
||||
/deepseek-ai-dsh-plugin-market/known-limitations-and-deferred-work:
|
||||
en: 427d9c58ee09bea4
|
||||
zh: ec1c2bade3b56014
|
||||
en: 54122c96969ebbc2
|
||||
zh: 3fbe84bc6069cb46
|
||||
/deepseek-ai-dsh-plugin-market/known-limitations-and-deferred-work/dev-note:
|
||||
en: e67f633dc6fe7773
|
||||
zh: 3bb0c20c93f16f98
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: "Host reader of the plugin market indexes a user configures, with installation status, compatibility, and the read-only plugin_market tool."
|
||||
description: "Host reader of the plugin indexes a user configures, with installation status, compatibility, and the read-only plugin_market tool."
|
||||
kind: "package-reference"
|
||||
---
|
||||
|
||||
@@ -9,7 +9,7 @@ English | [中文](README.zh.md)
|
||||
|
||||
## Summary
|
||||
|
||||
`pluginMarket` reads the plugin market indexes the user configures, validates them with [`dsh-plugin-market-index`](../../util/plugin-market-index/README.md), and annotates every entry with the profile's installation status, DSH compatibility, and the exact arguments that install it. It also reads each market entry's long description, a Markdown document with images, for Discover entry pages. The Web [Discover tab](../../client/ui-plugin-market/README.md) and the `plugin_market` agent tool read through it; installation itself goes through [`pluginManager.installBundle`](../plugin-manager/README.md). The format and its rationale live in the [index format Agent Note](../../../.agents/notes/implemented/feature/2026-10-02-plugin-market-index-format.md); the Host and Web design lives in the [Discover Agent Note](../../../.agents/notes/implemented/feature/2026-10-02-plugin-market-discover.md).
|
||||
`pluginMarket` reads the plugin indexes the user configures, validates them with [`dsh-plugin-market-index`](../../util/plugin-market-index/README.md), and annotates every entry with the profile's installation status, DSH compatibility, and the exact arguments that install it. It also reads each index entry's long description, a Markdown document with images, for Discover entry pages. The Web [Discover tab](../../client/ui-plugin-market/README.md) and the `plugin_market` agent tool read through it; installation itself goes through [`pluginManager.installBundle`](../plugin-manager/README.md). The format and its rationale live in the [index format Agent Note](../../../.agents/notes/implemented/feature/2026-10-02-plugin-market-index-format.md); the Host and Web design lives in the [Discover Agent Note](../../../.agents/notes/implemented/feature/2026-10-02-plugin-market-discover.md).
|
||||
|
||||
## Table of Contents
|
||||
|
||||
@@ -24,7 +24,7 @@ English | [中文](README.zh.md)
|
||||
<a id="use-this-package"></a>
|
||||
## Use this package
|
||||
|
||||
The optional [custom plugin markets bundle](../../experimental/plugin-market-bundle/README.md) mounts the service as the `plugin-market` row; shipped profiles leave the bundle off. Like `plugin-manager`, the row is disabled without a profile, and it waits for `pluginManager`. No index source is configured by default, so the Host sends no market request until a user adds one.
|
||||
The optional [custom plugin indexes bundle](../../experimental/plugin-market-bundle/README.md) mounts the service as the `plugin-market` row; shipped profiles leave the bundle off. Like `plugin-manager`, the row is disabled without a profile, and it waits for `pluginManager`. No index source is configured by default, so the Host sends no index request until a user adds one.
|
||||
|
||||
| Config | Default | Meaning |
|
||||
|---|---|---|
|
||||
@@ -123,10 +123,10 @@ Append-only: results enter the conversation as ordinary tool results and do not
|
||||
<a id="known-limitations-and-deferred-work"></a>
|
||||
|
||||
- **No upgrade** — an installed bundle with a newer index version is reported as `update-available`; upgrading remains uninstall followed by install.
|
||||
- **Unsigned indexes** — index content, including a Git entry's name and version, is the market's claim; the installed manifest decides what is installed.
|
||||
- **Unsigned indexes** — index content, including a Git entry's name and version, is the index's claim; the installed manifest decides what is installed.
|
||||
- **Last write wins** — `setIndexes` replaces the whole list, so two windows editing sources at the same time can overwrite each other's change.
|
||||
- **Redirects refused** — an index served only behind a redirect must be configured at its final URL.
|
||||
- **Whole-document reads** — the Host downloads and keeps each index up to `maxBytes` and builds its text index in memory; a synthetic index of 20,000 plugins took about 0.8 s of build time and 130 MiB of heap. Parsing runs in a Worker, but receiving the validated index still blocks the Host event loop while the clone is deserialized: about 35 ms for a synthetic 7.6 MiB index of 20,000 plugins and about 190 ms for 38 MiB and 100,000 plugins. Larger markets need a server-side query protocol.
|
||||
- **Whole-document reads** — the Host downloads and keeps each index up to `maxBytes` and builds its text index in memory; a synthetic index of 20,000 plugins took about 0.8 s of build time and 130 MiB of heap. Parsing runs in a Worker, but receiving the validated index still blocks the Host event loop while the clone is deserialized: about 35 ms for a synthetic 7.6 MiB index of 20,000 plugins and about 190 ms for 38 MiB and 100,000 plugins. Larger indexes need a server-side query protocol.
|
||||
- **Default-branch READMEs** — a repository README is read at the default branch, which can differ from the listed version; npm records no commit the CDNs expose.
|
||||
- **Private npm registries** — the public CDNs do not serve packages of other registries, so only the entry's repository can provide such a version's document.
|
||||
- **Fetching an unadvertised commit** — a pinned Git entry is fetched by commit id, which the server must allow (`uploadpack.allowReachableSHA1InWant` or `allowAnySHA1InWant`); GitHub and GitLab allow it, and a server that refuses reports `denied`.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: "读取用户配置的插件市场索引的 Host 服务,提供安装状态、兼容性以及只读的 plugin_market 工具。"
|
||||
description: "读取用户配置的插件索引的 Host 服务,提供安装状态、兼容性以及只读的 plugin_market 工具。"
|
||||
kind: "package-reference"
|
||||
---
|
||||
|
||||
@@ -9,7 +9,7 @@ kind: "package-reference"
|
||||
|
||||
## 概述
|
||||
|
||||
`pluginMarket` 读取用户配置的插件市场索引,用 [`dsh-plugin-market-index`](../../util/plugin-market-index/README.zh.md) 校验,并为每个条目标注 profile 中的安装状态、DSH 兼容性以及安装它所需的精确参数。它还为发现区的条目页面读取每个市场条目的详细介绍,即一份带图片的 Markdown 文档。Web 的[发现标签页](../../client/ui-plugin-market/README.zh.md)和 `plugin_market` agent 工具通过它读取;安装本身经由 [`pluginManager.installBundle`](../plugin-manager/README.zh.md) 进行。格式及其理由见[索引格式 Agent Note](../../../.agents/notes/implemented/feature/2026-10-02-plugin-market-index-format.zh.md);Host 与 Web 的设计见[发现 Agent Note](../../../.agents/notes/implemented/feature/2026-10-02-plugin-market-discover.zh.md)。
|
||||
`pluginMarket` 读取用户配置的插件索引,用 [`dsh-plugin-market-index`](../../util/plugin-market-index/README.zh.md) 校验,并为每个条目标注 profile 中的安装状态、DSH 兼容性以及安装它所需的精确参数。它还为发现区的条目页面读取每个索引条目的详细介绍,即一份带图片的 Markdown 文档。Web 的[发现标签页](../../client/ui-plugin-market/README.zh.md)和 `plugin_market` agent 工具通过它读取;安装本身经由 [`pluginManager.installBundle`](../plugin-manager/README.zh.md) 进行。格式及其理由见[索引格式 Agent Note](../../../.agents/notes/implemented/feature/2026-10-02-plugin-market-index-format.zh.md);Host 与 Web 的设计见[发现 Agent Note](../../../.agents/notes/implemented/feature/2026-10-02-plugin-market-discover.zh.md)。
|
||||
|
||||
## 目录
|
||||
|
||||
@@ -24,7 +24,7 @@ kind: "package-reference"
|
||||
<a id="use-this-package"></a>
|
||||
## 使用本包
|
||||
|
||||
可选的[自定义插件市场组合包](../../experimental/plugin-market-bundle/README.zh.md)把该服务挂载为 `plugin-market` 行;随附的 profile 默认不启用该组合包。与 `plugin-manager` 一样,该行在没有 profile 时被禁用,并等待 `pluginManager`。默认不配置任何索引源,因此在用户添加索引源之前,Host 不发送任何市场请求。
|
||||
可选的[自定义插件索引组合包](../../experimental/plugin-market-bundle/README.zh.md)把该服务挂载为 `plugin-market` 行;随附的 profile 默认不启用该组合包。与 `plugin-manager` 一样,该行在没有 profile 时被禁用,并等待 `pluginManager`。默认不配置任何索引源,因此在用户添加索引源之前,Host 不发送任何索引请求。
|
||||
|
||||
| 配置 | 默认值 | 含义 |
|
||||
|---|---|---|
|
||||
@@ -124,10 +124,10 @@ Host 使用进程的 `fetch` 获取,因此配置的出站代理生效,并拒
|
||||
<a id="known-limitations-and-deferred-work"></a>
|
||||
|
||||
- **不支持升级**——索引版本更新的已安装组合包报告为 `update-available`;升级仍需先卸载再安装。
|
||||
- **索引没有签名**——索引内容(包括 Git 条目的名称和版本)是市场的声明;实际安装什么由已安装的 manifest(元数据清单)决定。
|
||||
- **索引没有签名**——索引内容(包括 Git 条目的名称和版本)是索引的声明;实际安装什么由已安装的 manifest(元数据清单)决定。
|
||||
- **后写入者覆盖**——`setIndexes` 会替换整个列表,因此两个窗口同时编辑索引源时,可能互相覆盖对方的修改。
|
||||
- **拒绝重定向**——只能经重定向访问的索引必须以其最终 URL 配置。
|
||||
- **读取整份文档**——Host 下载并保留每个不超过 `maxBytes` 的索引,并在内存中构建其文本索引;一个包含 20,000 个插件的合成索引构建用时约 0.8 秒,占用约 130 MiB 堆内存。解析在 Worker 中运行,但接收校验后的索引时,反序列化 clone 仍会阻塞 Host 事件循环:包含 20,000 个插件的 7.6 MiB 合成索引约 35 毫秒,包含 100,000 个插件的 38 MiB 索引约 190 毫秒。更大的市场需要服务端查询协议。
|
||||
- **读取整份文档**——Host 下载并保留每个不超过 `maxBytes` 的索引,并在内存中构建其文本索引;一个包含 20,000 个插件的合成索引构建用时约 0.8 秒,占用约 130 MiB 堆内存。解析在 Worker 中运行,但接收校验后的索引时,反序列化 clone 仍会阻塞 Host 事件循环:包含 20,000 个插件的 7.6 MiB 合成索引约 35 毫秒,包含 100,000 个插件的 38 MiB 索引约 190 毫秒。更大的索引需要服务端查询协议。
|
||||
- **默认分支的 README**——仓库 README 读取的是默认分支上的文件,可能与列出的版本不一致;CDN 公开的 npm 数据不记录提交。
|
||||
- **私有 npm 注册表**——公共 CDN 不提供其他注册表的包,因此此类版本的文档只能来自条目的仓库。
|
||||
- **获取未公布的提交**——固定版本的 Git 条目按提交 id 获取,这需要服务器允许(`uploadpack.allowReachableSHA1InWant` 或 `allowAnySHA1InWant`);GitHub 和 GitLab 允许这样做,拒绝的服务器报告 `denied`。
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Plugin market indexes",
|
||||
"description": "Manage configured market indexes for plugin discovery and the plugin_market tool."
|
||||
"title": "Plugin indexes",
|
||||
"description": "Manage configured plugin indexes for plugin discovery and the plugin_market tool."
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "プラグインマーケットのインデックス",
|
||||
"description": "プラグイン検索ページと plugin_market ツールで使う、設定済みのマーケットのインデックスを管理します。"
|
||||
"title": "プラグインインデックス",
|
||||
"description": "プラグイン検索ページと plugin_market ツールで使う、設定済みのプラグインインデックスを管理します。"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "插件市场索引",
|
||||
"description": "为插件发现页面和 plugin_market 工具管理已配置的市场索引。"
|
||||
"title": "插件索引",
|
||||
"description": "为插件发现页面和 plugin_market 工具管理已配置的插件索引。"
|
||||
}
|
||||
}
|
||||
@@ -60,7 +60,7 @@ function paged<T>(items: readonly T[], page: Page): { readonly slice: T[]; reado
|
||||
|
||||
/**
|
||||
* Register the read-only `plugin_market` tool while the `pluginMarket` service is mounted. The service comes from the
|
||||
* optional custom plugin markets bundle, so a preset can keep this row without the tool appearing or the row waiting.
|
||||
* optional custom plugin indexes bundle, so a preset can keep this row without the tool appearing or the row waiting.
|
||||
* @param ctx - Agent-scoped tool registration context.
|
||||
*/
|
||||
export function apply(ctx: Context): void {
|
||||
@@ -136,6 +136,6 @@ function registerTool(ctx: Context): void {
|
||||
default: return assertNever(args.action)
|
||||
}
|
||||
},
|
||||
presentCall: args => ({ card: 'generic', title: 'Browse plugin market', kind: 'read', rawInput: args }),
|
||||
presentCall: args => ({ card: 'generic', title: 'Browse plugin indexes', kind: 'read', rawInput: args }),
|
||||
}))
|
||||
}
|
||||
@@ -3,23 +3,23 @@
|
||||
# After editing either side, bring the other along and re-record with:
|
||||
# pnpm run verify-translation-pairing --write packages/client/ui-plugin-market/README.md
|
||||
/:
|
||||
en: af3fe4b70bddbc1b
|
||||
zh: ac1c4326165266d9
|
||||
en: b77d6d729562a88f
|
||||
zh: b1634cc1d027424c
|
||||
/deepseek-ai-dsh-client-ui-plugin-market:
|
||||
en: 62972eb0dff8c145
|
||||
zh: 682cc03b492cd730
|
||||
/deepseek-ai-dsh-client-ui-plugin-market/summary:
|
||||
en: 55a3d1b12cd7be61
|
||||
zh: a961cf0212b3fda8
|
||||
en: 71328d505b984fe5
|
||||
zh: 9281e7dbaa01ef9a
|
||||
/deepseek-ai-dsh-client-ui-plugin-market/table-of-contents:
|
||||
en: 76368b6b1da79c80
|
||||
zh: 52384aee991ac542
|
||||
/deepseek-ai-dsh-client-ui-plugin-market/use-this-package:
|
||||
en: f873bf36195df821
|
||||
zh: e13c78ba3f3e29f1
|
||||
en: 868b100459e30aad
|
||||
zh: 8a3a01199dc3c14c
|
||||
/deepseek-ai-dsh-client-ui-plugin-market/understand-the-implementation:
|
||||
en: 4107a6967934f6b6
|
||||
zh: 46acec8bedb86329
|
||||
en: e1a480caaff8efea
|
||||
zh: 0b725fa5bc929f22
|
||||
/deepseek-ai-dsh-client-ui-plugin-market/model-experience:
|
||||
en: 08d25ab9cbdd7567
|
||||
zh: 26e6e75c123951ee
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: "Discover tab of the Web Plugins page: search configured plugin market indexes, read an entry, and install it."
|
||||
description: "Discover tab of the Web Plugins page: search configured plugin indexes, read an entry, and install it."
|
||||
kind: "package-reference"
|
||||
---
|
||||
|
||||
@@ -9,7 +9,7 @@ English | [中文](README.zh.md)
|
||||
|
||||
## Summary
|
||||
|
||||
Discover is the second tab of the **Plugins** page, after **Installed**. It lists the bundles that plugin market indexes offer; users manage index sources, switch between markets, search, filter by category and label, sort, open an entry's page, and install an entry after confirming it. Entry pages show each entry's long description as Markdown with images. The Host [`pluginMarket`](../../boot/plugin-market/README.md) service fetches and validates indexes; this package only presents them.
|
||||
Discover is the second tab of the **Plugins** page, after **Installed**. It lists the bundles that plugin indexes offer; users manage index sources, switch between indexes, search, filter by category and label, sort, open an entry's page, and install an entry after confirming it. Entry pages show each entry's long description as Markdown with images. The Host [`pluginMarket`](../../boot/plugin-market/README.md) service fetches and validates indexes; this package only presents them.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
@@ -24,11 +24,11 @@ Discover is the second tab of the **Plugins** page, after **Installed**. It list
|
||||
<a id="use-this-package"></a>
|
||||
## Use this package
|
||||
|
||||
Open **Plugins** and select **Discover**. With no index source, the tab shows an empty state whose **Add index source** button opens the **Index sources** dialog. The dialog lists each source by market title, or by host before the first read, with its URL, the error of its last failed read, and a remove button, and keeps a notice that indexes come from third parties. A refused URL keeps the draft and says why: an unsupported scheme, credentials, or fragment; a URL already listed; or a deployment that cannot save sources. A newly added source becomes the selected market.
|
||||
Open **Plugins** and select **Discover**. With no index source, the tab shows an empty state whose **Add index source** button opens the **Index sources** dialog. The dialog lists each source by index title, or by host before the first read, with its URL, the error of its last failed read, and a remove button, and keeps a notice that indexes come from third parties. A refused URL keeps the draft and says why: an unsupported scheme, credentials, or fragment; a URL already listed; or a deployment that cannot save sources. A newly added source becomes the selected index.
|
||||
|
||||
The toolbar holds the market menu, which switches markets and ends with **Manage index sources…**; the search field; a **Labels** menu with multi-select checkmarks when the market declares labels; the **Sort** menu; and a refresh button. Category pills, with **All** first, follow when the market declares categories.
|
||||
The toolbar holds the index menu, which switches indexes and ends with **Manage index sources…**; the search field; a **Labels** menu with multi-select checkmarks when the index declares labels; the **Sort** menu; and a refresh button. Category pills, with **All** first, follow when the index declares categories.
|
||||
|
||||
Each card shows the icon, localized title, label tags, a one-line description, and the default version, author, and publish date, with one action: **Install** for an installable entry; a disabled **Install** whose tooltip says no version is compatible with the running DSH when the plugin has no default version and its highest version is neither compatible nor exempted; or **Installed**, **Update available**, or **Provided by DSH**, which switches to the Installed tab and opens that bundle's page when that tab lists it. Selecting a card opens the entry's page with its full description, compatibility notice, and, under the source heading, the default version's facts: author; homepage and source code repository, as links that open in a new tab, with the package directory beside the repository; the npm package and registry, or the Git repository, full commit, and directory; publish date; category; labels; and market. The page shows the long description first, without a heading of its own, then **Versions**, then the source facts. The **Versions** list is in descending SemVer order; each row tags the recommended, prerelease, installed, incompatible, and exempted versions and offers **Install** for any other version installation accepts, except for a bundle DSH provides. The page's back link returns to the list with its search, filters, and sort intact.
|
||||
Each card shows the icon, localized title, label tags, a one-line description, and the default version, author, and publish date, with one action: **Install** for an installable entry; a disabled **Install** whose tooltip says no version is compatible with the running DSH when the plugin has no default version and its highest version is neither compatible nor exempted; or **Installed**, **Update available**, or **Provided by DSH**, which switches to the Installed tab and opens that bundle's page when that tab lists it. Selecting a card opens the entry's page with its full description, compatibility notice, and, under the source heading, the default version's facts: author; homepage and source code repository, as links that open in a new tab, with the package directory beside the repository; the npm package and registry, or the Git repository, full commit, and directory; publish date; category; labels; and index title. The page shows the long description first, without a heading of its own, then **Versions**, then the source facts. The **Versions** list is in descending SemVer order; each row tags the recommended, prerelease, installed, incompatible, and exempted versions and offers **Install** for any other version installation accepts, except for a bundle DSH provides. The page's back link returns to the list with its search, filters, and sort intact.
|
||||
|
||||
**Install** chooses the default version and opens a confirmation dialog with the entry's icon, title, that version, the author, its source facts, an exemption notice when one applies, and a trust notice. Confirming opens the Plugins install dialog at its check screen with the entry's exact spec and registry; there is no spec form, and a refusal offers **Retry**. The registry an entry names applies to that install only.
|
||||
|
||||
@@ -36,7 +36,7 @@ The Host [`pluginMarket.search`](../../boot/plugin-market/README.md#use-this-pac
|
||||
|
||||
The description section shows the default version's long description in the active UI language: the version's locale `meta.detail` file, otherwise its package README, otherwise its repository README, in the [order `pluginMarket` documents](../../boot/plugin-market/README.md#plugin-detail-documents). While the document loads, the section shows three skeleton lines; an entry without a document shows no section; a failed read names its reason, such as a size limit, an unreachable source, or a refused repository, with **Retry**. Raw HTML is omitted, and a document taller than the section's height limit scrolls inside it. Relative image paths load from the Host beside the document, absolute HTTP(S) images load directly without a referrer, and relative links stay text. The section is the shared [`DetailDocument`](../ui-primitives/README.md#component-catalog) primitive.
|
||||
|
||||
Reading a market shows card skeletons. A failed read shows a short sentence with **Retry**, the Host's reason appears under the source in **Index sources**, and keeps the market's last listing; a failed read of the source list shows **Retry** in place of the tab. Discover re-reads sources on `plugin-market/changed` and connection reset, and recomputes installation status on `plugin-manager/changed`.
|
||||
Reading an index shows card skeletons. A failed read shows a short sentence with **Retry**, the Host's reason appears under the source in **Index sources**, and keeps the index's last listing; a failed read of the source list shows **Retry** in place of the tab. Discover re-reads sources on `plugin-market/changed` and connection reset, and recomputes installation status on `plugin-manager/changed`.
|
||||
|
||||
-----
|
||||
|
||||
@@ -45,7 +45,7 @@ Reading a market shows card skeletons. A failed read shows a short sentence with
|
||||
|
||||
Detail reads are kept in a second snapshot store keyed by index URL, entry, version, and language; a section starts its read when it renders, an npm version's read first asks the Host's registry comparison and passes `npmFileSources: ['npmmirror']` when npmmirror answered fastest, only the latest read of a key settles it, **Retry** asks the Host to read again instead of returning its cached result, and a connection reset forgets every read, because a restarted Host no longer knows the document ids its images use, so each shown section reads its document again. Image URLs resolve `api/plugin-market/detail-file` against `document.baseURI`, so they keep a deployment prefix and use the Desktop `dsh-app://app/` origin, which [`MarkdownText`](../ui-primitives/README.md) accepts for that route.
|
||||
|
||||
The plugin registers the `discover` entry, labelled **Discover**, into `plugins.tab`, the tab slot that [`ui-plugin-manager`](../ui-plugin-manager/README.md) declares; the owner props provide `install({ spec, registry?, title, version })` and `openPackage(name)`; Discover passes the entry's localized title and the chosen version. A React-free controller owns source reads, source edits, and the selected index's query and loaded pages in a snapshot store; selecting another market starts from the initial query. Later pages send the first page's `fetchedAt`, and a page from a replaced document reloads the list once; a second replacement fails the read. The listing keeps the query its results answer, so the empty-state wording follows the shown results while a new query loads or after it fails, and **Retry** repeats the read that failed: the first pages of a query or the next page. A change to the profile's bundles reloads every loaded page to refresh installation status, and a filter or sort key the index no longer declares leaves the query. The unsent search text, the open entry, and the confirmation are component state. Pure helpers in `presentation.ts` derive the query order from the text, drop undeclared ids, order declarations with `Intl.Collator` in the active UI language, and list source facts. Icons load lazily with `referrerpolicy="no-referrer"` and fall back to the default artwork.
|
||||
The plugin registers the `discover` entry, labelled **Discover**, into `plugins.tab`, the tab slot that [`ui-plugin-manager`](../ui-plugin-manager/README.md) declares; the owner props provide `install({ spec, registry?, title, version })` and `openPackage(name)`; Discover passes the entry's localized title and the chosen version. A React-free controller owns source reads, source edits, and the selected index's query and loaded pages in a snapshot store; selecting another index starts from the initial query. Later pages send the first page's `fetchedAt`, and a page from a replaced document reloads the list once; a second replacement fails the read. The listing keeps the query its results answer, so the empty-state wording follows the shown results while a new query loads or after it fails, and **Retry** repeats the read that failed: the first pages of a query or the next page. A change to the profile's bundles reloads every loaded page to refresh installation status, and a filter or sort key the index no longer declares leaves the query. The unsent search text, the open entry, and the confirmation are component state. Pure helpers in `presentation.ts` derive the query order from the text, drop undeclared ids, order declarations with `Intl.Collator` in the active UI language, and list source facts. Icons load lazily with `referrerpolicy="no-referrer"` and fall back to the default artwork.
|
||||
|
||||
-----
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: "Web 插件页的「发现」标签页:搜索已配置的插件市场索引,查看条目并安装。"
|
||||
description: "Web 插件页的「发现」标签页:搜索已配置的插件索引,查看条目并安装。"
|
||||
kind: "package-reference"
|
||||
---
|
||||
|
||||
@@ -9,7 +9,7 @@ kind: "package-reference"
|
||||
|
||||
## 概述
|
||||
|
||||
「发现」是**插件**页的第二个标签页,位于**已安装**之后。它列出插件市场索引提供的组合包(bundle);用户可以管理索引源、在插件市场之间切换、搜索、按分类和标签筛选、排序、打开条目页面,并在确认后安装条目。条目页面以带图片的 Markdown 显示每个条目的详细介绍。Host 的 [`pluginMarket`](../../boot/plugin-market/README.zh.md) 服务负责获取和校验索引;本包只负责展示。
|
||||
「发现」是**插件**页的第二个标签页,位于**已安装**之后。它列出插件索引提供的组合包(bundle);用户可以管理索引源、在插件索引之间切换、搜索、按分类和标签筛选、排序、打开条目页面,并在确认后安装条目。条目页面以带图片的 Markdown 显示每个条目的详细介绍。Host 的 [`pluginMarket`](../../boot/plugin-market/README.zh.md) 服务负责获取和校验索引;本包只负责展示。
|
||||
|
||||
## 目录
|
||||
|
||||
@@ -24,11 +24,11 @@ kind: "package-reference"
|
||||
<a id="use-this-package"></a>
|
||||
## 使用本包
|
||||
|
||||
打开**插件**并选择**发现**。没有索引源时,该标签页显示空状态,其中的**添加索引源**按钮打开**索引源**对话框。对话框按插件市场标题列出每个索引源(首次读取前按主机名),并显示其 URL、最近一次读取失败的错误和删除按钮,同时保留一条提示,说明索引由第三方提供。URL 被拒绝时保留草稿并说明原因:不支持的协议、包含凭据或片段、URL 已在列表中,或当前部署无法保存索引源。新添加的索引源成为所选插件市场。
|
||||
打开**插件**并选择**发现**。没有索引源时,该标签页显示空状态,其中的**添加索引源**按钮打开**索引源**对话框。对话框按插件索引标题列出每个索引源(首次读取前按主机名),并显示其 URL、最近一次读取失败的错误和删除按钮,同时保留一条提示,说明索引由第三方提供。URL 被拒绝时保留草稿并说明原因:不支持的协议、包含凭据或片段、URL 已在列表中,或当前部署无法保存索引源。新添加的索引源成为所选插件索引。
|
||||
|
||||
工具栏包含:插件市场菜单,用于切换插件市场,最后一项为**管理索引源…**;搜索框;插件市场声明了标签时显示的**标签**菜单,以勾选标记支持多选;**排序**菜单;以及刷新按钮。插件市场声明了分类时,其后显示分类按钮,**全部**排在第一位。
|
||||
工具栏包含:插件索引菜单,用于切换插件索引,最后一项为**管理索引源…**;搜索框;插件索引声明了标签时显示的**标签**菜单,以勾选标记支持多选;**排序**菜单;以及刷新按钮。插件索引声明了分类时,其后显示分类按钮,**全部**排在第一位。
|
||||
|
||||
每张卡片显示图标、本地化标题、标签、一行描述,以及默认版本、作者和发布日期,并只有一个操作:可安装的条目显示**安装**;没有默认版本、且最高版本既不兼容也未豁免的条目显示禁用的**安装**,其提示框说明没有与当前运行的 DSH 兼容的版本;其余条目显示**已安装**、**有新版本**或**随 DSH 提供**,点击后切换到「已安装」标签页,并在该标签页列出该组合包时打开其页面。选择卡片会打开条目页面,显示其完整描述、兼容性提示,并在来源标题下显示默认版本的信息:作者;主页和源代码仓库(在新标签页中打开的链接,仓库旁显示包所在目录);npm 包和注册表,或 Git 仓库、完整提交和目录;发布日期;分类;标签;以及插件市场。页面先显示详细介绍,不带单独的标题,然后是**版本**,然后是来源信息。**版本**列表按 SemVer 降序排列;每行标出推荐、预发布、已安装、不兼容和已豁免的版本,并为安装检查接受的其他版本提供**安装**,DSH 随附的组合包除外。页面的返回链接回到列表,搜索、筛选和排序保持不变。
|
||||
每张卡片显示图标、本地化标题、标签、一行描述,以及默认版本、作者和发布日期,并只有一个操作:可安装的条目显示**安装**;没有默认版本、且最高版本既不兼容也未豁免的条目显示禁用的**安装**,其提示框说明没有与当前运行的 DSH 兼容的版本;其余条目显示**已安装**、**有新版本**或**随 DSH 提供**,点击后切换到「已安装」标签页,并在该标签页列出该组合包时打开其页面。选择卡片会打开条目页面,显示其完整描述、兼容性提示,并在来源标题下显示默认版本的信息:作者;主页和源代码仓库(在新标签页中打开的链接,仓库旁显示包所在目录);npm 包和注册表,或 Git 仓库、完整提交和目录;发布日期;分类;标签;以及插件索引标题。页面先显示详细介绍,不带单独的标题,然后是**版本**,然后是来源信息。**版本**列表按 SemVer 降序排列;每行标出推荐、预发布、已安装、不兼容和已豁免的版本,并为安装检查接受的其他版本提供**安装**,DSH 随附的组合包除外。页面的返回链接回到列表,搜索、筛选和排序保持不变。
|
||||
|
||||
**安装**选择默认版本并打开确认对话框,显示条目的图标、标题、该版本、作者、来源信息、适用时的豁免提示,以及信任提示。确认后,插件页的安装对话框以该条目的精确 spec 和注册表在检查界面打开;不显示 spec 表单,被拒绝时提供**重试**。条目指定的注册表只用于这一次安装。
|
||||
|
||||
@@ -36,7 +36,7 @@ Host 的 [`pluginMarket.search`](../../boot/plugin-market/README.zh.md#use-this-
|
||||
|
||||
详细介绍部分以当前界面语言显示默认版本的详细介绍:按 [`pluginMarket` 说明的顺序](../../boot/plugin-market/README.zh.md#plugin-detail-documents),依次为该版本 locale 中 `meta.detail` 指定的文件、其包 README、其仓库 README。文档加载期间,该部分显示三行骨架屏;没有文档的条目不显示该部分;读取失败时说明原因,例如超过大小限制、来源无法访问或仓库拒绝访问,并提供**重试**。原始 HTML 会被省略;文档高度超过该部分的高度上限时,在该部分内滚动。相对路径的图片从 Host 上该文档旁的位置加载,绝对 HTTP(S) 地址的图片不带 referrer 直接加载,相对链接保持为文本。该部分使用共享的 [`DetailDocument`](../ui-primitives/README.zh.md#component-catalog) 原语。
|
||||
|
||||
读取插件市场时显示卡片骨架屏。读取失败时显示一句简短说明和**重试**,Host 给出的原因显示在**索引源**中对应索引源的下方,并保留该插件市场上一次的列表;读取索引源列表失败时,在该标签页的位置显示**重试**。「发现」在收到 `plugin-market/changed` 和连接重置时重新读取索引源,在收到 `plugin-manager/changed` 时重新计算安装状态。
|
||||
读取插件索引时显示卡片骨架屏。读取失败时显示一句简短说明和**重试**,Host 给出的原因显示在**索引源**中对应索引源的下方,并保留该插件索引上一次的列表;读取索引源列表失败时,在该标签页的位置显示**重试**。「发现」在收到 `plugin-market/changed` 和连接重置时重新读取索引源,在收到 `plugin-manager/changed` 时重新计算安装状态。
|
||||
|
||||
-----
|
||||
|
||||
@@ -45,7 +45,7 @@ Host 的 [`pluginMarket.search`](../../boot/plugin-market/README.zh.md#use-this-
|
||||
|
||||
详细介绍的读取结果保存在第二个快照存储中,以索引 URL、条目、版本和语言为键;该部分在渲染时开始读取;npm 版本的读取先询问 Host 的注册表比较,npmmirror 响应最快时传入 `npmFileSources: ['npmmirror']`;只有某个键最新一次的读取才会让该部分得到结果;**重试**要求 Host 重新读取,而不是返回其缓存的结果;连接重置时丢弃所有读取结果,因为重启后的 Host 不再知道其图片使用的文档 id,所以每个已显示的部分会重新读取其文档。图片 URL 基于 `document.baseURI` 解析 `api/plugin-market/detail-file`,因此保留部署前缀,并在 Desktop 中使用 `dsh-app://app/` origin;[`MarkdownText`](../ui-primitives/README.zh.md) 对该路由接受此 origin。
|
||||
|
||||
本插件把标签为**发现**的 `discover` 条目注册到 `plugins.tab`,即 [`ui-plugin-manager`](../ui-plugin-manager/README.zh.md) 声明的标签页 slot;owner props 提供 `install({ spec, registry?, title, version })` 和 `openPackage(name)`;发现页传入条目的本地化标题和所选版本。一个不依赖 React 的控制器在快照存储中拥有索引源读取、索引源编辑,以及所选索引的查询和已加载的页;选择另一个插件市场时从初始查询开始。之后的页发送第一页的 `fetchedAt`,来自已替换文档的页会让列表重新加载一次;再次被替换时读取失败。列表保留其结果所回答的查询,因此新查询加载期间或失败后,空状态文案仍与显示的结果一致;**重试**重新执行失败的读取:某个查询的前几页,或下一页。profile 的组合包变化时,重新加载所有已加载的页以刷新安装状态;索引不再声明的过滤条件或排序键会从查询中移除。尚未发送的搜索文本、打开的条目和确认对话框是组件状态。`presentation.ts` 中的纯函数根据文本得出查询顺序、移除未声明的 id、使用当前界面语言的 `Intl.Collator` 对声明排序,以及列出来源信息。图标以 `referrerpolicy="no-referrer"` 延迟加载,失败时回退到默认插画。
|
||||
本插件把标签为**发现**的 `discover` 条目注册到 `plugins.tab`,即 [`ui-plugin-manager`](../ui-plugin-manager/README.zh.md) 声明的标签页 slot;owner props 提供 `install({ spec, registry?, title, version })` 和 `openPackage(name)`;发现页传入条目的本地化标题和所选版本。一个不依赖 React 的控制器在快照存储中拥有索引源读取、索引源编辑,以及所选索引的查询和已加载的页;选择另一个插件索引时从初始查询开始。之后的页发送第一页的 `fetchedAt`,来自已替换文档的页会让列表重新加载一次;再次被替换时读取失败。列表保留其结果所回答的查询,因此新查询加载期间或失败后,空状态文案仍与显示的结果一致;**重试**重新执行失败的读取:某个查询的前几页,或下一页。profile 的组合包变化时,重新加载所有已加载的页以刷新安装状态;索引不再声明的过滤条件或排序键会从查询中移除。尚未发送的搜索文本、打开的条目和确认对话框是组件状态。`presentation.ts` 中的纯函数根据文本得出查询顺序、移除未声明的 id、使用当前界面语言的 `Intl.Collator` 对声明排序,以及列出来源信息。图标以 `referrerpolicy="no-referrer"` 延迟加载,失败时回退到默认插画。
|
||||
|
||||
-----
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Plugin discovery",
|
||||
"description": "Browse configured plugin market indexes and install their packages."
|
||||
"description": "Browse configured plugin indexes and install their packages."
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "プラグイン検索 UI",
|
||||
"description": "設定済みのプラグインマーケットのインデックスを参照し、プラグインパッケージをインストールします。"
|
||||
"description": "設定済みのプラグインインデックスを参照し、プラグインパッケージをインストールします。"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "插件发现界面",
|
||||
"description": "浏览已配置的插件市场索引,并安装其中的插件包。"
|
||||
"description": "浏览已配置的插件索引,并安装其中的插件包。"
|
||||
}
|
||||
}
|
||||
@@ -8,14 +8,14 @@ export const zh = {
|
||||
retry: '重试',
|
||||
close: '关闭',
|
||||
cancel: '取消',
|
||||
emptyTitle: '还没有插件市场',
|
||||
emptyDescription: '添加一个插件市场索引,即可在这里浏览和安装其中的插件',
|
||||
emptyTitle: '还没有插件索引',
|
||||
emptyDescription: '添加一个插件索引,即可在这里浏览和安装其中的插件',
|
||||
addFirstSource: '添加索引源',
|
||||
sourcesFailed: '无法读取索引源',
|
||||
manageSources: '管理索引源…',
|
||||
marketMenu: '切换插件市场,当前为 {market}',
|
||||
marketMenu: '切换插件索引,当前为 {market}',
|
||||
sourcesTitle: '索引源',
|
||||
sourcesDescription: '插件市场以一个索引文件的 URL 提供,「发现」从这里列出的索引浏览插件',
|
||||
sourcesDescription: '插件索引以一个索引文件的 URL 提供,「发现」从这里列出的索引浏览插件',
|
||||
sourcesLabel: '已添加的索引源',
|
||||
sourceUrl: '索引 URL',
|
||||
sourcePlaceholder: 'https://example.com/index.json',
|
||||
@@ -70,7 +70,7 @@ export const zh = {
|
||||
factSourceCode: '源代码',
|
||||
factCategory: '分类',
|
||||
factLabels: '标签',
|
||||
factMarket: '插件市场',
|
||||
factMarket: '插件索引',
|
||||
versionsTitle: '版本',
|
||||
versionsLabel: '{name} 的版本',
|
||||
versionDefault: '推荐',
|
||||
@@ -102,14 +102,14 @@ export const en = {
|
||||
retry: 'Retry',
|
||||
close: 'Close',
|
||||
cancel: 'Cancel',
|
||||
emptyTitle: 'No plugin markets yet',
|
||||
emptyDescription: 'Add a plugin market index to browse and install its plugins here.',
|
||||
emptyTitle: 'No plugin indexes yet',
|
||||
emptyDescription: 'Add a plugin index to browse and install its plugins here.',
|
||||
addFirstSource: 'Add index source',
|
||||
sourcesFailed: 'Could not read the index sources.',
|
||||
manageSources: 'Manage index sources…',
|
||||
marketMenu: 'Switch plugin market, currently {market}',
|
||||
marketMenu: 'Switch plugin index, currently {market}',
|
||||
sourcesTitle: 'Index sources',
|
||||
sourcesDescription: 'A plugin market is published as the URL of one index file. Discover browses the indexes listed here.',
|
||||
sourcesDescription: 'A plugin index is published as the URL of one index file. Discover browses the indexes listed here.',
|
||||
sourcesLabel: 'Added index sources',
|
||||
sourceUrl: 'Index URL',
|
||||
sourcePlaceholder: 'https://example.com/index.json',
|
||||
@@ -164,7 +164,7 @@ export const en = {
|
||||
factSourceCode: 'Source code',
|
||||
factCategory: 'Category',
|
||||
factLabels: 'Labels',
|
||||
factMarket: 'Plugin market',
|
||||
factMarket: 'Plugin index',
|
||||
versionsTitle: 'Versions',
|
||||
versionsLabel: 'Versions of {name}',
|
||||
versionDefault: 'Recommended',
|
||||
@@ -193,14 +193,14 @@ export const ja = {
|
||||
'retry': '再試行',
|
||||
'close': '閉じる',
|
||||
'cancel': 'キャンセル',
|
||||
'emptyTitle': 'プラグインマーケットはまだありません',
|
||||
'emptyDescription': 'プラグインマーケットのインデックスを追加すると、ここでプラグインを閲覧してインストールできます。',
|
||||
'emptyTitle': 'プラグインインデックスはまだありません',
|
||||
'emptyDescription': 'プラグインインデックスを追加すると、ここでそのプラグインを閲覧してインストールできます。',
|
||||
'addFirstSource': 'インデックスソースを追加',
|
||||
'sourcesFailed': 'インデックスソースを読み取れませんでした。',
|
||||
'manageSources': 'インデックスソースを管理…',
|
||||
'marketMenu': 'プラグインマーケットを切り替え、現在は{market}',
|
||||
'marketMenu': 'プラグインインデックスを切り替え、現在は{market}',
|
||||
'sourcesTitle': 'インデックスソース',
|
||||
'sourcesDescription': 'プラグインマーケットは1つのインデックスファイルのURLとして公開されます。「見つける」ではここに一覧されたインデックスを閲覧します。',
|
||||
'sourcesDescription': 'プラグインインデックスは1つのインデックスファイルのURLとして公開されます。「見つける」ではここに一覧されたインデックスを閲覧します。',
|
||||
'sourcesLabel': '追加済みのインデックスソース',
|
||||
'sourceUrl': 'インデックスURL',
|
||||
'sourcePlaceholder': 'https://example.com/index.json',
|
||||
@@ -255,7 +255,7 @@ export const ja = {
|
||||
'factSourceCode': 'ソースコード',
|
||||
'factCategory': 'カテゴリ',
|
||||
'factLabels': 'ラベル',
|
||||
'factMarket': 'プラグインマーケット',
|
||||
'factMarket': 'プラグインインデックス',
|
||||
'versionsTitle': 'バージョン',
|
||||
'versionsLabel': '{name} のバージョン',
|
||||
'versionDefault': '推奨',
|
||||
|
||||
@@ -50,7 +50,7 @@ const LISTING: MarketSearchResult = {
|
||||
fetchedAt: 1,
|
||||
total: 6,
|
||||
nextOffset: null,
|
||||
title: { en: 'Alpha market', zh: '甲市场' },
|
||||
title: { en: 'Alpha index', zh: '甲索引' },
|
||||
metadata: {
|
||||
categories: { tools: { title: 'Tools' }, themes: { title: 'Themes' } },
|
||||
labels: { official: { title: 'Official' }, beta: { title: 'Beta' } },
|
||||
@@ -231,7 +231,7 @@ describe('DiscoverSection', () => {
|
||||
expect(screen.getByText(en.emptyIndex)).toBeTruthy()
|
||||
})
|
||||
|
||||
it('sorts by publish date, a market sort key, either direction, and back to the index order', () => {
|
||||
it('sorts by publish date, an index sort key, either direction, and back to the index order', () => {
|
||||
const { actions, answer } = renderTab()
|
||||
openMenu(/^Sort: Default order/)
|
||||
pick(en.sortPublished)
|
||||
@@ -256,7 +256,7 @@ describe('DiscoverSection', () => {
|
||||
answer(INITIAL_QUERY)
|
||||
openMenu(/^Sort: Default order/)
|
||||
expect(screen.queryByRole('menuitem', { name: en.switchToAscending })).toBeNull()
|
||||
for (const name of [/^Sort:/, en.filter, /^Switch plugin market/]) {
|
||||
for (const name of [/^Sort:/, en.filter, /^Switch plugin index/]) {
|
||||
fireEvent.keyDown(document.activeElement ?? document.body, { key: 'Escape' })
|
||||
expect(screen.queryByRole('menu')).toBeNull()
|
||||
openMenu(name)
|
||||
@@ -264,17 +264,17 @@ describe('DiscoverSection', () => {
|
||||
}
|
||||
fireEvent.keyDown(document.activeElement ?? document.body, { key: 'Escape' })
|
||||
expect(screen.queryByRole('menu')).toBeNull()
|
||||
openMenu(/^Switch plugin market/)
|
||||
openMenu(/^Switch plugin market/)
|
||||
openMenu(/^Switch plugin index/)
|
||||
openMenu(/^Switch plugin index/)
|
||||
expect(screen.queryByRole('menu')).toBeNull()
|
||||
})
|
||||
|
||||
it('switches markets and opens source management from the market menu', () => {
|
||||
it('switches indexes and opens source management from the index menu', () => {
|
||||
const { actions } = renderTab()
|
||||
openMenu('Switch plugin market, currently Alpha market')
|
||||
openMenu('Switch plugin index, currently Alpha index')
|
||||
pick('b.example')
|
||||
expect(actions.select).toHaveBeenCalledWith(B)
|
||||
openMenu(/^Switch plugin market/)
|
||||
openMenu(/^Switch plugin index/)
|
||||
pick(en.manageSources)
|
||||
expect(actions.toggleSources).toHaveBeenCalledOnce()
|
||||
})
|
||||
@@ -287,7 +287,7 @@ describe('DiscoverSection', () => {
|
||||
expect(detail.getByRole('status', { name: en.detailLoading })).toBeTruthy()
|
||||
expect(detail.getByRole('heading', { name: 'Alpha' })).toBeTruthy()
|
||||
expect(detail.getByText('dsh-a')).toBeTruthy()
|
||||
for (const value of ['Jane', 'dsh-a@1.0.0', 'https://r.example/', 'Tools', 'Official', 'Beta', 'Alpha market']) expect(detail.getByText(value)).toBeTruthy()
|
||||
for (const value of ['Jane', 'dsh-a@1.0.0', 'https://r.example/', 'Tools', 'Official', 'Beta', 'Alpha index']) expect(detail.getByText(value)).toBeTruthy()
|
||||
const homepage = detail.getByRole('link', { name: 'https://example.com/alpha#readme' })
|
||||
expect([homepage.getAttribute('href'), homepage.getAttribute('target'), homepage.getAttribute('rel')])
|
||||
.toEqual(['https://example.com/alpha#readme', '_blank', 'noopener noreferrer'])
|
||||
@@ -420,14 +420,14 @@ describe('DiscoverSection', () => {
|
||||
expect(screen.getByRole('status', { name: en.loading })).toBeTruthy()
|
||||
expect(screen.getByRole('button', { name: en.refresh }).hasAttribute('disabled')).toBe(true)
|
||||
set({ listing: { url: B, query: INITIAL_QUERY, status: 'ready', value: { ...LISTING, url: B, entries: [], total: 0 }, answered: INITIAL_QUERY, failure: null } })
|
||||
expect(screen.getByRole('button', { name: 'Switch plugin market, currently b.example' })).toBeTruthy()
|
||||
expect(screen.getByRole('button', { name: 'Switch plugin index, currently b.example' })).toBeTruthy()
|
||||
})
|
||||
|
||||
it('manages sources in a dialog with the trust notice and each refusal', () => {
|
||||
const { actions, set } = renderTab({ editing: true, draft: 'https://c.example/index.json', indexes: [{ url: A, title: LISTING.title }, { url: B, error: 'HTTP 404' }] })
|
||||
const dialog = within(screen.getByRole('dialog', { name: en.sourcesTitle }))
|
||||
expect(dialog.getByText(en.sourcesTrust)).toBeTruthy()
|
||||
expect(dialog.getByText('Alpha market')).toBeTruthy()
|
||||
expect(dialog.getByText('Alpha index')).toBeTruthy()
|
||||
expect(dialog.getByText(B)).toBeTruthy()
|
||||
expect(dialog.getByText('HTTP 404')).toBeTruthy()
|
||||
fireEvent.click(dialog.getByRole('button', { name: `Remove ${B}` }))
|
||||
@@ -453,7 +453,7 @@ describe('DiscoverSection', () => {
|
||||
|
||||
it('renders the Chinese copy and dates', () => {
|
||||
renderTab({}, zh)
|
||||
expect(screen.getByRole('button', { name: '切换插件市场,当前为 甲市场' })).toBeTruthy()
|
||||
expect(screen.getByRole('button', { name: '切换插件索引,当前为 甲索引' })).toBeTruthy()
|
||||
expect(card('dsh-a').getByText('甲')).toBeTruthy()
|
||||
expect(card('dsh-a').getByText(/^1\.0\.0 · Jane · 2026年9月/)).toBeTruthy()
|
||||
expect(card('dsh-b').getByText(zh.statusInstalled)).toBeTruthy()
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
en: b55aeb927737b90d
|
||||
zh: 0b215fcb5c2c7908
|
||||
/packages-experimental/packages:
|
||||
en: b16e94185c9b8b24
|
||||
zh: 784faa79e027cd14
|
||||
en: 9fd1c2ac5ede5d47
|
||||
zh: 9e8fc6c374b6f5e9
|
||||
/packages-experimental/related-documentation:
|
||||
en: 1cb9d3448d44e48d
|
||||
zh: cd326d70a746b896
|
||||
|
||||
@@ -58,7 +58,7 @@ Promotion requires a named product role, documented public behavior and limitati
|
||||
| [`speech-to-text-sensevoice`](speech-to-text-sensevoice/README.md) | Managed local SenseVoice inference | — |
|
||||
| [`api-speech-to-text`](api-speech-to-text/README.md) | Authenticated transient transcription Remote | `ctx.speechController` |
|
||||
| [`client-ui-voice-input`](client-ui-voice-input/README.md) | Microphone capture and guarded draft insertion | — |
|
||||
| [`plugin-market-bundle`](plugin-market-bundle/README.md) | Default-disabled optional custom plugin markets: the market service and the Discover tab | — |
|
||||
| [`plugin-market-bundle`](plugin-market-bundle/README.md) | Default-disabled optional custom plugin indexes: the index service and the Discover tab | — |
|
||||
| [`voice-input-bundle`](voice-input-bundle/README.md) | Default-disabled optional voice input composition | — |
|
||||
| [`agent-team-profile`](agent-team-profile/README.md) | Agent Teams collaboration, tools, and Web UI bundle | — |
|
||||
| [`agent-team`](agent-team/README.md) | Named teammates with direct messages and a durable shared task board | `ctx.agentTeams` |
|
||||
|
||||
@@ -58,7 +58,7 @@ kind: "package-group"
|
||||
| [`speech-to-text-sensevoice`](speech-to-text-sensevoice/README.zh.md) | 托管本地 SenseVoice 推理 | — |
|
||||
| [`api-speech-to-text`](api-speech-to-text/README.zh.md) | 带认证的临时转写 Remote | `ctx.speechController` |
|
||||
| [`client-ui-voice-input`](client-ui-voice-input/README.zh.md) | 麦克风录音与版本检查后的草稿插入 | — |
|
||||
| [`plugin-market-bundle`](plugin-market-bundle/README.zh.md) | 默认禁用的可选自定义插件市场:市场服务和「发现」标签页 | — |
|
||||
| [`plugin-market-bundle`](plugin-market-bundle/README.zh.md) | 默认禁用的可选自定义插件索引:索引服务和「发现」标签页 | — |
|
||||
| [`voice-input-bundle`](voice-input-bundle/README.zh.md) | 默认禁用的可选语音输入组合 | — |
|
||||
| [`agent-team-profile`](agent-team-profile/README.zh.md) | Agent Teams 协作、工具与 Web UI 组合包 | — |
|
||||
| [`agent-team`](agent-team/README.zh.md) | 具名 teammate,成员之间直接消息与持久共享任务板 | `ctx.agentTeams` |
|
||||
|
||||
@@ -3,20 +3,20 @@
|
||||
# After editing either side, bring the other along and re-record with:
|
||||
# pnpm run verify-translation-pairing --write packages/experimental/plugin-market-bundle/README.md
|
||||
/:
|
||||
en: d8af9b6bbb50c868
|
||||
zh: 984ac08f172ac4b6
|
||||
en: 62daa554fb436201
|
||||
zh: 8e898dbaa5c557f8
|
||||
/deepseek-ai-dsh-experimental-plugin-market-bundle:
|
||||
en: c8315ff66be4cfb9
|
||||
zh: d721a9496d8b0a8d
|
||||
/deepseek-ai-dsh-experimental-plugin-market-bundle/summary:
|
||||
en: 511ede0c4e7cd9df
|
||||
zh: 207687c55aca6f00
|
||||
en: ea6488db63024175
|
||||
zh: 42fe14b9c9f3a292
|
||||
/deepseek-ai-dsh-experimental-plugin-market-bundle/table-of-contents:
|
||||
en: 76368b6b1da79c80
|
||||
zh: 434cf3c1f5db33cd
|
||||
/deepseek-ai-dsh-experimental-plugin-market-bundle/use-this-package:
|
||||
en: cbe922a8d2f319a7
|
||||
zh: 5cc5f505553c4d37
|
||||
en: 383f5158439640a0
|
||||
zh: fc2f9682c0f4b6fc
|
||||
/deepseek-ai-dsh-experimental-plugin-market-bundle/understand-the-implementation:
|
||||
en: 6cdb2c0f794b001f
|
||||
zh: f18ba67b927b09b8
|
||||
@@ -27,8 +27,8 @@
|
||||
en: dc60f12c8d3b0e79
|
||||
zh: 6eb3928424a7f783
|
||||
/deepseek-ai-dsh-experimental-plugin-market-bundle/known-limitations-and-deferred-work:
|
||||
en: 779241f2dfb59f6d
|
||||
zh: 0cda06e940d61664
|
||||
en: b0a99603b2467fc5
|
||||
zh: 5d0f908e5f3609a5
|
||||
/deepseek-ai-dsh-experimental-plugin-market-bundle/known-limitations-and-deferred-work/dev-note:
|
||||
en: 0225ba087c5266f3
|
||||
zh: 4e706f1b2b984e63
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: "Enable experimental custom plugin markets from the plugin manager."
|
||||
description: "Enable experimental custom plugin indexes from the plugin manager."
|
||||
kind: "package-bundle"
|
||||
---
|
||||
|
||||
@@ -9,7 +9,7 @@ English | [中文](README.zh.md)
|
||||
|
||||
## Summary
|
||||
|
||||
This optional bundle mounts custom plugin markets: the Host [`pluginMarket`](../../boot/plugin-market/README.md) service, which reads the plugin market indexes the user adds, and the Web [Discover tab](../../client/ui-plugin-market/README.md) of the Plugins page. Shipped profiles leave it disabled.
|
||||
This optional bundle mounts custom plugin indexes: the Host [`pluginMarket`](../../boot/plugin-market/README.md) service, which reads the plugin indexes the user adds, and the Web [Discover tab](../../client/ui-plugin-market/README.md) of the Plugins page. Shipped profiles leave it disabled.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
@@ -24,7 +24,7 @@ This optional bundle mounts custom plugin markets: the Host [`pluginMarket`](../
|
||||
<a id="use-this-package"></a>
|
||||
## Use this package
|
||||
|
||||
Open **Plugins** in the Web sidebar and switch on **Custom plugin markets** under **Experimental plugins**. The page then shows the **Installed** and **Discover** tabs; **Discover** adds index sources and installs their bundles. Switching the bundle off removes the Discover tab and the `plugin_market` tool; the saved index sources stay in the profile.
|
||||
Open **Plugins** in the Web sidebar and switch on **Custom plugin indexes** under **Experimental plugins**. The page then shows the **Installed** and **Discover** tabs; **Discover** adds index sources and installs their bundles. Switching the bundle off removes the Discover tab and the `plugin_market` tool; the saved index sources stay in the profile.
|
||||
|
||||
-----
|
||||
|
||||
@@ -53,7 +53,7 @@ Switching the bundle on or off adds or removes one tool schema in Creator sessio
|
||||
|
||||
<a id="known-limitations-and-deferred-work"></a>
|
||||
|
||||
- There is no official market; Discover lists only the index sources the user adds.
|
||||
- There is no official index; Discover lists only the index sources the user adds.
|
||||
|
||||
-----
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: "从插件管理页启用实验性的自定义插件市场。"
|
||||
description: "从插件管理页启用实验性的自定义插件索引。"
|
||||
kind: "package-bundle"
|
||||
---
|
||||
|
||||
@@ -9,7 +9,7 @@ kind: "package-bundle"
|
||||
|
||||
## 概述
|
||||
|
||||
此可选组合包(bundle)挂载自定义插件市场:Host 的 [`pluginMarket`](../../boot/plugin-market/README.zh.md) 服务读取用户添加的插件市场索引,Web 端提供插件页的[发现标签页](../../client/ui-plugin-market/README.zh.md)。随包配置默认禁用。
|
||||
此可选组合包(bundle)挂载自定义插件索引:Host 的 [`pluginMarket`](../../boot/plugin-market/README.zh.md) 服务读取用户添加的插件索引,Web 端提供插件页的[发现标签页](../../client/ui-plugin-market/README.zh.md)。随包配置默认禁用。
|
||||
|
||||
## 目录
|
||||
|
||||
@@ -24,7 +24,7 @@ kind: "package-bundle"
|
||||
<a id="use-this-package"></a>
|
||||
## 使用此包
|
||||
|
||||
打开 Web 侧栏中的**插件**,在**实验性插件**下启用**自定义插件市场**。页面随后显示**已安装**和**发现**两个标签页;**发现**用于添加索引源并安装其中的组合包。禁用此组合包会移除发现标签页和 `plugin_market` 工具;已保存的索引源保留在 profile 中。
|
||||
打开 Web 侧栏中的**插件**,在**实验性插件**下启用**自定义插件索引**。页面随后显示**已安装**和**发现**两个标签页;**发现**用于添加索引源并安装其中的组合包。禁用此组合包会移除发现标签页和 `plugin_market` 工具;已保存的索引源保留在 profile 中。
|
||||
|
||||
-----
|
||||
|
||||
@@ -53,7 +53,7 @@ kind: "package-bundle"
|
||||
|
||||
<a id="known-limitations-and-deferred-work"></a>
|
||||
|
||||
- 目前没有官方插件市场;发现标签页只列出用户添加的索引源。
|
||||
- 目前没有官方插件索引;发现标签页只列出用户添加的索引源。
|
||||
|
||||
-----
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Custom plugin markets: the Host service that reads the index sources the
|
||||
# Custom plugin indexes: the Host service that reads the index sources the
|
||||
# user configures and the Web Discover tab of the Plugins page. The
|
||||
# `plugin_market` tool row in the Creator preset registers its tool only
|
||||
# while this service is mounted.
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||

|
||||

|
||||
|
||||
A plugin market is an index file at a URL that lists plugins. Add the URL, and its plugins appear in **Discover**, where you can browse and install them. DSH comes with no market; you choose which indexes to add.
|
||||
A plugin index is a file at a URL that lists plugins. Add the URL, and its plugins appear in **Discover**, where you can browse and install them. DSH comes with no index; you choose which indexes to add.
|
||||
|
||||
## How to use
|
||||
|
||||
- Open **Plugins**, select **Discover**, click **Add index source**, enter the market's **Index URL**, and click **Add**. To add another market later, open the market menu and choose **Manage index sources…**.
|
||||
- Open **Plugins**, select **Discover**, click **Add index source**, enter the **Index URL**, and click **Add**. To add another index later, open the index menu and choose **Manage index sources…**.
|
||||
- Click a plugin to read its details, then click **Install** and confirm.
|
||||
- A plugin you have shows **Installed**, or **Update available** when the market recommends a newer version; click it to open the plugin under **Installed**.
|
||||
- A plugin you have shows **Installed**, or **Update available** when the index recommends a newer version; click it to open the plugin under **Installed**.
|
||||
|
||||
## Good to know
|
||||
|
||||
- DSH contacts a market only after you add it.
|
||||
- Market plugins come from third parties and run with your permissions. Add only markets you trust.
|
||||
- To update a plugin installed from npm, use **Update** in its **Versions** section under **Installed**; installing another npm version from the market fails until you uninstall it. A plugin installed from Git has no **Versions** section; to change its version, uninstall it and install it again from the market.
|
||||
- DSH contacts an index only after you add it.
|
||||
- Plugins in an index come from third parties and run with your permissions. Add only indexes you trust.
|
||||
- To update a plugin installed from npm, use **Update** in its **Versions** section under **Installed**; installing another npm version from the index fails until you uninstall it. A plugin installed from Git has no **Versions** section; to change its version, uninstall it and install it again from the index.
|
||||
- Plugin details come from public npm file services (jsDelivr, unpkg, npmmirror) or the plugin's Git repository, with your Git credentials for private ones. Icons load directly from the addresses in the index, so those servers see your IP address.
|
||||
- In **Creator mode**, the agent also gets a read-only `plugin_market` tool, which adds a few tokens to each request.
|
||||
- Turning this off removes **Discover** and the `plugin_market` tool; your index sources and installed plugins stay.
|
||||
@@ -1,18 +1,18 @@
|
||||

|
||||

|
||||
|
||||
插件市场以一个索引文件的 URL 提供,索引中列出插件。添加这个 URL 后,其中的插件会出现在 **发现** 中,你可以在那里浏览和安装。DSH 不自带插件市场,由你选择添加哪些索引。
|
||||
插件索引以一个索引文件的 URL 提供,索引中列出插件。添加这个 URL 后,其中的插件会出现在 **发现** 中,你可以在那里浏览和安装。DSH 不自带插件索引,由你选择添加哪些索引。
|
||||
|
||||
## 使用方法
|
||||
|
||||
- 打开 **插件**,选择 **发现**,点击 **添加索引源**,输入插件市场的 **索引 URL**,然后点击 **添加**。之后要添加其他插件市场,请打开插件市场菜单并选择 **管理索引源…**。
|
||||
- 打开 **插件**,选择 **发现**,点击 **添加索引源**,输入 **索引 URL**,然后点击 **添加**。之后要添加其他插件索引,请打开插件索引菜单并选择 **管理索引源…**。
|
||||
- 点击一个插件可阅读它的详细介绍,然后点击 **安装** 并确认。
|
||||
- 已安装的插件会显示 **已安装**;当插件市场推荐更新的版本时显示 **有新版本**。点击它可在 **已安装** 中打开该插件。
|
||||
- 已安装的插件会显示 **已安装**;当插件索引推荐更新的版本时显示 **有新版本**。点击它可在 **已安装** 中打开该插件。
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 只有在你添加插件市场之后,DSH 才会连接它。
|
||||
- 插件市场中的插件来自第三方,并以你的权限运行。只添加你信任的插件市场。
|
||||
- 要更新从 npm 安装的插件,请在 **已安装** 中该插件的 **版本** 区域使用 **更新**;卸载之前,从插件市场安装另一个 npm 版本会失败。从 Git 安装的插件没有 **版本** 区域;要更换它的版本,请先卸载,再从插件市场重新安装。
|
||||
- 只有在你添加插件索引之后,DSH 才会连接它。
|
||||
- 插件索引中的插件来自第三方,并以你的权限运行。只添加你信任的插件索引。
|
||||
- 要更新从 npm 安装的插件,请在 **已安装** 中该插件的 **版本** 区域使用 **更新**;卸载之前,从插件索引安装另一个 npm 版本会失败。从 Git 安装的插件没有 **版本** 区域;要更换它的版本,请先卸载,再从插件索引重新安装。
|
||||
- 插件的详细介绍来自公共 npm 文件服务(jsDelivr、unpkg、npmmirror)或插件的 Git 仓库,读取私有仓库时使用你的 Git 凭据。图标直接从索引中给出的地址加载,因此这些服务器会看到你的 IP 地址。
|
||||
- 在 **创造模式** 下,智能体还会获得只读的 `plugin_market` 工具,这会让每次请求多消耗少量 token。
|
||||
- 关闭此插件会移除 **发现** 和 `plugin_market` 工具;你的索引源和已安装的插件都会保留。
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Custom plugin markets",
|
||||
"description": "Adds a Discover tab to Plugins for browsing and installing bundles from plugin market indexes you add.",
|
||||
"title": "Custom plugin indexes",
|
||||
"description": "Adds a Discover tab to Plugins for browsing and installing bundles from plugin indexes you add.",
|
||||
"detail": "docs/DETAIL.md"
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "カスタムプラグインマーケット",
|
||||
"description": "プラグインページに「見つける」タブを追加し、登録したマーケットのインデックスからプラグインを参照、インストールします。",
|
||||
"title": "カスタムプラグインインデックス",
|
||||
"description": "プラグインページに「見つける」タブを追加し、登録したプラグインインデックスからプラグインを参照、インストールします。",
|
||||
"detail": "docs/DETAIL.md"
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "自定义插件市场",
|
||||
"description": "在插件页添加「发现」标签页,从你添加的插件市场索引浏览和安装插件。",
|
||||
"title": "自定义插件索引",
|
||||
"description": "在插件页添加「发现」标签页,从你添加的插件索引浏览和安装插件。",
|
||||
"detail": "docs/DETAIL.zh.md"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@deepseek-ai/dsh-experimental-plugin-market-bundle",
|
||||
"description": "Experimental custom plugin markets: a Discover tab that browses and installs bundles from plugin market indexes",
|
||||
"description": "Experimental custom plugin indexes: a Discover tab that browses and installs bundles from plugin indexes",
|
||||
"version": "0.2.1-rc.2",
|
||||
"icon": "./icon.svg",
|
||||
"publishConfig": {
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
/** Experimental custom plugin market composition; runtime rows live in cordis.patch.yml. */
|
||||
/** Experimental custom plugin index composition; runtime rows live in cordis.patch.yml. */
|
||||
export {}
|
||||
+1
-1
@@ -173,7 +173,7 @@ const homeAndGuide = pairedPages([
|
||||
{
|
||||
source: 'docs/user/guide/plugin-market.md',
|
||||
route: 'guide/plugin-market.md',
|
||||
label: { root: '插件市场', en: 'Plugin markets' },
|
||||
label: { root: '插件索引', en: 'Plugin indexes' },
|
||||
sidebar: { root: 'zh-guide', en: 'en-guide' },
|
||||
section: { root: '集成', en: 'Integrations' },
|
||||
order: 2,
|
||||
|
||||
Reference in new issue
Block a user