dsh-agent-plugins-market 0.7.2 → 0.8.0
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.md +11 -3
- package/README.zh.md +11 -3
- package/client/client.js +47 -27
- package/client/client.js.map +1 -1
- package/lib/application/catalog.js +9 -2
- package/lib/catalog/component-files.js +3 -1
- package/lib/catalog/native-project.js +1 -1
- package/lib/catalog/project-config.js +0 -2
- package/lib/catalog/project-hooks.js +12 -7
- package/lib/catalog/surfaces.js +17 -10
- package/lib/model/command-names.js +14 -0
- package/lib/model/layouts.js +1 -0
- package/lib/runtime/commands-mounts.js +3 -2
- package/lib/runtime/hooks-mounts.js +7 -4
- package/lib/runtime/mcp-direct-config.js +18 -9
- package/lib/runtime/plugin-message-source.js +4 -0
- package/lib/runtime/project-runtime.js +10 -8
- package/lib/runtime/user-commands.js +23 -8
- package/lib/runtime/user-hooks.js +102 -0
- package/lib/runtime/user-panels.js +34 -22
- package/lib/runtime/user-store.js +81 -19
- package/lib/types/catalog/component-files.d.ts +1 -0
- package/lib/types/catalog/project-hooks.d.ts +15 -2
- package/lib/types/catalog/surfaces.d.ts +6 -4
- package/lib/types/contracts/market.d.ts +5 -1
- package/lib/types/model/command-names.d.ts +12 -0
- package/lib/types/model/layouts.d.ts +1 -0
- package/lib/types/model/types.d.ts +2 -1
- package/lib/types/runtime/mcp-direct-config.d.ts +1 -5
- package/lib/types/runtime/plugin-message-source.d.ts +24 -0
- package/lib/types/runtime/user-commands.d.ts +5 -2
- package/lib/types/runtime/user-hooks.d.ts +22 -0
- package/lib/types/runtime/user-panels.d.ts +35 -15
- package/lib/types/runtime/user-store.d.ts +27 -10
- package/package.json +32 -28
- package/schemas/com.deepseek.harness/spec.md +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# dsh-agent-plugins-market
|
|
4
4
|
|
|
5
|
-
**A
|
|
5
|
+
**A one-stop skills, subagent, MCP and LSP manager inside [DeepSeek Harness (DSH)](https://github.com/deepseek-ai/deepseek-harness), compatible with Claude Code, Codex, Cursor, Kimi and other agent plugin layouts.**
|
|
6
6
|
|
|
7
7
|
Reuse supported content from Claude Code, Codex, Cursor, Kimi and other recognized layouts, and manage your own skills, commands, agent personas, MCP services and LSP servers in the DSH Web GUI.
|
|
8
8
|
|
|
@@ -93,7 +93,7 @@ The workspace has six tabs:
|
|
|
93
93
|
|
|
94
94
|
A **source** is where content comes from; a **suite** is an installable unit discovered there. Adding a source discovers its suites. Installing and enabling a suite controls its runtime capabilities.
|
|
95
95
|
|
|
96
|
-
Everything you author yourself lives in the shared Agent layout root: skills, commands and personas as Markdown under `~/.agents/`, and the MCP and LSP services you add in the workspace in `~/.agents/mcp.json` and `~/.agents/lsp.json`. Project-native resources stay in the project. See [storage and discovery](docs/user/usage.md#storage-and-discovery) for paths and precedence.
|
|
96
|
+
Everything you author yourself lives in the shared Agent layout root: skills, commands and personas as Markdown under `~/.agents/`, command hooks in `~/.agents/hooks.json` (or `~/.agents/hooks/hooks.json`), and the MCP and LSP services you add in the workspace in `~/.agents/mcp.json` and `~/.agents/lsp.json`. Commands and personas are read at any subdirectory depth, so a file another tool wrote at `~/.agents/commands/git/commit.md` is callable as `/git-commit`. Project-native resources stay in the project. See [storage and discovery](docs/user/usage.md#storage-and-discovery) for paths and precedence.
|
|
97
97
|
|
|
98
98
|
All six tabs share a saved grid/list preference. Add and refresh actions sit at the top right; resource state rails are green when active.
|
|
99
99
|
|
|
@@ -155,7 +155,7 @@ The table says per layout whether this plugin reads a given surface at all. **Ye
|
|
|
155
155
|
| Manifest-less skill collection | Yes | Yes | Yes | Yes | Partial | Partial |
|
|
156
156
|
| Project-native directories | Yes | Yes | Yes | Yes | Partial | No |
|
|
157
157
|
|
|
158
|
-
- **Skills** are read from the paths a manifest declares and from the conventional `skills/` directory, including flat `SKILL.md`
|
|
158
|
+
- **Skills** are read from the paths a manifest declares and from the conventional `skills/` directory, including flat `<name>.md` files. A path that carries its own `SKILL.md` is one skill: the documents beside it belong to that skill and are not read as skills. A conformant agent-plugins package is the exception: skills come from one level of `skills/` subdirectories, exactly as its specification requires.
|
|
159
159
|
- **Agents and commands** are read as Markdown (`agents/*.md`, `commands/*.md`). Cursor plugin commands accept `.md`, `.mdc`, `.markdown` and `.txt`. Codex and Kimi native agent/command formats (TOML, YAML) have no adapter yet.
|
|
160
160
|
- **MCP** covers declared files, inline tables and arrays. Cursor's schema-less `mcp.json` and agent-plugins' strict `mcp.json` both work; Kimi Code is inline-only. Codex app connectors stay outside this adapter.
|
|
161
161
|
- **Hooks** map the command-style events DSH has an equivalent for; events without one (for example `afterFileEdit`) are reported instead of simulated. Cursor's native events are not read.
|
|
@@ -220,3 +220,11 @@ Only when you tick **also delete the managed market directory** in the confirmat
|
|
|
220
220
|
- [Security policy](SECURITY.md) · [Release history](CHANGELOG.md) · [MIT license](LICENSE).
|
|
221
221
|
- [Domain glossary](CONTEXT.md) · [Architecture](docs/developer/decisions/0001-catalog-centered-modular-refactor.md).
|
|
222
222
|
- [Agent roles and storage](docs/user/agent-roles.md): installed-resource editing, model routing and migration.
|
|
223
|
+
|
|
224
|
+
## Community
|
|
225
|
+
|
|
226
|
+
Scan the QR code to join the **dsh-agent-plugins-market** WeChat group, where we answer questions and take feature requests.
|
|
227
|
+
|
|
228
|
+
<div align="center">
|
|
229
|
+
<img src="docs/screenshots/wechat-group.webp" alt="WeChat group QR code for dsh-agent-plugins-market" width="240" />
|
|
230
|
+
</div>
|
package/README.zh.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# dsh-agent-plugins-market
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**在 [DeepSeek Harness(DSH)](https://github.com/deepseek-ai/deepseek-harness) 之内,一站式管理 skills、subagent、MCP、LSP,兼容 Claude Code、Codex、Cursor、Kimi 等 agent plugins 体系。**
|
|
6
6
|
|
|
7
7
|
复用 Claude Code、Codex、Cursor、Kimi 等已识别布局中支持的内容,在 DSH Web 界面管理自己的技能、命令、代理角色、MCP 服务和 LSP 服务。
|
|
8
8
|
|
|
@@ -93,7 +93,7 @@ dsh plugin --profile <name> add dsh-agent-plugins-market
|
|
|
93
93
|
|
|
94
94
|
**来源(source)**表示内容来自哪里,**套件(suite)**是从中发现的可安装单元。添加来源用于发现套件;安装并启用套件决定其运行时能力是否生效。
|
|
95
95
|
|
|
96
|
-
你自己创作的内容都放在共用的 Agent 布局根目录:技能、命令和角色是 `~/.agents/` 下的 Markdown
|
|
96
|
+
你自己创作的内容都放在共用的 Agent 布局根目录:技能、命令和角色是 `~/.agents/` 下的 Markdown 文件,命令 hooks 放在 `~/.agents/hooks.json`(或 `~/.agents/hooks/hooks.json`),工作区里新增的 MCP 与 LSP 服务分别保存在 `~/.agents/mcp.json` 与 `~/.agents/lsp.json`。命令与角色按任意子目录深度读取,因此其它工具写在 `~/.agents/commands/git/commit.md` 的文件可用 `/git-commit` 调用。项目原生资源继续保留在项目中。路径和优先级见[存储与发现](docs/user/usage.zh.md#存储与发现)。
|
|
97
97
|
|
|
98
98
|
六个页签共用持久化的卡片/列表偏好。新增、刷新统一位于页头;资源状态条为绿色时表示生效中。
|
|
99
99
|
|
|
@@ -155,7 +155,7 @@ dsh plugin --profile <name> add dsh-agent-plugins-market
|
|
|
155
155
|
| 无清单技能集合 | 支持 | 支持 | 支持 | 支持 | 部分 | 部分 |
|
|
156
156
|
| 项目原生目录 | 支持 | 支持 | 支持 | 支持 | 部分 | 不支持 |
|
|
157
157
|
|
|
158
|
-
- **技能**读取清单声明的路径与约定的 `skills/` 目录,也支持平铺的 `SKILL.md`
|
|
158
|
+
- **技能**读取清单声明的路径与约定的 `skills/` 目录,也支持平铺的 `<name>.md` 文件。自带 `SKILL.md` 的路径就是一个技能:与它并列的文档属于该技能,不作为技能读取。合规的 agent-plugins 套件是例外:技能只来自 `skills/` 一层子目录,与其规范一致。
|
|
159
159
|
- **代理与命令**按 Markdown 读取(`agents/*.md`、`commands/*.md`)。Cursor 插件命令接受 `.md`、`.mdc`、`.markdown`、`.txt`;Codex 与 Kimi 的原生代理/命令格式(TOML、YAML)尚未适配。
|
|
160
160
|
- **MCP** 支持声明的文件、内联表与数组。Cursor 的无 schema `mcp.json` 与 agent-plugins 的严格 `mcp.json` 都能读取;Kimi Code 只读内联声明。Codex 的 app 连接器不在适配范围内。
|
|
161
161
|
- **Hooks** 只映射 DSH 有对应点的命令类事件;没有对应点的事件(例如 `afterFileEdit`)给出诊断而不伪造执行。Cursor 的原生事件不读取。
|
|
@@ -220,3 +220,11 @@ README 中的仓库在 [`tests/fixtures/real-layouts/`](tests/fixtures/real-layo
|
|
|
220
220
|
- [安全政策](SECURITY.md) · [版本记录](CHANGELOG.md) · [MIT 许可](LICENSE)。
|
|
221
221
|
- [领域词汇](CONTEXT.md) · [架构设计](docs/developer/decisions/0001-catalog-centered-modular-refactor.md)。
|
|
222
222
|
- [代理角色与存储](docs/user/agent-roles.zh.md):已安装资源编辑、角色模型路由与目录迁移。
|
|
223
|
+
|
|
224
|
+
## 交流群
|
|
225
|
+
|
|
226
|
+
扫描下方二维码加入 **dsh-agent-plugins-market** 微信群,提问与提需求都可以在群里说。
|
|
227
|
+
|
|
228
|
+
<div align="center">
|
|
229
|
+
<img src="docs/screenshots/wechat-group.webp" alt="dsh-agent-plugins-market 微信群二维码" width="240" />
|
|
230
|
+
</div>
|
package/client/client.js
CHANGED
|
@@ -238,7 +238,7 @@ function ActiveOverlay$1({ target, t, visible, slow }) {
|
|
|
238
238
|
}, visible ? (0, react.createElement)("div", { className: busy_overlay_module_default.content }, (0, react.createElement)("span", {
|
|
239
239
|
className: busy_overlay_module_default.spinner,
|
|
240
240
|
"aria-hidden": true
|
|
241
|
-
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
241
|
+
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconLoadingOutlineMedium, { size: 28 })), (0, react.createElement)("strong", { className: busy_overlay_module_default.label }, t("panelWorking")), (0, react.createElement)("div", { className: busy_overlay_module_default.hintViewport }, (0, react.createElement)("p", {
|
|
242
242
|
key: message,
|
|
243
243
|
className: busy_overlay_module_default.hint
|
|
244
244
|
}, hints[message])), slow ? (0, react.createElement)("p", {
|
|
@@ -1983,7 +1983,7 @@ function SuiteCard(props) {
|
|
|
1983
1983
|
"aria-label": t("refresh"),
|
|
1984
1984
|
disabled: busy,
|
|
1985
1985
|
onClick: stop(props.onRefresh)
|
|
1986
|
-
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
1986
|
+
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineMedium)),
|
|
1987
1987
|
(0, react.createElement)("button", {
|
|
1988
1988
|
key: "uninstall",
|
|
1989
1989
|
type: "button",
|
|
@@ -1992,7 +1992,7 @@ function SuiteCard(props) {
|
|
|
1992
1992
|
"aria-label": t("uninstall"),
|
|
1993
1993
|
disabled: busy,
|
|
1994
1994
|
onClick: stop(props.onUninstall)
|
|
1995
|
-
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
1995
|
+
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineMedium)),
|
|
1996
1996
|
(0, react.createElement)("span", {
|
|
1997
1997
|
key: "toggle",
|
|
1998
1998
|
className: resource_card_module_default.switchWrap,
|
|
@@ -7998,7 +7998,7 @@ function DetailRow(props) {
|
|
|
7998
7998
|
}, header[0], header[1], (0, react.createElement)("span", {
|
|
7999
7999
|
className: detail_rows_module_default.chevron,
|
|
8000
8000
|
"aria-hidden": true
|
|
8001
|
-
}, open ? (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
8001
|
+
}, open ? (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineMedium) : (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutlineMedium))), open ? (0, react.createElement)("div", { className: detail_rows_module_default.body }, props.children) : null);
|
|
8002
8002
|
}
|
|
8003
8003
|
//#endregion
|
|
8004
8004
|
//#region src/client/ui/last-change.ts
|
|
@@ -8357,7 +8357,7 @@ function SearchFilterToolbar(props) {
|
|
|
8357
8357
|
"data-panel-toolbar": true
|
|
8358
8358
|
}, (0, react.createElement)("label", { className: SearchFilterToolbar_module_default.search }, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Input, {
|
|
8359
8359
|
className: SearchFilterToolbar_module_default.searchInput,
|
|
8360
|
-
icon: (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
8360
|
+
icon: (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutlineMedium),
|
|
8361
8361
|
value: props.search,
|
|
8362
8362
|
placeholder: props.searchPlaceholder,
|
|
8363
8363
|
"aria-label": props.searchLabel,
|
|
@@ -34760,14 +34760,14 @@ function PanelActions(props) {
|
|
|
34760
34760
|
title: props.addLabel,
|
|
34761
34761
|
"aria-label": props.addLabel,
|
|
34762
34762
|
onClick: props.onAdd
|
|
34763
|
-
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
34763
|
+
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineMedium)), props.onRefresh === void 0 ? null : (0, react.createElement)("button", {
|
|
34764
34764
|
type: "button",
|
|
34765
34765
|
className: resource_card_module_default.iconBtn,
|
|
34766
34766
|
disabled: props.busy,
|
|
34767
34767
|
title: props.refreshLabel,
|
|
34768
34768
|
"aria-label": props.refreshLabel,
|
|
34769
34769
|
onClick: props.onRefresh
|
|
34770
|
-
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
34770
|
+
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineMedium)));
|
|
34771
34771
|
}
|
|
34772
34772
|
/** Shared heading geometry for all resource tabs. */
|
|
34773
34773
|
function PanelHeader(props) {
|
|
@@ -34788,7 +34788,7 @@ function BusyIndicator(props) {
|
|
|
34788
34788
|
}, (0, react.createElement)("span", {
|
|
34789
34789
|
className: `${panel_module_default.spinner} ${panel_module_default.spinning}`,
|
|
34790
34790
|
"aria-hidden": true
|
|
34791
|
-
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
34791
|
+
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconLoadingOutlineMedium)), props.label === void 0 ? null : (0, react.createElement)("span", { className: panel_module_default.busyLabel }, props.label));
|
|
34792
34792
|
}
|
|
34793
34793
|
/** Hold the shared mask through local refresh/validation after the HTTP mutation finishes. */
|
|
34794
34794
|
function BusyLease() {
|
|
@@ -35861,7 +35861,7 @@ function StringRows(props) {
|
|
|
35861
35861
|
title: props.addLabel,
|
|
35862
35862
|
"aria-label": `${props.t("panelAdd")} ${props.label}`,
|
|
35863
35863
|
onClick: () => change([...rows, ["", ""]])
|
|
35864
|
-
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
35864
|
+
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineMedium))), rows.length === 0 ? (0, react.createElement)("button", {
|
|
35865
35865
|
type: "button",
|
|
35866
35866
|
className: form_module_default.emptyRows,
|
|
35867
35867
|
onClick: () => change([["", ""]])
|
|
@@ -35891,7 +35891,7 @@ function StringRows(props) {
|
|
|
35891
35891
|
title: props.t("panelDelete"),
|
|
35892
35892
|
"aria-label": `${props.t("panelDelete")} ${props.label} ${index + 1}`,
|
|
35893
35893
|
onClick: () => change(rows.filter((_, i) => i !== index))
|
|
35894
|
-
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
35894
|
+
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineMedium)))), invalid ? (0, react.createElement)("span", {
|
|
35895
35895
|
role: "alert",
|
|
35896
35896
|
className: form_module_default.footerError
|
|
35897
35897
|
}, props.t("detailUniqueKeys")) : null, props.error === void 0 ? null : (0, react.createElement)("span", {
|
|
@@ -36633,7 +36633,7 @@ function McpCard({ entry, t, onClick, onToggle, onEdit }) {
|
|
|
36633
36633
|
event.stopPropagation();
|
|
36634
36634
|
onEdit();
|
|
36635
36635
|
}
|
|
36636
|
-
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
36636
|
+
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconEditOutlineMedium)) : null, (0, react.createElement)("span", {
|
|
36637
36637
|
className: resource_card_module_default.switchWrap,
|
|
36638
36638
|
onClick: (event) => event.stopPropagation()
|
|
36639
36639
|
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Switch, {
|
|
@@ -36765,8 +36765,8 @@ function McpDetailModal({ entry, t, credentials, backend, onClose, onRetry, onRe
|
|
|
36765
36765
|
onClick: () => {
|
|
36766
36766
|
run(false);
|
|
36767
36767
|
}
|
|
36768
|
-
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
36769
|
-
icon: (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
36768
|
+
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineMedium), t("mcpRetryConnection"))) : null), entry.kind === "direct" && !entry.managed ? (0, react.createElement)("div", { className: mcp_status_module_default.reasonBox }, (0, react.createElement)("p", { className: mcp_status_module_default.reasonText }, t("mcpDirectBoundary"))) : null, (0, react.createElement)("div", { className: panel_module_default.block }, (0, react.createElement)("div", { className: mcp_status_module_default.blockHeadRow }, (0, react.createElement)("h4", { className: panel_module_default.blockHead }, `${t("mcpTools")} (${tools.length})`), tools.length > TOOL_PAGE_SIZE ? (0, react.createElement)("label", { className: mcp_status_module_default.toolSearch }, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Input, {
|
|
36769
|
+
icon: (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutlineMedium),
|
|
36770
36770
|
value: toolSearch,
|
|
36771
36771
|
placeholder: t("mcpToolsSearch"),
|
|
36772
36772
|
"aria-label": t("mcpToolsSearch"),
|
|
@@ -37422,7 +37422,7 @@ function LspRow({ entry, t, onOpen, onToggle, onEdit }) {
|
|
|
37422
37422
|
event.stopPropagation();
|
|
37423
37423
|
onEdit();
|
|
37424
37424
|
}
|
|
37425
|
-
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
37425
|
+
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconEditOutlineMedium)), (0, react.createElement)("span", {
|
|
37426
37426
|
className: resource_card_module_default.switchWrap,
|
|
37427
37427
|
onClick: (event) => event.stopPropagation()
|
|
37428
37428
|
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Switch, {
|
|
@@ -37496,6 +37496,22 @@ function stateLabel(t, state) {
|
|
|
37496
37496
|
return t("lspDisabled");
|
|
37497
37497
|
}
|
|
37498
37498
|
//#endregion
|
|
37499
|
+
//#region src/model/command-names.ts
|
|
37500
|
+
/**
|
|
37501
|
+
* The call name a command resource registers under.
|
|
37502
|
+
*
|
|
37503
|
+
* A command resource may live at any depth under its `commands/` directory,
|
|
37504
|
+
* but the host's slash-command grammar accepts single-segment names only, so
|
|
37505
|
+
* registration flattens the path separators: `git/commit` registers as
|
|
37506
|
+
* `git-commit`. The user panel renders the same call name, so a card never
|
|
37507
|
+
* advertises a slash name the host cannot accept.
|
|
37508
|
+
* @module model/command-names
|
|
37509
|
+
*/
|
|
37510
|
+
/** Flatten a resource path into the single-segment name a slash command registers under. */
|
|
37511
|
+
function commandCallName(name) {
|
|
37512
|
+
return name.replaceAll("/", "-").replaceAll("\\", "-").toLowerCase();
|
|
37513
|
+
}
|
|
37514
|
+
//#endregion
|
|
37499
37515
|
//#region src/client/features/personas/RoleMetadataFields.tsx
|
|
37500
37516
|
/** Structured controls edit the same frontmatter as the raw Markdown editor. */
|
|
37501
37517
|
function RoleMetadataFields(props) {
|
|
@@ -37651,7 +37667,7 @@ function UserEntryDetailModal(props) {
|
|
|
37651
37667
|
const [open, setOpen] = (0, react.useState)(false);
|
|
37652
37668
|
const updated = entry.updatedAt === void 0 || entry.updatedAt === null ? null : lastChangeLabel(t, entry.updatedAt);
|
|
37653
37669
|
const provenance = entry.origin === "user" ? t("panelSourceUser") : t("panelSourcePlugin");
|
|
37654
|
-
const title = kind === "commands" ? `/${entry.name}` : entry.name;
|
|
37670
|
+
const title = kind === "commands" ? `/${commandCallName(entry.name)}` : entry.name;
|
|
37655
37671
|
const docName = kind === "skills" ? "SKILL.md" : `${entry.name}.md`;
|
|
37656
37672
|
const metaPairs = Object.entries(entry.metadata).filter(([key]) => !HIDDEN_META.has(key));
|
|
37657
37673
|
return (0, react.createElement)(DetailModal, {
|
|
@@ -37955,7 +37971,7 @@ function UserPanelSurface(props) {
|
|
|
37955
37971
|
*/
|
|
37956
37972
|
function UserEntryRow(props) {
|
|
37957
37973
|
const { entry, t } = props;
|
|
37958
|
-
const title = props.kind === "commands" ? `/${entry.name}` : entry.name;
|
|
37974
|
+
const title = props.kind === "commands" ? `/${commandCallName(entry.name)}` : entry.name;
|
|
37959
37975
|
const mono = props.kind === "commands";
|
|
37960
37976
|
const locked = props.busy || entry.metadata["validationError"] !== void 0;
|
|
37961
37977
|
const stop = (callback) => (event) => {
|
|
@@ -37983,14 +37999,14 @@ function UserEntryRow(props) {
|
|
|
37983
37999
|
disabled: props.busy,
|
|
37984
38000
|
title: t("panelEditTitle"),
|
|
37985
38001
|
onClick: stop(props.onEdit)
|
|
37986
|
-
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
38002
|
+
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconEditOutlineMedium)), (0, react.createElement)("button", {
|
|
37987
38003
|
type: "button",
|
|
37988
38004
|
className: `${resource_card_module_default.iconBtn} ${resource_card_module_default.iconBtnDanger} ${resource_card_module_default.revealOnHover}`,
|
|
37989
38005
|
"aria-label": t("panelDelete"),
|
|
37990
38006
|
disabled: props.busy,
|
|
37991
38007
|
title: t("panelDelete"),
|
|
37992
38008
|
onClick: stop(props.onDelete)
|
|
37993
|
-
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
38009
|
+
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineMedium)), (0, react.createElement)("span", {
|
|
37994
38010
|
className: resource_card_module_default.switchWrap,
|
|
37995
38011
|
onClick: (event) => event.stopPropagation()
|
|
37996
38012
|
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Switch, {
|
|
@@ -38194,7 +38210,7 @@ function McpPluginCard(props) {
|
|
|
38194
38210
|
onClick: () => {
|
|
38195
38211
|
setOpen((current) => !current);
|
|
38196
38212
|
}
|
|
38197
|
-
}, (0, react.createElement)("div", { className: market_module_default.pluginCardText }, (0, react.createElement)("div", { className: market_module_default.pluginCardTitle }, t("nav")), (0, react.createElement)("div", { className: market_module_default.pluginCardDesc }, t("marketCardDesc"))), state.dirty ? (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Tag, { tone: "neutral" }, t("settingUnsaved")) : null, (0, react.createElement)("span", { className: open ? `${market_module_default.pluginChevron} ${market_module_default.pluginChevronOpen}` : market_module_default.pluginChevron }, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.
|
|
38213
|
+
}, (0, react.createElement)("div", { className: market_module_default.pluginCardText }, (0, react.createElement)("div", { className: market_module_default.pluginCardTitle }, t("nav")), (0, react.createElement)("div", { className: market_module_default.pluginCardDesc }, t("marketCardDesc"))), state.dirty ? (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Tag, { tone: "neutral" }, t("settingUnsaved")) : null, (0, react.createElement)("span", { className: open ? `${market_module_default.pluginChevron} ${market_module_default.pluginChevronOpen}` : market_module_default.pluginChevron }, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineMedium))), open ? (0, react.createElement)("div", { className: market_module_default.pluginCardBody }, state.writable ? null : (0, react.createElement)("p", {
|
|
38198
38214
|
className: market_module_default.pluginCardReadonly,
|
|
38199
38215
|
role: "status"
|
|
38200
38216
|
}, t("mcpCardReadonly")), SWITCH_FIELDS.map((field) => (0, react.createElement)(SwitchRow, {
|
|
@@ -38287,7 +38303,7 @@ var MarketPluginCardController = class {
|
|
|
38287
38303
|
failed = false;
|
|
38288
38304
|
disposed = false;
|
|
38289
38305
|
/**
|
|
38290
|
-
* @param scope - the
|
|
38306
|
+
* @param scope - the host configuration form for the market namespace.
|
|
38291
38307
|
* @param probe - reads the live host-client and region state from the market API.
|
|
38292
38308
|
*/
|
|
38293
38309
|
constructor(scope, probeSource) {
|
|
@@ -38791,20 +38807,24 @@ function apply(ctx) {
|
|
|
38791
38807
|
isSettingsSurfaceAvailable: () => settingsSurfaceAvailable,
|
|
38792
38808
|
subscribeLocale: ctx.locale.subscribe === void 0 ? void 0 : (listener) => ctx.locale.subscribe(listener)
|
|
38793
38809
|
}), "dsh-agent-plugins-market: legacy page mode");
|
|
38794
|
-
ctx.inject?.(["
|
|
38795
|
-
const service = scoped.
|
|
38810
|
+
ctx.inject?.(["configForms"], (scoped) => {
|
|
38811
|
+
const service = scoped.configForms;
|
|
38796
38812
|
const slots = scoped.slots;
|
|
38797
38813
|
if (service === void 0 || slots === void 0) return;
|
|
38798
|
-
|
|
38799
|
-
|
|
38814
|
+
let card;
|
|
38815
|
+
service.whileServed([NS], () => {
|
|
38816
|
+
card = new MarketPluginCardController(service.get(NS), fetchMcpBackend);
|
|
38800
38817
|
const dispose = slots.register({
|
|
38801
|
-
name: "
|
|
38802
|
-
|
|
38818
|
+
name: "plugins.item",
|
|
38819
|
+
id: NS,
|
|
38820
|
+
order: 50,
|
|
38821
|
+
label: () => t("nav"),
|
|
38803
38822
|
locale: NS,
|
|
38804
38823
|
inject: () => card.inject()
|
|
38805
38824
|
}, McpPluginCard);
|
|
38806
38825
|
return () => {
|
|
38807
|
-
card
|
|
38826
|
+
card?.dispose();
|
|
38827
|
+
card = void 0;
|
|
38808
38828
|
if (typeof dispose === "function") dispose();
|
|
38809
38829
|
};
|
|
38810
38830
|
});
|