@qilin-agent/client-ui-plugin-market 3.1.7 → 3.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.i18n.yaml CHANGED
@@ -3,23 +3,23 @@
3
3
  # After editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/client/ui-plugin-market/README.md
5
5
  /:
6
- en: af3fe4b70bddbc1b
7
- zh: ac1c4326165266d9
6
+ en: b77d6d729562a88f
7
+ zh: b1634cc1d027424c
8
8
  /qilin-agent-client-ui-plugin-market:
9
9
  en: 2c187f5e9f9f09c6
10
10
  zh: bffb4896ba3dd61e
11
11
  /qilin-agent-client-ui-plugin-market/summary:
12
- en: 614602a11cfda8c8
13
- zh: 9b980f9057ac4d17
12
+ en: 5b06dd396d0f79ec
13
+ zh: 353c5246ed81701d
14
14
  /qilin-agent-client-ui-plugin-market/table-of-contents:
15
15
  en: 76368b6b1da79c80
16
16
  zh: 52384aee991ac542
17
17
  /qilin-agent-client-ui-plugin-market/use-this-package:
18
- en: 7a65338051c0aee3
19
- zh: 0725a7d1996a0372
18
+ en: 8efb6d2bf93d0fd2
19
+ zh: 9a9b6003593dbf8a
20
20
  /qilin-agent-client-ui-plugin-market/understand-the-implementation:
21
- en: edd0daf85f138630
22
- zh: 3307ad6aa788a13f
21
+ en: 5cfd6a456a97a0c1
22
+ zh: d8b468c40d7a82a4
23
23
  /qilin-agent-client-ui-plugin-market/model-experience:
24
24
  en: 08d25ab9cbdd7567
25
25
  zh: 26e6e75c123951ee
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Discover tab of the Web Plugins page: search configured plugin market indexes, read an entry, and install it."
2
+ description: "Discover tab of the Web Plugins page: search configured plugin indexes, read an entry, and install it."
3
3
  kind: "package-reference"
4
4
  ---
5
5
 
@@ -9,7 +9,7 @@ English | [中文](README.zh.md)
9
9
 
10
10
  ## Summary
11
11
 
12
- 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. The Host [`pluginMarket`](../../boot/plugin-market/README.md) service fetches and validates indexes; this package only presents them.
12
+ 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. The Host [`pluginMarket`](../../boot/plugin-market/README.md) service fetches and validates indexes; this package only presents them.
13
13
 
14
14
  ## Table of Contents
15
15
 
@@ -24,24 +24,24 @@ Discover is the second tab of the **Plugins** page, after **Installed**. It list
24
24
  <a id="use-this-package"></a>
25
25
  ## Use this package
26
26
 
27
- 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.
27
+ 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.
28
28
 
29
- 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.
29
+ 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.
30
30
 
31
- 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 QiLin when the plugin has no default version and its highest version is neither compatible nor exempted; or **Installed**, **Update available**, or **Provided by QiLin**, 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 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. A **Versions** list follows 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 QiLin provides. The page's back link returns to the list with its search, filters, and sort intact.
31
+ 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 QiLin when the plugin has no default version and its highest version is neither compatible nor exempted; or **Installed**, **Update available**, or **Provided by QiLin**, 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 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. A **Versions** list follows 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 QiLin provides. The page's back link returns to the list with its search, filters, and sort intact.
32
32
 
33
33
  **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.
34
34
 
