@deepseek-ai/dsh-client-ui-settings-plugin-inventory 0.1.6-alpha.2 → 0.1.7-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.i18n.yaml +2 -2
- package/README.md +5 -3
- package/README.zh.md +5 -3
- package/lib/client.js +116 -61
- package/lib/types/client/PluginInventorySettingsTab.d.ts +4 -1
- package/lib/types/client/locales.d.ts +2 -0
- package/package.json +15 -14
package/README.i18n.yaml
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
# side as of the last confirmed-consistent state. Both languages carry equal authority;
|
|
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-settings-plugin-inventory/README.md
|
|
5
|
-
README.md:
|
|
6
|
-
README.zh.md:
|
|
5
|
+
README.md: 7353f14d111aa1c89c3331a3d4977ddfbf950294
|
|
6
|
+
README.zh.md: 9078f8074a10688cb7370ec7ee5fd8af16ca48c1
|
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ English | [中文](README.zh.md)
|
|
|
9
9
|
|
|
10
10
|
## Summary
|
|
11
11
|
|
|
12
|
-
The **Plugin list** tab lets Web users inspect plugins without changing their configuration. It lists agent presets, then the global inventory; both start collapsed and open on demand or during a search. Cards
|
|
12
|
+
The **Plugin list** tab lets Web users inspect plugins without changing their configuration. It lists agent presets, then the global inventory; both start collapsed and open on demand or during a search. Cards show localized titles and descriptions when available, identify instances by stable entry id, and expose enablement, source details, runtime status, disabled conditions, and discovery failures; preset-provided global entries name their presets. Search covers both groups and points to matches in other presets. The tab handles loading, empty, no-match, failure, and retry states without exposing transport details, and still shows the global inventory without a preset roster.
|
|
13
13
|
|
|
14
14
|
## Table of Contents
|
|
15
15
|
|
|
@@ -31,7 +31,9 @@ A failed installation with pending pnpm build permissions offers **Allow these s
|
|
|
31
31
|
|
|
32
32
|
### Reading a card
|
|
33
33
|
|
|
34
|
-
Each collapsed card uses the
|
|
34
|
+
Each collapsed card uses the plugin's localized title and description when available. Settings shortens literal package-name or module-name fallbacks by removing the npm scope and the `cordis:`, `cordis-plugin-`, or `dsh-`/`dsh-host-`/`dsh-client-` prefix; locale titles remain unchanged. The Host supplies locale and package-field fallbacks in `meta`; the Client selects the current language. Full module specifiers remain available in details and search. Missing descriptions are omitted, and metadata diagnostics appear with the card. This compact naming applies only to Settings, not the sidebar's Plugins page.
|
|
35
|
+
|
|
36
|
+
The stable entry id appears underneath the title, alongside a small enablement tag; a colored root-fiber status dot marks only the phases the tag cannot state: `pending` maps to idle, while `loading` and `unloading` map to ongoing. An `active` or `failed` fiber shows its tag without a dot. A composition-generated subtitle omits its leading `include:` marker, while hover, search, the accessible name, and expanded details retain the complete id. Long entry ids truncate in the row and remain available on hover. Expanding one card reveals the declared entry id, the full module specifier, and the state facts: a preset row names the preset it comes from, its runtime status when the composition is live, and its disable condition when it carries one; a preset-provided global row explains that agent presets provide it per session, names the presets that enable it, and offers a jump into the preset group. Preset names resolve through the shared `presetDisplayText` fold (`dsh-agent-preset-registry/display`) over [`ui-agent-preset`](../ui-agent-preset/README.md)'s dictionaries: shipped presets follow the active locale while user-authored ones keep their own metadata, so an English surface never echoes the preset declarations' Chinese names. Search filters both groups by localized title and description, module name, and entry id.
|
|
35
37
|
|
|
36
38
|
### The preset switcher
|
|
37
39
|
|
|
@@ -39,7 +41,7 @@ The switcher is the same selector-pill-plus-menu control the General settings ro
|
|
|
39
41
|
|
|
40
42
|
### Retrying a failed read
|
|
41
43
|
|
|
42
|
-
A failed read renders
|
|
44
|
+
A failed read renders the shared error marker inside the tab; loading and current-page synchronization use the shared ongoing loader. Retrying re-runs the lazy `list()` call without exposing transport details.
|
|
43
45
|
|
|
44
46
|
The Plugin list also shows synchronization failures on the current page. Its retry reapplies the latest client graph without changing Host enablement or refreshing the page.
|
|
45
47
|
|
package/README.zh.md
CHANGED
|
@@ -9,7 +9,7 @@ kind: "package-reference"
|
|
|
9
9
|
|
|
10
10
|
## 概述
|
|
11
11
|
|
|
12
|
-
**插件列表**标签页让 Web 用户查看插件,而不改变其配置。它先列 agent
|
|
12
|
+
**插件列表**标签页让 Web 用户查看插件,而不改变其配置。它先列 agent(智能体)预设分组,再列全局清单;两个分组默认都收起,按需展开,搜索期间保持展开。卡片显示可用的本地化标题与描述,以稳定的条目 id 标识实例,并展示启停状态、出处、运行状态、禁用条件与发现失败;由预设提供的全局条目会列出对应预设。搜索覆盖两个分组,并指出其他预设中的匹配。标签页处理加载、空结果、无匹配、失败与重试状态,且不暴露传输细节;没有预设 roster 时仍会展示全局清单。
|
|
13
13
|
|
|
14
14
|
## 目录
|
|
15
15
|
|
|
@@ -31,7 +31,9 @@ kind: "package-reference"
|
|
|
31
31
|
|
|
32
32
|
### 阅读卡片
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
每张收起的卡片使用插件可用的本地化标题与描述。设置页会缩短字面的包名或模块名回退值,移除 npm scope 以及 `cordis:`、`cordis-plugin-` 或 `dsh-`/`dsh-host-`/`dsh-client-` 前缀;locale 标题保持原样。Host 在 `meta` 中提供 locale 与包字段的回退结果,Client 选择当前语言。详情与搜索仍保留完整模块标识。缺失的描述不显示,元信息诊断随卡片展示。这种短名显示仅用于设置页,不影响侧栏的插件页。
|
|
35
|
+
|
|
36
|
+
稳定的条目 id 显示在标题下方,卡片带有表示启停状态的小标签;彩色根 fiber 状态圆点只标记标签无法表达的阶段:`pending` 映射为 idle,`loading` 与 `unloading` 映射为 ongoing。`active` 或 `failed` fiber 只显示标签,不显示圆点。组合生成的次标题省略开头的 `include:` 标记;悬停、搜索、无障碍名称与展开详情仍保留完整 id。长条目 id 会在行内截断,悬停时仍可查看完整值。展开卡片后会显示声明的条目 id、完整模块标识与状态事实:预设行说明它来自哪个预设、组合存活时的运行状态,以及它携带的禁用条件;被预设提供的全局行说明它由 Agent 预设按会话提供、列出启用它的预设,并提供跳转到预设组的入口。预设名经共享的 `presetDisplayText` 纯函数(`dsh-agent-preset-registry/display`)叠在 [`ui-agent-preset`](../ui-agent-preset/README.zh.md) 的字典上解析:内置预设走当前语言,用户自建预设保留自己的元数据,因此英文界面不会回显预设声明里的中文名。搜索按本地化标题与描述、模块名称及条目 id 过滤两组。
|
|
35
37
|
|
|
36
38
|
### 预设切换器
|
|
37
39
|
|
|
@@ -39,7 +41,7 @@ kind: "package-reference"
|
|
|
39
41
|
|
|
40
42
|
### 重试失败的读取
|
|
41
43
|
|
|
42
|
-
|
|
44
|
+
读取失败会在标签页内渲染共享 error 标记;加载与当前页面同步使用共享 ongoing loading。重试会重新执行懒 `list()` 调用,且不会暴露传输细节。
|
|
43
45
|
|
|
44
46
|
插件列表还显示当前页面的同步失败。重试会重新应用最新客户端图,不改变 Host 启用状态,也不刷新页面。
|
|
45
47
|
|
package/lib/client.js
CHANGED
|
@@ -7,7 +7,7 @@ window.__ModuleLoader__.load({
|
|
|
7
7
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
8
|
let react = require("react");
|
|
9
9
|
let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
10
|
-
//#region ../../preset/agent-
|
|
10
|
+
//#region ../../preset/agent-preset-registry/src/display.ts
|
|
11
11
|
const BUILT_IN_PRESET_KEYS = {
|
|
12
12
|
standard: {
|
|
13
13
|
name: "presetStandardName",
|
|
@@ -27,13 +27,22 @@ window.__ModuleLoader__.load({
|
|
|
27
27
|
}
|
|
28
28
|
};
|
|
29
29
|
/**
|
|
30
|
+
* Whether a roster row is one of the shipped presets whose copy the dictionaries carry.
|
|
31
|
+
* A shipped preset publishes no `name`; a declaration that names itself owns its copy.
|
|
32
|
+
* @param preset - roster row.
|
|
33
|
+
* @returns true for a shipped preset id without a published name.
|
|
34
|
+
*/
|
|
35
|
+
function isBuiltInPreset(preset) {
|
|
36
|
+
return preset.name === void 0 && BUILT_IN_PRESET_KEYS[preset.id] !== void 0;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
30
39
|
* Resolve preset display copy without making user-authored metadata translatable.
|
|
31
40
|
* @param preset - roster row whose copy is being rendered.
|
|
32
41
|
* @param t - active locale lookup covering {@link BuiltInPresetCopyKey}.
|
|
33
|
-
* @returns localized copy for a known shipped preset, otherwise
|
|
42
|
+
* @returns localized copy for a known shipped preset, otherwise declaration metadata.
|
|
34
43
|
*/
|
|
35
44
|
function presetDisplayText(preset, t) {
|
|
36
|
-
const keys = preset
|
|
45
|
+
const keys = isBuiltInPreset(preset) ? BUILT_IN_PRESET_KEYS[preset.id] : void 0;
|
|
37
46
|
if (keys !== void 0) return {
|
|
38
47
|
name: t(keys.name),
|
|
39
48
|
description: t(keys.description)
|
|
@@ -45,7 +54,7 @@ window.__ModuleLoader__.load({
|
|
|
45
54
|
}
|
|
46
55
|
//#endregion
|
|
47
56
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-settings-plugin-inventory/src/client/PluginInventorySettingsTab.module.css.mjs
|
|
48
|
-
const css = ".qSYn7G_section{width:100%;max-width:760px;color:var(--dsw-alias-label-primary);flex-direction:column;gap:14px;display:flex}.qSYn7G_catalogHeading h3,.qSYn7G_status,.qSYn7G_failure p{margin:0}.qSYn7G_status,.qSYn7G_failure{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:20px}.qSYn7G_failure{color:var(--dsw-alias-state-error-primary);align-items:center;gap:10px;display:flex}.qSYn7G_failure button{border:.5px solid var(--dsw-alias-border-l3);color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;background:0 0;border-radius:6px;padding:4px 10px}.qSYn7G_catalog{flex-direction:column;gap:12px;display:flex}.qSYn7G_search{width:100%;color:var(--dsw-alias-label-tertiary);align-items:center;display:flex;position:relative}.qSYn7G_search>svg{pointer-events:none;position:absolute;left:12px}.qSYn7G_search input{border:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-layer-1);width:100%;height:36px;color:var(--dsw-alias-label-primary);font:inherit;border-radius:10px;outline:none;padding:0 34px 0 36px;font-size:13px}.qSYn7G_search input::placeholder{color:var(--dsw-alias-label-tertiary)}.qSYn7G_search input:focus-visible{border-color:var(--dsw-alias-state-business-primary);box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent)}.qSYn7G_catalogHeading{align-items:baseline;gap:7px;padding:0 2px;display:flex}.qSYn7G_catalogHeading h3{font-size:13px;font-weight:600;line-height:20px}.qSYn7G_catalogHeading span{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:12px;line-height:18px}.qSYn7G_cards{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:10px;margin:0;padding:0;list-style:none;display:grid}.qSYn7G_card{min-width:0;box-shadow:var(--dsw-elevation-stroke);background:var(--dsw-alias-bg-layer-3);border:0;border-radius:14px;overflow:hidden}.qSYn7G_card[data-open=true]{--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);box-shadow:var(--dsw-elevation-panel)}.qSYn7G_cardContent{box-sizing:border-box;width:100%;min-height:52px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex-direction:column;align-items:stretch;padding:12px 14px;display:flex}.qSYn7G_cardContent:hover,.qSYn7G_card[data-open=true]>.qSYn7G_cardContent{background:var(--dsw-alias-interactive-bg-hover)}.qSYn7G_cardContent:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}.qSYn7G_cardMainRow{justify-content:space-between;align-items:center;gap:12px;min-width:0;display:flex}.qSYn7G_cardTitle,.qSYn7G_cardIdentity{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.qSYn7G_cardTitle{flex:1;min-width:0;font-size:14px;font-weight:600;line-height:20px}.qSYn7G_cardIdentity{
|
|
57
|
+
const css = ".qSYn7G_section{width:100%;max-width:760px;color:var(--dsw-alias-label-primary);flex-direction:column;gap:14px;display:flex}.qSYn7G_catalogHeading h3,.qSYn7G_status,.qSYn7G_failure p{margin:0}.qSYn7G_status,.qSYn7G_failure{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:20px}.qSYn7G_failure{color:var(--dsw-alias-state-error-primary);align-items:center;gap:10px;display:flex}.qSYn7G_statusWithDot{align-items:center;gap:6px;display:inline-flex}.qSYn7G_failure button{border:.5px solid var(--dsw-alias-border-l3);color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;background:0 0;border-radius:6px;padding:4px 10px}.qSYn7G_catalog{flex-direction:column;gap:12px;display:flex}.qSYn7G_search{width:100%;color:var(--dsw-alias-label-tertiary);align-items:center;display:flex;position:relative}.qSYn7G_search>svg{pointer-events:none;position:absolute;left:12px}.qSYn7G_search input{border:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-layer-1);width:100%;height:36px;color:var(--dsw-alias-label-primary);font:inherit;border-radius:10px;outline:none;padding:0 34px 0 36px;font-size:13px}.qSYn7G_search input::placeholder{color:var(--dsw-alias-label-tertiary)}.qSYn7G_search input:focus-visible{border-color:var(--dsw-alias-state-business-primary);box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent)}.qSYn7G_catalogHeading{align-items:baseline;gap:7px;padding:0 2px;display:flex}.qSYn7G_catalogHeading h3{font-size:13px;font-weight:600;line-height:20px}.qSYn7G_catalogHeading span{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:12px;line-height:18px}.qSYn7G_cards{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:10px;margin:0;padding:0;list-style:none;display:grid}.qSYn7G_card{min-width:0;box-shadow:var(--dsw-elevation-stroke);background:var(--dsw-alias-bg-layer-3);border:0;border-radius:14px;overflow:hidden}.qSYn7G_card[data-open=true]{--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);box-shadow:var(--dsw-elevation-panel)}.qSYn7G_cardContent{box-sizing:border-box;width:100%;min-height:52px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex-direction:column;align-items:stretch;padding:12px 14px;display:flex}.qSYn7G_cardContent:hover,.qSYn7G_card[data-open=true]>.qSYn7G_cardContent{background:var(--dsw-alias-interactive-bg-hover)}.qSYn7G_cardContent:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}.qSYn7G_cardMainRow{justify-content:space-between;align-items:center;gap:12px;min-width:0;display:flex}.qSYn7G_cardTitle,.qSYn7G_cardIdentity{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.qSYn7G_cardTitle{flex:1;min-width:0;font-size:14px;font-weight:600;line-height:20px}.qSYn7G_cardIdentity,.qSYn7G_entryValue{font-family:var(--ds-font-family-code);font-size:12px;line-height:18px}.qSYn7G_cardIdentity{width:100%;color:var(--dsw-alias-label-tertiary);display:block}.qSYn7G_cardTrailing{color:var(--dsw-alias-label-tertiary);flex:none;align-items:center;gap:7px;display:inline-flex}.qSYn7G_phaseDot{flex:none;display:inline-flex}.qSYn7G_group{flex-direction:column;gap:10px;display:flex}.qSYn7G_groupTitleRow{align-items:center;gap:8px;min-height:32px;display:flex}.qSYn7G_group+.qSYn7G_group{border-top:.5px solid var(--dsw-alias-border-l2);padding-top:14px}.qSYn7G_headerEnd{margin-left:auto}.qSYn7G_groupToggle{color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex:none;align-items:center;gap:8px;padding:0;display:flex}.qSYn7G_groupToggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.qSYn7G_groupToggle>.qSYn7G_chevron{transform:rotate(-90deg)}.qSYn7G_groupToggle[aria-expanded=true]>.qSYn7G_chevron{transform:none}.qSYn7G_groupTitle{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.qSYn7G_groupSub{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex-wrap:wrap;gap:4px 8px;margin:-6px 0 0 20px;font-size:12px;line-height:18px;display:flex}.qSYn7G_failedCount{color:var(--dsw-alias-state-error-primary)}.qSYn7G_switcher{white-space:nowrap;background:var(--dsw-alias-bg-module-platform);height:36px;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border:none;border-radius:18px;flex:none;align-items:center;gap:12px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.qSYn7G_switcher:hover{background:var(--dsw-alias-interactive-bg-hover)}.qSYn7G_switcher:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.qSYn7G_switcher>.qSYn7G_chevron{flex:none}.qSYn7G_switcherLabel{text-overflow:ellipsis;max-width:240px;overflow:hidden}.qSYn7G_groupBody{flex-direction:column;gap:10px;display:flex}.qSYn7G_brokenNote{background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);color:var(--dsw-alias-state-error-primary);overflow-wrap:anywhere;white-space:pre-line;border-radius:8px;margin:0;padding:8px 10px;font-size:12.5px;line-height:18px}.qSYn7G_hint{color:var(--dsw-alias-label-tertiary);flex-wrap:wrap;align-items:baseline;gap:4px 8px;margin:0;font-size:12.5px;line-height:18px;display:flex}.qSYn7G_jumpLink{color:var(--dsw-alias-state-business-primary);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-size:12.5px}.qSYn7G_enabledIn{flex-wrap:wrap;align-items:baseline;gap:4px 10px;display:flex}.qSYn7G_card[data-failed=true]{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent)}.qSYn7G_chevron{color:var(--dsw-alias-label-tertiary);flex:none}.qSYn7G_card[data-open=true] .qSYn7G_chevron{transform:rotate(180deg)}.qSYn7G_cardDetails{border-top:.5px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);padding:10px 14px 12px}.qSYn7G_entryValue{overflow-wrap:anywhere;color:var(--dsw-alias-label-primary);display:block}.qSYn7G_details{grid-template-columns:76px minmax(0,1fr);gap:6px 10px;margin:8px 0 0;display:grid}.qSYn7G_details div{display:contents}.qSYn7G_details dt{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:17px}.qSYn7G_details dd{overflow-wrap:anywhere;min-width:0;color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;line-height:17px}.qSYn7G_visuallyHidden{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}@media (prefers-reduced-motion:no-preference){.qSYn7G_chevron{transition:transform .14s var(--ds-ease-in-out)}}@media (width<=680px){.qSYn7G_cards{grid-template-columns:minmax(0,1fr)}}";
|
|
49
58
|
const tagId = "@deepseek-ai/dsh-client-ui-settings-plugin-inventory/PluginInventorySettingsTab.module.css";
|
|
50
59
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
51
60
|
const tag = document.createElement("style");
|
|
@@ -85,6 +94,7 @@ window.__ModuleLoader__.load({
|
|
|
85
94
|
"search": "qSYn7G_search",
|
|
86
95
|
"section": "qSYn7G_section",
|
|
87
96
|
"status": "qSYn7G_status",
|
|
97
|
+
"statusWithDot": "qSYn7G_statusWithDot",
|
|
88
98
|
"switcher": "qSYn7G_switcher",
|
|
89
99
|
"switcherLabel": "qSYn7G_switcherLabel",
|
|
90
100
|
"visuallyHidden": "qSYn7G_visuallyHidden"
|
|
@@ -102,7 +112,7 @@ window.__ModuleLoader__.load({
|
|
|
102
112
|
function phaseLabel(phase, t) {
|
|
103
113
|
return phase === null ? t("unobserved") : t(PHASE_KEYS[phase]);
|
|
104
114
|
}
|
|
105
|
-
/** Compact
|
|
115
|
+
/** Compact technical names for Settings without changing their module identity. */
|
|
106
116
|
function moduleShortName(moduleName) {
|
|
107
117
|
return (moduleName.startsWith("@") ? moduleName.slice(moduleName.indexOf("/") + 1) : moduleName).replace(/^cordis:/, "").replace(/^cordis-plugin-/, "").replace(/^dsh-(?:host-|client-)?/, "");
|
|
108
118
|
}
|
|
@@ -110,10 +120,24 @@ window.__ModuleLoader__.load({
|
|
|
110
120
|
function entrySubtitle(entryId) {
|
|
111
121
|
return entryId.replace(/^include:/, "");
|
|
112
122
|
}
|
|
113
|
-
/**
|
|
114
|
-
function
|
|
123
|
+
/** Preserve translated titles and shorten literal package or module name fallbacks in Settings. */
|
|
124
|
+
function pluginText(row, resolveText) {
|
|
125
|
+
const title = row.meta?.title;
|
|
126
|
+
return {
|
|
127
|
+
title: typeof title === "object" ? resolveText(title) : moduleShortName(title ?? row.moduleName),
|
|
128
|
+
description: row.meta?.description === void 0 ? void 0 : resolveText(row.meta.description) || void 0
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/** Match translated text alongside the row's technical module and entry identities. */
|
|
132
|
+
function matches(row, normalizedQuery, resolveText) {
|
|
115
133
|
if (normalizedQuery.length === 0) return true;
|
|
116
|
-
|
|
134
|
+
const { title, description } = pluginText(row, resolveText);
|
|
135
|
+
return [
|
|
136
|
+
row.moduleName,
|
|
137
|
+
row.entryId,
|
|
138
|
+
title,
|
|
139
|
+
description
|
|
140
|
+
].some((value) => value?.toLocaleLowerCase().includes(normalizedQuery));
|
|
117
141
|
}
|
|
118
142
|
/** The roster row shown when the preset switcher has no explicit choice. */
|
|
119
143
|
function fallbackPreset(presets) {
|
|
@@ -127,48 +151,67 @@ window.__ModuleLoader__.load({
|
|
|
127
151
|
return name;
|
|
128
152
|
}
|
|
129
153
|
/** One expandable plugin card; the caller owns the trailing status content. */
|
|
130
|
-
function PluginCard({ rowKey, moduleName, entryId, trailing, ariaLabel, failed, expanded, onToggle, children }) {
|
|
154
|
+
function PluginCard({ rowKey, moduleName, title, description, metadataError, entryId, trailing, ariaLabel, failed, expanded, onToggle, children }) {
|
|
131
155
|
const open = expanded === rowKey;
|
|
132
156
|
const detailId = `plugin-details-${encodeURIComponent(rowKey)}`;
|
|
157
|
+
const descriptionId = (0, react.useId)();
|
|
133
158
|
return (0, react_jsx_runtime.jsxs)("li", {
|
|
134
159
|
className: PluginInventorySettingsTab_module_css_default.card,
|
|
135
160
|
"data-plugin-entry": entryId ?? void 0,
|
|
136
161
|
"data-plugin-module": moduleName,
|
|
137
162
|
"data-failed": failed ? "true" : void 0,
|
|
138
163
|
"data-open": open ? "true" : void 0,
|
|
139
|
-
children: [
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
children: [
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
164
|
+
children: [
|
|
165
|
+
(0, react_jsx_runtime.jsxs)("button", {
|
|
166
|
+
className: PluginInventorySettingsTab_module_css_default.cardContent,
|
|
167
|
+
type: "button",
|
|
168
|
+
"aria-expanded": open,
|
|
169
|
+
"aria-controls": detailId,
|
|
170
|
+
"aria-label": ariaLabel,
|
|
171
|
+
"aria-describedby": description === void 0 ? void 0 : descriptionId,
|
|
172
|
+
onClick: () => {
|
|
173
|
+
onToggle(rowKey);
|
|
174
|
+
},
|
|
175
|
+
children: [
|
|
176
|
+
(0, react_jsx_runtime.jsxs)("span", {
|
|
177
|
+
className: PluginInventorySettingsTab_module_css_default.cardMainRow,
|
|
178
|
+
children: [(0, react_jsx_runtime.jsx)("strong", {
|
|
179
|
+
className: PluginInventorySettingsTab_module_css_default.cardTitle,
|
|
180
|
+
title: moduleName,
|
|
181
|
+
children: title
|
|
182
|
+
}), (0, react_jsx_runtime.jsxs)("span", {
|
|
183
|
+
className: PluginInventorySettingsTab_module_css_default.cardTrailing,
|
|
184
|
+
children: [trailing, (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, {
|
|
185
|
+
className: PluginInventorySettingsTab_module_css_default.chevron,
|
|
186
|
+
size: 12,
|
|
187
|
+
"aria-hidden": "true"
|
|
188
|
+
})]
|
|
189
|
+
})]
|
|
190
|
+
}),
|
|
191
|
+
description === void 0 ? null : (0, react_jsx_runtime.jsx)("span", {
|
|
192
|
+
className: PluginInventorySettingsTab_module_css_default.hint,
|
|
193
|
+
id: descriptionId,
|
|
194
|
+
children: description
|
|
195
|
+
}),
|
|
196
|
+
entryId === null ? null : (0, react_jsx_runtime.jsx)("code", {
|
|
197
|
+
className: PluginInventorySettingsTab_module_css_default.cardIdentity,
|
|
198
|
+
title: entryId,
|
|
199
|
+
children: entrySubtitle(entryId)
|
|
200
|
+
})
|
|
201
|
+
]
|
|
202
|
+
}),
|
|
203
|
+
metadataError === void 0 ? null : (0, react_jsx_runtime.jsx)("p", {
|
|
204
|
+
className: PluginInventorySettingsTab_module_css_default.brokenNote,
|
|
205
|
+
role: "status",
|
|
206
|
+
"data-package-meta-error": true,
|
|
207
|
+
children: metadataError
|
|
208
|
+
}),
|
|
209
|
+
open ? (0, react_jsx_runtime.jsx)("div", {
|
|
210
|
+
className: PluginInventorySettingsTab_module_css_default.cardDetails,
|
|
211
|
+
id: detailId,
|
|
212
|
+
children
|
|
213
|
+
}) : null
|
|
214
|
+
]
|
|
172
215
|
});
|
|
173
216
|
}
|
|
174
217
|
/** Detail rows shared by every card: the Loader identity, then labeled facts. */
|
|
@@ -217,7 +260,7 @@ window.__ModuleLoader__.load({
|
|
|
217
260
|
});
|
|
218
261
|
}
|
|
219
262
|
/** Render the read-only plugin inventory: agent presets first, then the global plane. */
|
|
220
|
-
function PluginInventorySettingsTab({ list, presetName, t, useClientSync, retryClient }) {
|
|
263
|
+
function PluginInventorySettingsTab({ list, presetName, resolveText, t, useClientSync, retryClient }) {
|
|
221
264
|
const clientSync = useClientSync((snapshot) => snapshot);
|
|
222
265
|
const sectionId = (0, react.useId)();
|
|
223
266
|
const [request, setRequest] = (0, react.useState)(0);
|
|
@@ -263,8 +306,8 @@ window.__ModuleLoader__.load({
|
|
|
263
306
|
const regularEntries = [];
|
|
264
307
|
for (const entry of entries) if (entry.fiberPhase === "failed") failedEntries.push(entry);
|
|
265
308
|
else regularEntries.push(entry);
|
|
266
|
-
const entryMatch = (entry) => matches(entry
|
|
267
|
-
const rowMatch = (row) => matches(row
|
|
309
|
+
const entryMatch = (entry) => matches(entry, normalizedQuery, resolveText);
|
|
310
|
+
const rowMatch = (row) => matches(row, normalizedQuery, resolveText);
|
|
268
311
|
const filteredFailed = failedEntries.filter(entryMatch);
|
|
269
312
|
const filteredRegular = regularEntries.filter(entryMatch);
|
|
270
313
|
const globalCount = filteredFailed.length + filteredRegular.length;
|
|
@@ -284,13 +327,16 @@ window.__ModuleLoader__.load({
|
|
|
284
327
|
/** Trailing status and detail facts for one row of the selected preset. */
|
|
285
328
|
const presetRowCard = (preset, row, index) => {
|
|
286
329
|
const key = `preset:${preset.id}:${String(index)}`;
|
|
287
|
-
const title =
|
|
330
|
+
const { title, description } = pluginText(row, resolveText);
|
|
288
331
|
const failed = row.fiberPhase === "failed";
|
|
289
332
|
const stateText = failed ? t("failedTag") : row.enabled === true ? t("enabledTag") : row.enabled === false ? t("disabledTag") : t("conditionalTag");
|
|
290
333
|
const kind = failed ? "failed" : row.enabled === true ? "enabled" : row.enabled === false ? "disabled" : "conditional";
|
|
291
334
|
return (0, react_jsx_runtime.jsx)(PluginCard, {
|
|
292
335
|
rowKey: key,
|
|
293
336
|
moduleName: row.moduleName,
|
|
337
|
+
title,
|
|
338
|
+
description,
|
|
339
|
+
metadataError: row.meta?.error === void 0 ? void 0 : t("metadataError", { error: row.meta.error }),
|
|
294
340
|
entryId: row.entryId,
|
|
295
341
|
failed,
|
|
296
342
|
expanded,
|
|
@@ -319,13 +365,16 @@ window.__ModuleLoader__.load({
|
|
|
319
365
|
/** One global-plane row; a preset-provided row carries the presets that enable it. */
|
|
320
366
|
const globalRowCard = (entry, providers) => {
|
|
321
367
|
const key = `global:${entry.entryId}`;
|
|
322
|
-
const title =
|
|
368
|
+
const { title, description } = pluginText(entry, resolveText);
|
|
323
369
|
const failed = entry.fiberPhase === "failed";
|
|
324
370
|
const stateText = failed ? t("failedTag") : providers !== void 0 ? t("presetEnabledTag") : t(entry.enabled ? "enabledTag" : "disabledTag");
|
|
325
371
|
const kind = failed ? "failed" : providers !== void 0 ? "preset" : entry.enabled ? "enabled" : "disabled";
|
|
326
372
|
return (0, react_jsx_runtime.jsx)(PluginCard, {
|
|
327
373
|
rowKey: key,
|
|
328
374
|
moduleName: entry.moduleName,
|
|
375
|
+
title,
|
|
376
|
+
description,
|
|
377
|
+
metadataError: entry.meta?.error === void 0 ? void 0 : t("metadataError", { error: entry.meta.error }),
|
|
329
378
|
entryId: entry.entryId,
|
|
330
379
|
failed,
|
|
331
380
|
expanded,
|
|
@@ -360,18 +409,19 @@ window.__ModuleLoader__.load({
|
|
|
360
409
|
className: PluginInventorySettingsTab_module_css_default.section,
|
|
361
410
|
"aria-busy": state.status === "loading",
|
|
362
411
|
children: [
|
|
363
|
-
clientSync.syncing ? (0, react_jsx_runtime.
|
|
364
|
-
className: PluginInventorySettingsTab_module_css_default.status
|
|
412
|
+
clientSync.syncing ? (0, react_jsx_runtime.jsxs)("p", {
|
|
413
|
+
className: `${PluginInventorySettingsTab_module_css_default.status} ${PluginInventorySettingsTab_module_css_default.statusWithDot}`,
|
|
365
414
|
role: "status",
|
|
366
|
-
children: t("clientSyncing")
|
|
415
|
+
children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: "ongoing" }), t("clientSyncing")]
|
|
367
416
|
}) : null,
|
|
368
417
|
clientSync.failures.length === 0 ? null : (0, react_jsx_runtime.jsxs)("div", {
|
|
369
418
|
className: PluginInventorySettingsTab_module_css_default.failure,
|
|
370
419
|
"data-client-sync-failure": true,
|
|
371
420
|
children: [
|
|
372
|
-
(0, react_jsx_runtime.
|
|
421
|
+
(0, react_jsx_runtime.jsxs)("p", {
|
|
422
|
+
className: PluginInventorySettingsTab_module_css_default.statusWithDot,
|
|
373
423
|
role: "alert",
|
|
374
|
-
children: t("clientSyncFailed")
|
|
424
|
+
children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: "error" }), t("clientSyncFailed")]
|
|
375
425
|
}),
|
|
376
426
|
(0, react_jsx_runtime.jsx)("ul", { children: clientSync.failures.map((failure) => (0, react_jsx_runtime.jsxs)("li", { children: [
|
|
377
427
|
failure.id,
|
|
@@ -386,15 +436,17 @@ window.__ModuleLoader__.load({
|
|
|
386
436
|
})
|
|
387
437
|
]
|
|
388
438
|
}),
|
|
389
|
-
state.status === "loading" ? (0, react_jsx_runtime.
|
|
390
|
-
className: PluginInventorySettingsTab_module_css_default.status
|
|
391
|
-
|
|
439
|
+
state.status === "loading" ? (0, react_jsx_runtime.jsxs)("p", {
|
|
440
|
+
className: `${PluginInventorySettingsTab_module_css_default.status} ${PluginInventorySettingsTab_module_css_default.statusWithDot}`,
|
|
441
|
+
role: "status",
|
|
442
|
+
children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: "ongoing" }), t("loading")]
|
|
392
443
|
}) : null,
|
|
393
444
|
state.status === "error" ? (0, react_jsx_runtime.jsxs)("div", {
|
|
394
445
|
className: PluginInventorySettingsTab_module_css_default.failure,
|
|
395
|
-
children: [(0, react_jsx_runtime.
|
|
446
|
+
children: [(0, react_jsx_runtime.jsxs)("p", {
|
|
447
|
+
className: PluginInventorySettingsTab_module_css_default.statusWithDot,
|
|
396
448
|
role: "alert",
|
|
397
|
-
children: t("error")
|
|
449
|
+
children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: "error" }), t("error")]
|
|
398
450
|
}), (0, react_jsx_runtime.jsx)("button", {
|
|
399
451
|
type: "button",
|
|
400
452
|
onClick: retry,
|
|
@@ -407,7 +459,7 @@ window.__ModuleLoader__.load({
|
|
|
407
459
|
(0, react_jsx_runtime.jsxs)("label", {
|
|
408
460
|
className: PluginInventorySettingsTab_module_css_default.search,
|
|
409
461
|
children: [
|
|
410
|
-
(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.
|
|
462
|
+
(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutlineRegular, { "aria-hidden": "true" }),
|
|
411
463
|
(0, react_jsx_runtime.jsx)("span", {
|
|
412
464
|
className: PluginInventorySettingsTab_module_css_default.visuallyHidden,
|
|
413
465
|
children: t("search")
|
|
@@ -446,7 +498,7 @@ window.__ModuleLoader__.load({
|
|
|
446
498
|
onClick: () => {
|
|
447
499
|
setPresetOpen(!presetEffectiveOpen);
|
|
448
500
|
},
|
|
449
|
-
children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.
|
|
501
|
+
children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, {
|
|
450
502
|
className: PluginInventorySettingsTab_module_css_default.chevron,
|
|
451
503
|
size: 12,
|
|
452
504
|
"aria-hidden": "true"
|
|
@@ -484,7 +536,7 @@ window.__ModuleLoader__.load({
|
|
|
484
536
|
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
485
537
|
className: PluginInventorySettingsTab_module_css_default.switcherLabel,
|
|
486
538
|
children: presetLabel(selected, t, presetName)
|
|
487
|
-
}), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.
|
|
539
|
+
}), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, {
|
|
488
540
|
className: PluginInventorySettingsTab_module_css_default.chevron,
|
|
489
541
|
"aria-hidden": "true"
|
|
490
542
|
})]
|
|
@@ -541,7 +593,7 @@ window.__ModuleLoader__.load({
|
|
|
541
593
|
onClick: () => {
|
|
542
594
|
setGlobalOpen(!globalEffectiveOpen);
|
|
543
595
|
},
|
|
544
|
-
children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.
|
|
596
|
+
children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, {
|
|
545
597
|
className: PluginInventorySettingsTab_module_css_default.chevron,
|
|
546
598
|
size: 12,
|
|
547
599
|
"aria-hidden": "true"
|
|
@@ -592,6 +644,7 @@ window.__ModuleLoader__.load({
|
|
|
592
644
|
clientSyncFailed: "本页面的插件未能完成同步;服务端的启用状态保持不变。",
|
|
593
645
|
clientSyncRetry: "重试本页面同步",
|
|
594
646
|
error: "暂时无法读取插件。",
|
|
647
|
+
metadataError: "包元信息错误:{error}",
|
|
595
648
|
retry: "重试",
|
|
596
649
|
search: "搜索插件",
|
|
597
650
|
empty: "暂无插件。",
|
|
@@ -634,6 +687,7 @@ window.__ModuleLoader__.load({
|
|
|
634
687
|
clientSyncFailed: "Some plugins could not sync on this page. Host enablement is unchanged.",
|
|
635
688
|
clientSyncRetry: "Retry this page",
|
|
636
689
|
error: "Plugins are temporarily unavailable.",
|
|
690
|
+
metadataError: "Package metadata error: {error}",
|
|
637
691
|
retry: "Retry",
|
|
638
692
|
search: "Search plugins",
|
|
639
693
|
empty: "No plugins are available.",
|
|
@@ -698,6 +752,7 @@ window.__ModuleLoader__.load({
|
|
|
698
752
|
const injected = () => ({
|
|
699
753
|
list,
|
|
700
754
|
presetName,
|
|
755
|
+
resolveText: (text) => ctx.locale.resolveText(text),
|
|
701
756
|
hooks: { clientSync: ctx.modules.entries.state },
|
|
702
757
|
retryClient: () => {
|
|
703
758
|
ctx.modules.entries.retry().catch((error) => {
|
|
@@ -2,10 +2,13 @@ import { type ReactNode } from 'react';
|
|
|
2
2
|
import type { ClientEntryState } from '@deepseek-ai/dsh-client-modules/client';
|
|
3
3
|
import type { ObservableSnapshot } from '@deepseek-ai/dsh-client-store';
|
|
4
4
|
import type { PluginInventorySnapshot } from '@deepseek-ai/dsh-api-remotes/client';
|
|
5
|
+
import type { LocalizedText } from '@deepseek-ai/dsh-package-manifest';
|
|
5
6
|
import type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
6
7
|
type AgentPresetGroup = NonNullable<PluginInventorySnapshot['agentPresets']>[number];
|
|
7
8
|
/** Registration-side Remote face used by the section. */
|
|
8
9
|
export interface PluginInventorySettingsTabInjected {
|
|
10
|
+
/** Resolve local package text in the current Client locale at render time. */
|
|
11
|
+
resolveText: (text: LocalizedText) => string;
|
|
9
12
|
/** Page-local module synchronization, independent from the Host inventory. */
|
|
10
13
|
hooks: {
|
|
11
14
|
clientSync: ObservableSnapshot<ClientEntryState>;
|
|
@@ -23,6 +26,6 @@ export interface PluginInventorySettingsTabInjected {
|
|
|
23
26
|
/** Full component props assembled by the Settings slot renderer. */
|
|
24
27
|
export type PluginInventorySettingsTabProps = PropsRuntime<'settings.plugins.tab'> & PropsLocale<'settings.pluginInventory'> & InjectFace<PluginInventorySettingsTabInjected>;
|
|
25
28
|
/** Render the read-only plugin inventory: agent presets first, then the global plane. */
|
|
26
|
-
export declare function PluginInventorySettingsTab({ list, presetName, t, useClientSync, retryClient }: PluginInventorySettingsTabProps): ReactNode;
|
|
29
|
+
export declare function PluginInventorySettingsTab({ list, presetName, resolveText, t, useClientSync, retryClient }: PluginInventorySettingsTabProps): ReactNode;
|
|
27
30
|
export {};
|
|
28
31
|
//# sourceMappingURL=PluginInventorySettingsTab.d.ts.map
|
|
@@ -7,6 +7,7 @@ export declare const zh: {
|
|
|
7
7
|
clientSyncFailed: string;
|
|
8
8
|
clientSyncRetry: string;
|
|
9
9
|
error: string;
|
|
10
|
+
metadataError: string;
|
|
10
11
|
retry: string;
|
|
11
12
|
search: string;
|
|
12
13
|
empty: string;
|
|
@@ -51,6 +52,7 @@ export declare const en: {
|
|
|
51
52
|
clientSyncFailed: string;
|
|
52
53
|
clientSyncRetry: string;
|
|
53
54
|
error: string;
|
|
55
|
+
metadataError: string;
|
|
54
56
|
retry: string;
|
|
55
57
|
search: string;
|
|
56
58
|
empty: string;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-ai/dsh-client-ui-settings-plugin-inventory",
|
|
3
3
|
"description": "Read-only Cordis Loader inventory tab in Web Plugins settings",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.7-alpha.1",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -39,25 +39,26 @@
|
|
|
39
39
|
},
|
|
40
40
|
"license": "MIT",
|
|
41
41
|
"peerDependencies": {
|
|
42
|
-
"@deepseek-ai/cordis": "^4.0.
|
|
42
|
+
"@deepseek-ai/cordis": "^4.0.3"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@testing-library/react": "^16.1.0",
|
|
46
46
|
"@types/react": "~18.3.1",
|
|
47
47
|
"react": "^18.2.0",
|
|
48
48
|
"react-dom": "^18.2.0",
|
|
49
|
-
"@deepseek-ai/dsh-
|
|
50
|
-
"@deepseek-ai/dsh-client-
|
|
51
|
-
"@deepseek-ai/dsh-client-ui-
|
|
52
|
-
"@deepseek-ai/dsh-client-ui-
|
|
53
|
-
"@deepseek-ai/dsh-
|
|
54
|
-
"@deepseek-ai/
|
|
55
|
-
"@deepseek-ai/
|
|
56
|
-
"@deepseek-ai/dsh-client-
|
|
57
|
-
"@deepseek-ai/dsh-
|
|
58
|
-
"@deepseek-ai/dsh-client-ui-
|
|
59
|
-
"@deepseek-ai/dsh-client-
|
|
60
|
-
"@deepseek-ai/dsh-client-
|
|
49
|
+
"@deepseek-ai/dsh-client-ui-agent-preset": "^0.1.7-alpha.1",
|
|
50
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.7-alpha.1",
|
|
51
|
+
"@deepseek-ai/dsh-client-ui-settings": "^0.1.7-alpha.1",
|
|
52
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.7-alpha.1",
|
|
53
|
+
"@deepseek-ai/dsh-package-manifest": "^0.1.7-alpha.1",
|
|
54
|
+
"@deepseek-ai/cordis": "^4.0.3",
|
|
55
|
+
"@deepseek-ai/dsh-agent-preset-registry": "^0.1.7-alpha.1",
|
|
56
|
+
"@deepseek-ai/dsh-client-modules": "^0.1.7-alpha.1",
|
|
57
|
+
"@deepseek-ai/dsh-client-store": "^0.1.7-alpha.1",
|
|
58
|
+
"@deepseek-ai/dsh-client-ui-renderer": "^0.1.7-alpha.1",
|
|
59
|
+
"@deepseek-ai/dsh-client-locale": "^0.1.7-alpha.1",
|
|
60
|
+
"@deepseek-ai/dsh-client-test-runtime": "^0.1.7-alpha.1",
|
|
61
|
+
"@deepseek-ai/dsh-api-remotes": "^0.1.7-alpha.1"
|
|
61
62
|
},
|
|
62
63
|
"files": [
|
|
63
64
|
"lib/index.js",
|