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.
Files changed (36) hide show
  1. package/README.md +11 -3
  2. package/README.zh.md +11 -3
  3. package/client/client.js +47 -27
  4. package/client/client.js.map +1 -1
  5. package/lib/application/catalog.js +9 -2
  6. package/lib/catalog/component-files.js +3 -1
  7. package/lib/catalog/native-project.js +1 -1
  8. package/lib/catalog/project-config.js +0 -2
  9. package/lib/catalog/project-hooks.js +12 -7
  10. package/lib/catalog/surfaces.js +17 -10
  11. package/lib/model/command-names.js +14 -0
  12. package/lib/model/layouts.js +1 -0
  13. package/lib/runtime/commands-mounts.js +3 -2
  14. package/lib/runtime/hooks-mounts.js +7 -4
  15. package/lib/runtime/mcp-direct-config.js +18 -9
  16. package/lib/runtime/plugin-message-source.js +4 -0
  17. package/lib/runtime/project-runtime.js +10 -8
  18. package/lib/runtime/user-commands.js +23 -8
  19. package/lib/runtime/user-hooks.js +102 -0
  20. package/lib/runtime/user-panels.js +34 -22
  21. package/lib/runtime/user-store.js +81 -19
  22. package/lib/types/catalog/component-files.d.ts +1 -0
  23. package/lib/types/catalog/project-hooks.d.ts +15 -2
  24. package/lib/types/catalog/surfaces.d.ts +6 -4
  25. package/lib/types/contracts/market.d.ts +5 -1
  26. package/lib/types/model/command-names.d.ts +12 -0
  27. package/lib/types/model/layouts.d.ts +1 -0
  28. package/lib/types/model/types.d.ts +2 -1
  29. package/lib/types/runtime/mcp-direct-config.d.ts +1 -5
  30. package/lib/types/runtime/plugin-message-source.d.ts +24 -0
  31. package/lib/types/runtime/user-commands.d.ts +5 -2
  32. package/lib/types/runtime/user-hooks.d.ts +22 -0
  33. package/lib/types/runtime/user-panels.d.ts +35 -15
  34. package/lib/types/runtime/user-store.d.ts +27 -10
  35. package/package.json +32 -28
  36. 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 plugin marketplace and agent capability workspace for [DeepSeek Harness (DSH)](https://github.com/deepseek-ai/deepseek-harness).**
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` files. A conformant agent-plugins package is the exception: skills come from one level of `skills/` subdirectories, exactly as its specification requires.
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
- **[DeepSeek Harness(DSH)](https://github.com/deepseek-ai/deepseek-harness)的插件市场与 Agent 能力管理工作区。**
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 文件,工作区里新增的 MCP 与 LSP 服务分别保存在 `~/.agents/mcp.json` 与 `~/.agents/lsp.json`。项目原生资源继续保留在项目中。路径和优先级见[存储与发现](docs/user/usage.zh.md#存储与发现)。
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` 文件。合规的 agent-plugins 套件是例外:技能只来自 `skills/` 一层子目录,与其规范一致。
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.IconLoadingOutline16, { 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", {
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.IconRefreshOutline16)),
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.IconTrashOutline16)),
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.IconChevronDownOutline14) : (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutline14))), open ? (0, react.createElement)("div", { className: detail_rows_module_default.body }, props.children) : null);
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.IconSearchOutline16),
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.IconPlusOutline16)), props.onRefresh === void 0 ? null : (0, react.createElement)("button", {
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.IconRefreshOutline16)));
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.IconLoadingOutline16)), props.label === void 0 ? null : (0, react.createElement)("span", { className: panel_module_default.busyLabel }, props.label));
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.IconPlusOutline16))), rows.length === 0 ? (0, react.createElement)("button", {
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.IconTrashOutline16)))), invalid ? (0, react.createElement)("span", {
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.IconEditOutline16)) : null, (0, react.createElement)("span", {
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.IconRefreshOutline16), 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.IconSearchOutline16),
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.IconEditOutline16)), (0, react.createElement)("span", {
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.IconEditOutline16)), (0, react.createElement)("button", {
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.IconTrashOutline16)), (0, react.createElement)("span", {
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.IconChevronDownOutline14, { size: 14 }))), open ? (0, react.createElement)("div", { className: market_module_default.pluginCardBody }, state.writable ? null : (0, react.createElement)("p", {
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 bound settings scope for the market namespace.
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?.(["settingsScope"], (scoped) => {
38795
- const service = scoped.settingsScope;
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
- slots.inject("settings.plugin.item", () => {
38799
- const card = new MarketPluginCardController(service.bind({ namespace: NS }), fetchMcpBackend);
38814
+ let card;
38815
+ service.whileServed([NS], () => {
38816
+ card = new MarketPluginCardController(service.get(NS), fetchMcpBackend);
38800
38817
  const dispose = slots.register({
38801
- name: "settings.plugin.item",
38802
- key: NS,
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.dispose();
38826
+ card?.dispose();
38827
+ card = void 0;
38808
38828
  if (typeof dispose === "function") dispose();
38809
38829
  };
38810
38830
  });