35
35
  The Host [`pluginMarket.search`](../../boot/plugin-market/README.md#use-this-package) matches, filters, orders, and pages; the tab sends the search text 250 ms after typing stops. Search matches names, authors, keywords, and every language of titles, descriptions, categories, and labels, fuzzily. Label filters must all match. **Sort** offers **Best match** while there is search text, **Default order**, **Publish date**, and each declared sort key, which starts in its declared direction; a directed sort adds a row that reverses it. Typing switches **Default order** to **Best match**, and clearing the text switches back. Categories, labels, and sort keys are listed by localized title. The list loads 50 entries and adds 50 with each **Show more**.
36
36
 
37
- 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`.
37
+ 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`.
38
38
 
39
39
  -----
40
40
 
41
41
  <a id="understand-the-implementation"></a>
42
42
  ## Understand the implementation
43
43
 
44
- 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.
44
+ 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.
45
45
 
46
46
  -----
47
47
 
package/README.zh.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Web 插件页的「发现」标签页:搜索已配置的插件市场索引,查看条目并安装。"
2
+ description: "Web 插件页的「发现」标签页:搜索已配置的插件索引,查看条目并安装。"
3
3
  kind: "package-reference"
4
4
  ---
5
5
 
@@ -9,7 +9,7 @@ kind: "package-reference"
9
9
 
10
10
  ## 概述
11
11
 
12
- 「发现」是**插件**页的第二个标签页,位于**已安装**之后。它列出插件市场索引提供的组合包(bundle);用户可以管理索引源、在插件市场之间切换、搜索、按分类和标签筛选、排序、打开条目页面,并在确认后安装条目。Host 的 [`pluginMarket`](../../boot/plugin-market/README.zh.md) 服务负责获取和校验索引;本包只负责展示。
12
+ 「发现」是**插件**页的第二个标签页,位于**已安装**之后。它列出插件索引提供的组合包(bundle);用户可以管理索引源、在插件索引之间切换、搜索、按分类和标签筛选、排序、打开条目页面,并在确认后安装条目。Host 的 [`pluginMarket`](../../boot/plugin-market/README.zh.md) 服务负责获取和校验索引;本包只负责展示。
13
13
 
14
14
  ## 目录
15
15
 
@@ -24,24 +24,24 @@ kind: "package-reference"
24
24
  <a id="use-this-package"></a>
25
25
  ## 使用本包
26
26
 
27
- 打开**插件**并选择**发现**。没有索引源时,该标签页显示空状态,其中的**添加索引源**按钮打开**索引源**对话框。对话框按插件市场标题列出每个索引源(首次读取前按主机名),并显示其 URL、最近一次读取失败的错误和删除按钮,同时保留一条提示,说明索引由第三方提供。URL 被拒绝时保留草稿并说明原因:不支持的协议、包含凭据或片段、URL 已在列表中,或当前部署无法保存索引源。新添加的索引源成为所选插件市场。
27
+ 打开**插件**并选择**发现**。没有索引源时,该标签页显示空状态,其中的**添加索引源**按钮打开**索引源**对话框。对话框按插件索引标题列出每个索引源(首次读取前按主机名),并显示其 URL、最近一次读取失败的错误和删除按钮,同时保留一条提示,说明索引由第三方提供。URL 被拒绝时保留草稿并说明原因:不支持的协议、包含凭据或片段、URL 已在列表中,或当前部署无法保存索引源。新添加的索引源成为所选插件索引。
28
28
 
29
- 工具栏包含:插件市场菜单,用于切换插件市场,最后一项为**管理索引源…**;搜索框;插件市场声明了标签时显示的**标签**菜单,以勾选标记支持多选;**排序**菜单;以及刷新按钮。插件市场声明了分类时,其后显示分类按钮,**全部**排在第一位。
29
+ 工具栏包含:插件索引菜单,用于切换插件索引,最后一项为**管理索引源…**;搜索框;插件索引声明了标签时显示的**标签**菜单,以勾选标记支持多选;**排序**菜单;以及刷新按钮。插件索引声明了分类时,其后显示分类按钮,**全部**排在第一位。
30
30
 
31
- 每张卡片显示图标、本地化标题、标签、一行描述,以及默认版本、作者和发布日期,并只有一个操作:可安装的条目显示**安装**;没有默认版本、且最高版本既不兼容也未豁免的条目显示禁用的**安装**,其提示框说明没有与当前运行的 QiLin 兼容的版本;其余条目显示**已安装**、**有新版本**或**随 QiLin 提供**,点击后切换到「已安装」标签页,并在该标签页列出该组合包时打开其页面。选择卡片会打开条目页面,显示其完整描述、兼容性提示和默认版本的信息:作者;主页和源代码仓库(在新标签页中打开的链接,仓库旁显示包所在目录);npm 包和注册表,或 Git 仓库、完整提交和目录;发布日期;分类;标签;以及插件市场。其后是按 SemVer 降序排列的**版本**列表;每行标出推荐、预发布、已安装、不兼容和已豁免的版本,并为安装检查接受的其他版本提供**安装**,QiLin 随附的组合包除外。页面的返回链接回到列表,搜索、筛选和排序保持不变。
31
+ 每张卡片显示图标、本地化标题、标签、一行描述,以及默认版本、作者和发布日期,并只有一个操作:可安装的条目显示**安装**;没有默认版本、且最高版本既不兼容也未豁免的条目显示禁用的**安装**,其提示框说明没有与当前运行的 QiLin 兼容的版本;其余条目显示**已安装**、**有新版本**或**随 QiLin 提供**,点击后切换到「已安装」标签页,并在该标签页列出该组合包时打开其页面。选择卡片会打开条目页面,显示其完整描述、兼容性提示和默认版本的信息:作者;主页和源代码仓库(在新标签页中打开的链接,仓库旁显示包所在目录);npm 包和注册表,或 Git 仓库、完整提交和目录;发布日期;分类;标签;以及插件索引。其后是按 SemVer 降序排列的**版本**列表;每行标出推荐、预发布、已安装、不兼容和已豁免的版本,并为安装检查接受的其他版本提供**安装**,QiLin 随附的组合包除外。页面的返回链接回到列表,搜索、筛选和排序保持不变。
32
32
 
33
33
  **安装**选择默认版本并打开确认对话框,显示条目的图标、标题、该版本、作者、来源信息、适用时的豁免提示,以及信任提示。确认后,插件页的安装对话框以该条目的精确 spec 和注册表在检查界面打开;不显示 spec 表单,被拒绝时提供**重试**。条目指定的注册表只用于这一次安装。
34
34
 
35
35
  Host 的 [`pluginMarket.search`](../../boot/plugin-market/README.zh.md#use-this-package) 负责匹配、过滤、排序和分页;标签页在停止输入 250 毫秒后发送搜索文本。搜索模糊匹配名称、作者、关键词,以及标题、描述、分类和标签的所有语言。所选标签必须全部匹配。有搜索文本时,**排序**提供**最佳匹配**,此外还提供**默认顺序**、**发布时间**以及每个已声明的排序键,排序键以其声明的方向开始;有方向的排序会额外显示一行,用于反转方向。输入文本会把**默认顺序**切换为**最佳匹配**,清空文本时切换回来。分类、标签和排序键按本地化标题列出。列表加载 50 个条目,每次点击**显示更多**再增加 50 个。
36
36
 
37
- 读取插件市场时显示卡片骨架屏。读取失败时显示一句简短说明和**重试**,Host 给出的原因显示在**索引源**中对应索引源的下方,并保留该插件市场上一次的列表;读取索引源列表失败时,在该标签页的位置显示**重试**。「发现」在收到 `plugin-market/changed` 和连接重置时重新读取索引源,在收到 `plugin-manager/changed` 时重新计算安装状态。
37
+ 读取插件索引时显示卡片骨架屏。读取失败时显示一句简短说明和**重试**,Host 给出的原因显示在**索引源**中对应索引源的下方,并保留该插件索引上一次的列表;读取索引源列表失败时,在该标签页的位置显示**重试**。「发现」在收到 `plugin-market/changed` 和连接重置时重新读取索引源,在收到 `plugin-manager/changed` 时重新计算安装状态。
38
38
 
39
39
  -----
40
40
 
41
41
  <a id="understand-the-implementation"></a>
42
42
  ## 理解实现
43
43
 
44
- 本插件把标签为**发现**的 `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"` 延迟加载,失败时回退到默认插画。
44
+ 本插件把标签为**发现**的 `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"` 延迟加载,失败时回退到默认插画。
45
45
 
46
46
  -----
47
47
 
package/lib/client.js CHANGED
@@ -114,7 +114,7 @@ window.__ModuleLoader__.load({
114
114
  }
115
115
  //#endregion
116
116
  //#region \0qilin-css:/home/runner/work/QiLin/QiLin/packages/client/ui-plugin-market/src/client/DiscoverSection.module.css.mjs
117
- const css = ".uLRDza_section{flex-direction:column;gap:16px;display:flex}.uLRDza_toolbar{align-items:center;gap:8px;display:flex}.uLRDza_marketButton{max-width:240px;margin-left:-8px;font-weight:500}.uLRDza_marketName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.uLRDza_search{flex:1;min-width:120px}.uLRDza_categories{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.uLRDza_muted,.uLRDza_meta{color:var(--qilin-alias-label-tertiary);margin:0;font-size:13px;line-height:20px}.uLRDza_meta{overflow-wrap:anywhere;font-size:12px;line-height:18px}.uLRDza_strong{overflow-wrap:anywhere;font-size:14px;font-weight:500;line-height:20px}.uLRDza_error{color:var(--qilin-alias-state-error-primary);align-items:center;gap:6px;margin:0;font-size:13px;line-height:20px;display:inline-flex}.uLRDza_failure{align-items:center;gap:10px;display:flex}.uLRDza_notice{border-radius:var(--qilin-radius-md);background:var(--qilin-alias-state-warn-tertiary);color:var(--qilin-alias-label-secondary);align-items:flex-start;gap:8px;margin:0;padding:10px 12px;font-size:12px;line-height:18px;display:flex}.uLRDza_notice>svg{color:var(--qilin-alias-state-warn-primary);flex:none;margin-top:2px}.uLRDza_cards{flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;display:flex}.uLRDza_card{border-radius:var(--qilin-radius-xl);align-items:center;gap:14px;margin:0 -8px;padding:8px;display:flex;position:relative}.uLRDza_card:hover{background:var(--qilin-alias-interactive-bg-hover)}.uLRDza_icon{border:.5px solid var(--qilin-alias-border-l3);border-radius:var(--qilin-radius-lg);width:48px;height:48px;color:var(--qilin-alias-label-secondary);flex:none;justify-content:center;align-items:center;display:inline-flex}.uLRDza_image{object-fit:contain}.uLRDza_main{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.uLRDza_titleRow{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.uLRDza_cardOpen{max-width:100%;color:inherit;font:inherit;text-align:left;cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:0;padding:0;font-size:14px;font-weight:500;line-height:20px;overflow:hidden}.uLRDza_cardOpen:after{content:\"\";border-radius:var(--qilin-radius-xl);position:absolute;inset:0}.uLRDza_cardOpen:focus-visible{outline:none}.uLRDza_cardOpen:focus-visible:after{outline:var(--qilin-focus-ring-width) solid var(--qilin-focus-ring-color,var(--qilin-alias-state-business-primary));outline-offset:2px}.uLRDza_description{color:var(--qilin-alias-label-tertiary);-webkit-line-clamp:1;-webkit-box-orient:vertical;font-size:13px;line-height:18px;display:-webkit-box;overflow:hidden}.uLRDza_cardEnd{z-index:1;flex:none;align-items:center;gap:8px;display:inline-flex;position:relative}.uLRDza_blocked{opacity:.5;cursor:not-allowed}.uLRDza_more{align-self:center}.uLRDza_empty{text-align:center;flex-direction:column;align-items:center;gap:8px;padding:64px 0;display:flex}.uLRDza_emptyTitle{margin:8px 0 0;font-size:14px;font-weight:500;line-height:20px}.uLRDza_empty>button{margin-top:8px}.uLRDza_detail{flex-direction:column;gap:16px;display:flex}.uLRDza_crumb{color:var(--qilin-alias-label-tertiary);font:inherit;cursor:pointer;background:0 0;border:0;align-self:flex-start;align-items:center;gap:6px;padding:0;font-size:12.5px;display:inline-flex}.uLRDza_crumb:hover{color:var(--qilin-alias-label-primary)}.uLRDza_crumb:focus-visible{outline:var(--qilin-focus-ring-width) solid var(--qilin-focus-ring-color,var(--qilin-alias-state-business-primary));outline-offset:2px}.uLRDza_crumbIcon{transform:rotate(90deg)}.uLRDza_detailHead{align-items:center;gap:14px;display:flex}.uLRDza_detailTitle{margin:0;font-size:20px;font-weight:500;line-height:28px}.uLRDza_detailDescription{color:var(--qilin-alias-label-secondary);overflow-wrap:anywhere;margin:0;font-size:14px;line-height:22px}.uLRDza_detailSection{flex-direction:column;gap:12px;margin-top:16px;display:flex}.uLRDza_sectionTitle{margin:0;font-size:14px;font-weight:500;line-height:20px}.uLRDza_facts{margin:0}.uLRDza_facts div{border-bottom:.5px solid var(--qilin-alias-border-l2);justify-content:space-between;align-items:center;gap:16px;min-height:44px;padding:8px 2px;display:flex}.uLRDza_facts dt{color:var(--qilin-alias-label-secondary);flex:none;font-size:13px;line-height:20px}.uLRDza_facts dd{text-align:end;overflow-wrap:anywhere;min-width:0;margin:0;font-size:13px;line-height:20px}.uLRDza_facts code{background:var(--qilin-alias-bg-module-platform);box-decoration-break:clone;font-family:var(--ds-font-family-code);border-radius:4px;padding:2px 6px;font-size:12px}.uLRDza_tags{flex-wrap:wrap;justify-content:flex-end;gap:6px;display:flex}.uLRDza_dialog{width:min(480px,100vw - 32px)}.uLRDza_dialogBody{flex-direction:column;gap:12px;display:flex}.uLRDza_sourceList,.uLRDza_versions{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.uLRDza_sourceRow,.uLRDza_versionRow{border-bottom:.5px solid var(--qilin-alias-border-l2);align-items:center;gap:8px;padding:8px 0;display:flex}.uLRDza_sourceError{color:var(--qilin-alias-state-error-primary);overflow-wrap:anywhere;font-size:12px;line-height:18px}.uLRDza_sourceForm{align-items:center;gap:8px;display:flex}.uLRDza_grow{flex:1;min-width:0}.uLRDza_confirmHead{align-items:center;gap:14px;display:flex}.uLRDza_skeletonFill{background:var(--qilin-alias-bg-skeleton);animation:2s cubic-bezier(.36,0,.64,1) infinite uLRDza_dsh-market-skeleton}.uLRDza_icon.uLRDza_skeletonFill{border-color:#0000}.uLRDza_skeletonBar{border-radius:var(--qilin-radius-xs);height:12px;margin:4px 0;display:block}.uLRDza_skeletonTitle{width:min(144px,60%)}.uLRDza_skeletonDescription{width:min(280px,85%)}@keyframes uLRDza_dsh-market-skeleton{0%{opacity:1}40%{opacity:.6}80%,to{opacity:1}}@media (prefers-reduced-motion:reduce){.uLRDza_skeletonFill{animation:none}}.uLRDza_link{color:var(--qilin-alias-link);overflow-wrap:anywhere;text-decoration:none}.uLRDza_link:hover{text-decoration:underline}";
117
+ const css = ".uLRDza_section{flex-direction:column;gap:16px;display:flex}.uLRDza_toolbar{align-items:center;gap:8px;display:flex}.uLRDza_marketButton{max-width:240px;margin-left:-8px;font-weight:500}.uLRDza_marketName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.uLRDza_search{flex:1;min-width:120px}.uLRDza_categories{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.uLRDza_muted,.uLRDza_meta{color:var(--qilin-alias-label-tertiary);margin:0;font-size:13px;line-height:20px}.uLRDza_meta{overflow-wrap:anywhere;font-size:12px;line-height:18px}.uLRDza_strong{overflow-wrap:anywhere;font-size:14px;font-weight:500;line-height:20px}.uLRDza_error{color:var(--qilin-alias-state-error-primary);align-items:center;gap:6px;margin:0;font-size:13px;line-height:20px;display:inline-flex}.uLRDza_failure{align-items:center;gap:10px;display:flex}.uLRDza_notice{border-radius:var(--qilin-radius-md);background:var(--qilin-alias-state-warn-tertiary);color:var(--qilin-alias-label-secondary);align-items:flex-start;gap:8px;margin:0;padding:10px 12px;font-size:12px;line-height:18px;display:flex}.uLRDza_notice>svg{color:var(--qilin-alias-state-warn-primary);flex:none;margin-top:2px}.uLRDza_cards{flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;display:flex}.uLRDza_card{border-radius:var(--qilin-radius-xl);align-items:center;gap:14px;margin:0 -8px;padding:8px;display:flex;position:relative}.uLRDza_card:hover{background:var(--qilin-alias-interactive-bg-hover)}.uLRDza_icon{border:1px solid var(--qilin-alias-border-l3);border-radius:var(--qilin-radius-lg);width:48px;height:48px;color:var(--qilin-alias-label-secondary);flex:none;justify-content:center;align-items:center;display:inline-flex}.uLRDza_image{object-fit:contain}.uLRDza_main{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.uLRDza_titleRow{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.uLRDza_cardOpen{max-width:100%;color:inherit;font:inherit;text-align:left;cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:0;padding:0;font-size:14px;font-weight:500;line-height:20px;overflow:hidden}.uLRDza_cardOpen:after{content:\"\";border-radius:var(--qilin-radius-xl);position:absolute;inset:0}.uLRDza_cardOpen:focus-visible{outline:none}.uLRDza_cardOpen:focus-visible:after{outline:var(--qilin-focus-ring-width) solid var(--qilin-focus-ring-color,var(--qilin-alias-state-business-primary));outline-offset:2px}.uLRDza_description{color:var(--qilin-alias-label-tertiary);-webkit-line-clamp:1;-webkit-box-orient:vertical;font-size:13px;line-height:18px;display:-webkit-box;overflow:hidden}.uLRDza_cardEnd{z-index:1;flex:none;align-items:center;gap:8px;display:inline-flex;position:relative}.uLRDza_blocked{opacity:.5;cursor:not-allowed}.uLRDza_more{align-self:center}.uLRDza_empty{text-align:center;flex-direction:column;align-items:center;gap:8px;padding:64px 0;display:flex}.uLRDza_emptyTitle{margin:8px 0 0;font-size:14px;font-weight:500;line-height:20px}.uLRDza_empty>button{margin-top:8px}.uLRDza_detail{flex-direction:column;gap:16px;display:flex}.uLRDza_crumb{color:var(--qilin-alias-label-tertiary);font:inherit;cursor:pointer;background:0 0;border:0;align-self:flex-start;align-items:center;gap:6px;padding:0;font-size:12.5px;display:inline-flex}.uLRDza_crumb:hover{color:var(--qilin-alias-label-primary)}.uLRDza_crumb:focus-visible{outline:var(--qilin-focus-ring-width) solid var(--qilin-focus-ring-color,var(--qilin-alias-state-business-primary));outline-offset:2px}.uLRDza_crumbIcon{transform:rotate(90deg)}.uLRDza_detailHead{align-items:center;gap:14px;display:flex}.uLRDza_detailTitle{margin:0;font-size:20px;font-weight:500;line-height:28px}.uLRDza_detailDescription{color:var(--qilin-alias-label-secondary);overflow-wrap:anywhere;margin:0;font-size:14px;line-height:22px}.uLRDza_detailSection{flex-direction:column;gap:12px;margin-top:16px;display:flex}.uLRDza_sectionTitle{margin:0;font-size:14px;font-weight:500;line-height:20px}.uLRDza_facts{margin:0}.uLRDza_facts div{border-bottom:1px solid var(--qilin-alias-border-l2);justify-content:space-between;align-items:center;gap:16px;min-height:44px;padding:8px 2px;display:flex}.uLRDza_facts dt{color:var(--qilin-alias-label-secondary);flex:none;font-size:13px;line-height:20px}.uLRDza_facts dd{text-align:end;overflow-wrap:anywhere;min-width:0;margin:0;font-size:13px;line-height:20px}.uLRDza_facts code{background:var(--qilin-alias-bg-module-platform);box-decoration-break:clone;font-family:var(--ds-font-family-code);border-radius:4px;padding:2px 6px;font-size:12px}.uLRDza_tags{flex-wrap:wrap;justify-content:flex-end;gap:6px;display:flex}.uLRDza_dialog{width:min(480px,100vw - 32px)}.uLRDza_dialogBody{flex-direction:column;gap:12px;display:flex}.uLRDza_sourceList,.uLRDza_versions{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.uLRDza_sourceRow,.uLRDza_versionRow{border-bottom:1px solid var(--qilin-alias-border-l2);align-items:center;gap:8px;padding:8px 0;display:flex}.uLRDza_sourceError{color:var(--qilin-alias-state-error-primary);overflow-wrap:anywhere;font-size:12px;line-height:18px}.uLRDza_sourceForm{align-items:center;gap:8px;display:flex}.uLRDza_grow{flex:1;min-width:0}.uLRDza_confirmHead{align-items:center;gap:14px;display:flex}.uLRDza_skeletonFill{background:var(--qilin-alias-bg-skeleton);animation:2s cubic-bezier(.36,0,.64,1) infinite uLRDza_dsh-market-skeleton}.uLRDza_icon.uLRDza_skeletonFill{border-color:#0000}.uLRDza_skeletonBar{border-radius:var(--qilin-radius-xs);height:12px;margin:4px 0;display:block}.uLRDza_skeletonTitle{width:min(144px,60%)}.uLRDza_skeletonDescription{width:min(280px,85%)}@keyframes uLRDza_dsh-market-skeleton{0%{opacity:1}40%{opacity:.6}80%,to{opacity:1}}@media (prefers-reduced-motion:reduce){.uLRDza_skeletonFill{animation:none}}.uLRDza_link{color:var(--qilin-alias-link);overflow-wrap:anywhere;text-decoration:none}.uLRDza_link:hover{text-decoration:underline}";
118
118
  const tagId = "@qilin-agent/client-ui-plugin-market/DiscoverSection.module.css";
119
119
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
120
120
  const tag = document.createElement("style");
@@ -1112,14 +1112,14 @@ window.__ModuleLoader__.load({
1112
1112
  retry: "重试",
1113
1113
  close: "关闭",
1114
1114
  cancel: "取消",
1115
- emptyTitle: "还没有插件市场",
1116
- emptyDescription: "添加一个插件市场索引,即可在这里浏览和安装其中的插件",
1115
+ emptyTitle: "还没有插件索引",
1116
+ emptyDescription: "添加一个插件索引,即可在这里浏览和安装其中的插件",
1117
1117
  addFirstSource: "添加索引源",
1118
1118
  sourcesFailed: "无法读取索引源",
1119
1119
  manageSources: "管理索引源…",
1120
- marketMenu: "切换插件市场,当前为 {market}",
1120
+ marketMenu: "切换插件索引,当前为 {market}",
1121
1121
  sourcesTitle: "索引源",
1122
- sourcesDescription: "插件市场以一个索引文件的 URL 提供,「发现」从这里列出的索引浏览插件",
1122
+ sourcesDescription: "插件索引以一个索引文件的 URL 提供,「发现」从这里列出的索引浏览插件",
1123
1123
  sourcesLabel: "已添加的索引源",
1124
1124
  sourceUrl: "索引 URL",
1125
1125
  sourcePlaceholder: "https://example.com/index.json",
@@ -1174,7 +1174,7 @@ window.__ModuleLoader__.load({
1174
1174
  factSourceCode: "源代码",
1175
1175
  factCategory: "分类",
1176
1176
  factLabels: "标签",
1177
- factMarket: "插件市场",
1177
+ factMarket: "插件索引",
1178
1178
  versionsTitle: "版本",
1179
1179
  versionsLabel: "{name} 的版本",
1180
1180
  versionDefault: "推荐",
@@ -1193,14 +1193,14 @@ window.__ModuleLoader__.load({
1193
1193
  retry: "Retry",
1194
1194
  close: "Close",
1195
1195
  cancel: "Cancel",
1196
- emptyTitle: "No plugin markets yet",
1197
- emptyDescription: "Add a plugin market index to browse and install its plugins here.",
1196
+ emptyTitle: "No plugin indexes yet",
1197
+ emptyDescription: "Add a plugin index to browse and install its plugins here.",
1198
1198
  addFirstSource: "Add index source",
1199
1199
  sourcesFailed: "Could not read the index sources.",
1200
1200
  manageSources: "Manage index sources…",
1201
- marketMenu: "Switch plugin market, currently {market}",
1201
+ marketMenu: "Switch plugin index, currently {market}",
1202
1202
  sourcesTitle: "Index sources",
1203
- sourcesDescription: "A plugin market is published as the URL of one index file. Discover browses the indexes listed here.",
1203
+ sourcesDescription: "A plugin index is published as the URL of one index file. Discover browses the indexes listed here.",
1204
1204
  sourcesLabel: "Added index sources",
1205
1205
  sourceUrl: "Index URL",
1206
1206
  sourcePlaceholder: "https://example.com/index.json",
@@ -1255,7 +1255,7 @@ window.__ModuleLoader__.load({
1255
1255
  factSourceCode: "Source code",
1256
1256
  factCategory: "Category",
1257
1257
  factLabels: "Labels",
1258
- factMarket: "Plugin market",
1258
+ factMarket: "Plugin index",
1259
1259
  versionsTitle: "Versions",
1260
1260
  versionsLabel: "Versions of {name}",
1261
1261
  versionDefault: "Recommended",
@@ -7,14 +7,14 @@ export declare const zh: {
7
7
  readonly retry: "重试";
8
8
  readonly close: "关闭";
9
9
  readonly cancel: "取消";
10
- readonly emptyTitle: "还没有插件市场";
11
- readonly emptyDescription: "添加一个插件市场索引,即可在这里浏览和安装其中的插件";
10
+ readonly emptyTitle: "还没有插件索引";
11
+ readonly emptyDescription: "添加一个插件索引,即可在这里浏览和安装其中的插件";
12
12
  readonly addFirstSource: "添加索引源";
13
13
  readonly sourcesFailed: "无法读取索引源";
14
14
  readonly manageSources: "管理索引源…";
15
- readonly marketMenu: "切换插件市场,当前为 {market}";
15
+ readonly marketMenu: "切换插件索引,当前为 {market}";
16
16
  readonly sourcesTitle: "索引源";
17
- readonly sourcesDescription: "插件市场以一个索引文件的 URL 提供,「发现」从这里列出的索引浏览插件";
17
+ readonly sourcesDescription: "插件索引以一个索引文件的 URL 提供,「发现」从这里列出的索引浏览插件";
18
18
  readonly sourcesLabel: "已添加的索引源";
19
19
  readonly sourceUrl: "索引 URL";
20
20
  readonly sourcePlaceholder: "https://example.com/index.json";
@@ -69,7 +69,7 @@ export declare const zh: {
69
69
  readonly factSourceCode: "源代码";
70
70
  readonly factCategory: "分类";
71
71
  readonly factLabels: "标签";
72
- readonly factMarket: "插件市场";
72
+ readonly factMarket: "插件索引";
73
73
  readonly versionsTitle: "版本";
74
74
  readonly versionsLabel: "{name} 的版本";
75
75
  readonly versionDefault: "推荐";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@qilin-agent/client-ui-plugin-market",
3
3
  "description": "Discover tab of the qilin web Plugins page: browse configured plugin market indexes and install their bundles",
4
- "version": "3.1.7",
4
+ "version": "3.1.9",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -40,25 +40,25 @@
40
40
  },
41
41
  "license": "MIT",
42
42
  "peerDependencies": {
43
- "@qilin-agent/kylin": "~4.0.5"
43
+ "@qilin-agent/kylin": "~4.0.7"
44
44
  },
45
45
  "devDependencies": {
46
+ "@qilin-agent/api-remotes": "3.1.9",
47
+ "@qilin-agent/client-locale": "3.1.9",
48
+ "@qilin-agent/client-store": "3.1.9",
49
+ "@qilin-agent/client-test-runtime": "3.1.9",
50
+ "@qilin-agent/client-ui-plugin-manager": "3.1.9",
51
+ "@qilin-agent/client-ui-primitives": "3.1.9",
52
+ "@qilin-agent/client-ui-renderer": "3.1.9",
53
+ "@qilin-agent/client-ui-slots": "3.1.9",
54
+ "@qilin-agent/kylin": "~4.0.7",
55
+ "@qilin-agent/package-manifest": "3.1.9",
56
+ "@qilin-agent/plugin-manager": "3.1.9",
57
+ "@qilin-agent/plugin-market": "3.1.9",
58
+ "@qilin-agent/plugin-market-index": "3.1.9",
46
59
  "@testing-library/react": "^16.1.0",
47
60
  "@types/react": "~18.3.1",
48
- "react": "^18.2.0",
49
- "@qilin-agent/api-remotes": "3.1.7",
50
- "@qilin-agent/client-store": "3.1.7",
51
- "@qilin-agent/client-locale": "3.1.7",
52
- "@qilin-agent/client-test-runtime": "3.1.7",
53
- "@qilin-agent/client-ui-plugin-manager": "3.1.7",
54
- "@qilin-agent/client-ui-primitives": "3.1.7",
55
- "@qilin-agent/client-ui-slots": "3.1.7",
56
- "@qilin-agent/client-ui-renderer": "3.1.7",
57
- "@qilin-agent/package-manifest": "3.1.7",
58
- "@qilin-agent/plugin-manager": "3.1.7",
59
- "@qilin-agent/kylin": "~4.0.5",
60
- "@qilin-agent/plugin-market-index": "3.1.7",
61
- "@qilin-agent/plugin-market": "3.1.7"
61
+ "react": "^18.2.0"
62
62
  },
63
63
  "files": [
64
64
  "lib/index.js",