@sparkelf/dsh-client-ui-skill-center 0.2.1-alpha.3 → 0.2.1-alpha.30
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 +4 -3
- package/README.zh.md +4 -3
- package/lib/client.js +275 -92
- package/lib/index.js +179 -22
- package/lib/types/client/api.d.ts +34 -1
- package/lib/types/client/locales.d.ts +10 -2
- package/lib/types/client/slot-contract.d.ts +7 -4
- package/lib/types/index.d.ts +32 -1
- package/lib/types/translations.d.ts +50 -0
- package/package.json +42 -42
- package/LICENSE +0 -21
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/plus/ui-skill-center/README.md
|
|
5
|
-
README.md:
|
|
6
|
-
README.zh.md:
|
|
5
|
+
README.md: ffac1f7d3aeb0e73c23f99b728b65f5a3e776884
|
|
6
|
+
README.zh.md: 70e530cb1f95d6b365358f8fb96a514ab5379770
|
package/README.md
CHANGED
|
@@ -14,7 +14,8 @@ A skill center for the dsh Web sidebar: browses loaded skills grouped by source,
|
|
|
14
14
|
## What it does
|
|
15
15
|
|
|
16
16
|
- **Sidebar entry** "Skill Center" opens a panel, registered through the official `sidebar.panellist` slot and the keyed `main` page slot — the same slots the Plugins panel uses, so the shell owns the row, label, and selected state.
|
|
17
|
-
- **Skills list**: skills grouped by discovery source (bundled / runtime / `~/.agents/skills` / `~/.dsh/skills` / project `.agents/skills` / project `.dsh/skills` / custom roots),
|
|
17
|
+
- **Skills list**: skills grouped by discovery source (bundled / runtime / `~/.agents/skills` / `~/.dsh/skills` / project `.agents/skills` / project `.dsh/skills` / custom roots). A card carries the skill's summary — its translated one when a translation sits beside the skill, otherwise the registry description — and a search box filters by name, description, summary, or when-to-use.
|
|
18
|
+
- **Details**: a card opens the skill's own `SKILL.md` body in a scrolling block, under the metadata row. The body is read when the dialog opens, so a long skill costs nothing until it is asked for.
|
|
18
19
|
- **Enable / disable**: rewrites `disable-model-invocation` in the skill's YAML frontmatter. The field is edited in place rather than re-serialized, so comments, key order, and the body survive.
|
|
19
20
|
- **Create**: writes a standard `SKILL.md` under the user or project root.
|
|
20
21
|
- **Delete**: moves the skill into a `.trash` sibling directory, where it can be restored.
|
|
@@ -33,7 +34,7 @@ A skill center for the dsh Web sidebar: browses loaded skills grouped by source,
|
|
|
33
34
|
|
|
34
35
|
Reading goes through the official `ctx.skills` registry, so the catalog and its hot reload are the harness's rather than a second scanner's. The registry's summaries deliberately omit file paths — they are invocation-neutral metadata — so a write resolves the path through `ctx.skills.get()` when an action actually needs to touch a file. `collect()` caches the catalog those calls share, so the resolve is not a second scan.
|
|
35
36
|
|
|
36
|
-
The three writes have no official equivalent; the registry is read-only.
|
|
37
|
+
The three writes have no official equivalent; the registry is read-only. The content route resolves the file the panel listed first, then through `ctx.skills.get()`, then through the configured `translationRoot`: a bundled skill serves its body from inside an installed package, where the registry reports a path or a provider raises, so one source is never the only answer.
|
|
37
38
|
|
|
38
39
|
Every colour, border, and label weight comes from the shared alias tokens (`--dsw-alias-*`), and the sidebar glyph is `IconSkillOutline16` from `@deepseek-ai/dsh-client-ui-primitives`, so the panel and its row match the official panels beside them.
|
|
39
40
|
|
|
@@ -54,7 +55,7 @@ None; no string this package owns reaches a model request, so a request's cachea
|
|
|
54
55
|
No runtime invariant companion is published. The package owns no durable package-local state: the route handlers read the skill registry and write skill files, and every observable outcome is covered by the route tests.
|
|
55
56
|
|
|
56
57
|
- **Deletion refuses a symlinked skill**: a skill discovered through a symlink has no single owning directory to move, so the delete action is withheld for it.
|
|
57
|
-
- **The list omits file paths**:
|
|
58
|
+
- **The list omits file paths**: a registry-served row has no path, so the panel can neither offer its deletion nor read its body by path; whether either applies is known only when the action is attempted.
|
|
58
59
|
- **Grouping follows the discovery source label, not the file path**: a provider that reports an unrecognized source lands in the custom group.
|
|
59
60
|
|
|
60
61
|
<a id="dev-note"></a>
|
package/README.zh.md
CHANGED
|
@@ -16,7 +16,8 @@ dsh Web 侧边栏的技能中心:按来源分组浏览已加载的技能、启
|
|
|
16
16
|
## 功能
|
|
17
17
|
|
|
18
18
|
- **侧边栏入口**「技能中心」打开一个面板,它通过官方 `sidebar.panellist` 槽位与键控的 `main` 页面槽位注册 —— 与「插件」面板用的是同一批槽位,因此行、标签与选中态由外壳负责。
|
|
19
|
-
- **技能列表**:按发现来源分组(系统内置 / 运行时 / `~/.agents/skills` / `~/.dsh/skills` / 项目 `.agents/skills` / 项目 `.dsh/skills` /
|
|
19
|
+
- **技能列表**:按发现来源分组(系统内置 / 运行时 / `~/.agents/skills` / `~/.dsh/skills` / 项目 `.agents/skills` / 项目 `.dsh/skills` / 自定义目录)。卡片只带一句简介 —— 技能旁有翻译时用译文,否则用注册表的描述 —— 搜索框按名称、描述、简介或何时使用过滤。
|
|
20
|
+
- **详情**:卡片打开后,在元数据行下方以滚动区块展示该技能自己的 `SKILL.md` 正文。正文在弹窗打开时才读取,因此长技能在没人点开前不产生任何开销。
|
|
20
21
|
- **启用 / 停用**:改写技能 YAML 前置块里的 `disable-model-invocation`。该字段是就地编辑而非重新序列化,因此注释、键顺序与正文都原样保留。
|
|
21
22
|
- **新建**:在用户级或项目级根目录下写入一个标准的 `SKILL.md`。
|
|
22
23
|
- **删除**:把技能移入同级的 `.trash` 目录,可从中恢复。
|
|
@@ -37,7 +38,7 @@ dsh Web 侧边栏的技能中心:按来源分组浏览已加载的技能、启
|
|
|
37
38
|
|
|
38
39
|
读取走官方的 `ctx.skills` 注册表,因此目录与其热更新属于 harness 本身,而不是第二套扫描器。注册表的摘要有意省略文件路径 —— 它们是调用无关元数据 —— 所以写操作在真正需要触碰文件时通过 `ctx.skills.get()` 解析路径。这些调用共享的目录由 `collect()` 缓存,因此该解析不是第二次全量扫描。
|
|
39
40
|
|
|
40
|
-
|
|
41
|
+
三个写操作在官方没有等价物;注册表是只读的。正文路由先解析面板列出的文件,再走 `ctx.skills.get()`,最后走配置的 `translationRoot`:内置技能的正文安装在已安装的包内,注册表要么报告路径、要么提供者抛错,因此任何单一来源都不能是唯一答案。
|
|
41
42
|
|
|
42
43
|
每一个颜色、边框与标签字重都来自共享别名 token(`--dsw-alias-*`),侧边栏图标是 `@deepseek-ai/dsh-client-ui-primitives` 的 `IconSkillOutline16`,因此面板与其行与旁边的官方面板一致。
|
|
43
44
|
|
|
@@ -61,7 +62,7 @@ host 半边挂载 `/api/dsh-skill-center` 路由族;client 半边注册侧边
|
|
|
61
62
|
No runtime invariant companion is published. 本包不拥有任何持久化的包内状态:路由处理器读取技能注册表并写入技能文件,每一个可观察结果都由路由测试覆盖。
|
|
62
63
|
|
|
63
64
|
- **删除会拒绝符号链接的技能**:通过符号链接发现的技能没有唯一归属目录可移动,因此对它不提供删除操作。
|
|
64
|
-
-
|
|
65
|
+
- **列表省略文件路径**:注册表提供的行没有路径,因此面板既无法为它提供删除,也无法按路径读取它的正文;这两者是否适用,只有真正执行该操作时才知道。
|
|
65
66
|
- **分组跟随发现来源标签,而不是文件路径**:报告了无法识别的来源的提供者会落到自定义分组。
|
|
66
67
|
|
|
67
68
|
<a id="dev-note"></a>
|
package/lib/client.js
CHANGED
|
@@ -8,7 +8,7 @@ window.__ModuleLoader__.load({
|
|
|
8
8
|
let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
9
9
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
10
10
|
//#region \0dsh-css:/root/projects/deepseek-harness-plus/packages/plus/ui-skill-center/src/client/SkillCenterPage.module.css.mjs
|
|
11
|
-
const css = ".DGiSta_page{box-sizing:border-box;height:100%;color:var(--dsw-alias-label-primary);flex-direction:column;align-items:center;gap:
|
|
11
|
+
const css = ".DGiSta_page{box-sizing:border-box;height:100%;color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);flex-direction:column;align-items:center;gap:16px;padding:24px clamp(24px,4vw,40px) 40px;display:flex;overflow:auto}.DGiSta_page>*{width:100%;max-width:960px}.DGiSta_pageHead{justify-content:space-between;align-items:center;gap:16px;display:flex}.DGiSta_pageTitle{margin:0;font-size:20px;font-weight:500;line-height:28px}.DGiSta_toolbar{justify-content:flex-end;align-items:center;gap:16px;display:flex}.DGiSta_iconButton{width:28px;height:28px;color:var(--dsw-alias-label-caption);cursor:pointer;background:0 0;border:0;border-radius:28px;justify-content:center;align-items:center;display:inline-flex}.DGiSta_iconButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}.DGiSta_iconButton:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}.DGiSta_iconWrap{display:inline-flex}.DGiSta_search{width:100%}.DGiSta_group{min-width:0}.DGiSta_groupTitle{align-items:baseline;gap:8px;margin:0 0 8px;font-size:14px;font-weight:500;line-height:20px;display:flex}.DGiSta_groupCount{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400}.DGiSta_cards{grid-template-columns:repeat(auto-fill,minmax(272px,1fr));align-items:start;gap:12px;margin:0;padding:0;list-style:none;display:grid}.DGiSta_card{border:.5px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:10px;flex-direction:column;align-self:start;gap:10px;min-width:0;padding:12px;display:flex}.DGiSta_cardHead{align-items:center;gap:10px;min-width:0;display:flex}.DGiSta_cardIcon{corner-shape:round;background:var(--dsw-alias-bg-layer-2);width:28px;height:28px;color:var(--dsw-alias-label-secondary);border-radius:50%;flex:none;place-items:center;display:grid}.DGiSta_cardForeign{opacity:.72}.DGiSta_workspaceBadge{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);vertical-align:middle;border-radius:4px;margin-left:8px;padding:1px 6px;font-size:11px;font-weight:400;line-height:16px}.DGiSta_cardTitle{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:600;line-height:20px;overflow:hidden}.DGiSta_cardTitleRow{flex:1;align-items:center;gap:8px;min-width:0;display:flex}.DGiSta_cardMarks{flex-wrap:wrap;gap:6px;margin-top:2px;display:flex}.DGiSta_mark{color:var(--dsw-alias-state-business-primary);white-space:nowrap;background:#ecf1fc;border:0;border-radius:4px;padding:2px 7px;font-size:11px;font-weight:500;line-height:16px}.DGiSta_markOff,.DGiSta_markDanger{background:#ecf1fc}.DGiSta_detail{flex-direction:column;gap:12px;margin:0;display:flex}.DGiSta_cardActions{flex:none;align-items:center;gap:4px;display:inline-flex}.DGiSta_detailRow{flex-direction:column;gap:2px;display:flex}.DGiSta_detailLabel{color:var(--dsw-alias-label-caption);font-size:11px;line-height:16px}.DGiSta_detailValue{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}.DGiSta_cardEnd{flex:none;justify-content:space-between;align-items:center;gap:8px;margin-top:auto;padding-top:2px;display:flex}.DGiSta_cardBody{flex-direction:column;gap:6px;min-width:0;display:flex}.DGiSta_switch{background:var(--dsw-alias-border-l3);cursor:pointer;border:none;border-radius:10px;width:36px;height:20px;transition:background .12s;position:relative}.DGiSta_switch:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}.DGiSta_switchOn{background:var(--dsw-alias-state-success-primary)}.DGiSta_switch:after{content:\"\";corner-shape:round;background:var(--dsw-alias-bg-layer-1);border-radius:50%;width:16px;height:16px;transition:transform .12s;position:absolute;top:2px;left:2px}.DGiSta_switchOn:after{transform:translate(16px)}.DGiSta_dialog{width:min(560px,100%)}.DGiSta_form{flex-direction:column;gap:12px;display:flex}.DGiSta_field{flex-direction:column;gap:4px;display:flex}.DGiSta_fieldLabel{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px}.DGiSta_input{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);height:32px;color:var(--dsw-alias-label-primary);background:0 0;border-radius:8px;padding:0 10px;font-size:13px}.DGiSta_textarea{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);min-height:80px;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-markdown-code-block-small);resize:vertical;background:0 0;border-radius:8px;padding:8px 10px;font-size:12px}.DGiSta_status{text-align:center;color:var(--dsw-alias-label-tertiary);padding:32px 0;font-size:13px}.DGiSta_statusError{color:var(--dsw-alias-state-error-primary)}.DGiSta_cardSummary{color:var(--dsw-alias-label-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.DGiSta_body{flex-direction:column;gap:4px;min-width:0;margin-top:16px;display:flex}.DGiSta_bodyLabel{color:var(--dsw-alias-label-caption);margin:0;font-size:11px;font-weight:500;line-height:16px}.DGiSta_bodyPre{background:var(--dsw-alias-markdown-code-block);max-height:46vh;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-markdown-code-block-small-font-family);font-size:var(--dsw-font-markdown-code-block-small-font-size);line-height:var(--dsw-font-markdown-code-block-small-line-height);white-space:pre-wrap;overflow-wrap:anywhere;--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:8px;margin:0;padding:12px;overflow:auto}.DGiSta_bodyStatus{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:18px}.DGiSta_bodyError{color:var(--dsw-alias-state-error-primary);}.DGiSta_progressRow{align-items:center;gap:8px;margin-bottom:12px;display:flex}.DGiSta_progressLabel{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-size:12px;line-height:18px}.DGiSta_progressTrack{background:var(--dsw-alias-border-l2);border-radius:2px;flex:1;height:4px;overflow:hidden}.DGiSta_progressFill{background:var(--dsw-alias-label-primary);border-radius:2px;height:100%;transition:width .2s;display:block}.DGiSta_progressCount{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:18px}";
|
|
12
12
|
const tagId = "@sparkelf/dsh-client-ui-skill-center/SkillCenterPage.module.css";
|
|
13
13
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
14
14
|
const tag = document.createElement("style");
|
|
@@ -18,25 +18,33 @@ window.__ModuleLoader__.load({
|
|
|
18
18
|
document.head.appendChild(tag);
|
|
19
19
|
}
|
|
20
20
|
var SkillCenterPage_module_css_default = {
|
|
21
|
-
"
|
|
21
|
+
"body": "DGiSta_body",
|
|
22
|
+
"bodyError": "DGiSta_bodyError",
|
|
23
|
+
"bodyLabel": "DGiSta_bodyLabel",
|
|
24
|
+
"bodyPre": "DGiSta_bodyPre",
|
|
25
|
+
"bodyStatus": "DGiSta_bodyStatus",
|
|
22
26
|
"card": "DGiSta_card",
|
|
23
|
-
"
|
|
27
|
+
"cardActions": "DGiSta_cardActions",
|
|
28
|
+
"cardBody": "DGiSta_cardBody",
|
|
24
29
|
"cardEnd": "DGiSta_cardEnd",
|
|
25
30
|
"cardForeign": "DGiSta_cardForeign",
|
|
26
31
|
"cardHead": "DGiSta_cardHead",
|
|
27
32
|
"cardIcon": "DGiSta_cardIcon",
|
|
28
|
-
"cardMain": "DGiSta_cardMain",
|
|
29
33
|
"cardMarks": "DGiSta_cardMarks",
|
|
34
|
+
"cardSummary": "DGiSta_cardSummary",
|
|
30
35
|
"cardTitle": "DGiSta_cardTitle",
|
|
31
|
-
"
|
|
36
|
+
"cardTitleRow": "DGiSta_cardTitleRow",
|
|
32
37
|
"cards": "DGiSta_cards",
|
|
38
|
+
"detail": "DGiSta_detail",
|
|
39
|
+
"detailLabel": "DGiSta_detailLabel",
|
|
40
|
+
"detailRow": "DGiSta_detailRow",
|
|
41
|
+
"detailValue": "DGiSta_detailValue",
|
|
33
42
|
"dialog": "DGiSta_dialog",
|
|
34
43
|
"field": "DGiSta_field",
|
|
35
44
|
"fieldLabel": "DGiSta_fieldLabel",
|
|
36
45
|
"form": "DGiSta_form",
|
|
37
46
|
"group": "DGiSta_group",
|
|
38
47
|
"groupCount": "DGiSta_groupCount",
|
|
39
|
-
"groupHint": "DGiSta_groupHint",
|
|
40
48
|
"groupTitle": "DGiSta_groupTitle",
|
|
41
49
|
"iconButton": "DGiSta_iconButton",
|
|
42
50
|
"iconWrap": "DGiSta_iconWrap",
|
|
@@ -44,11 +52,14 @@ window.__ModuleLoader__.load({
|
|
|
44
52
|
"mark": "DGiSta_mark",
|
|
45
53
|
"markDanger": "DGiSta_markDanger",
|
|
46
54
|
"markOff": "DGiSta_markOff",
|
|
47
|
-
"markOn": "DGiSta_markOn",
|
|
48
55
|
"page": "DGiSta_page",
|
|
49
56
|
"pageHead": "DGiSta_pageHead",
|
|
50
|
-
"pageIntro": "DGiSta_pageIntro",
|
|
51
57
|
"pageTitle": "DGiSta_pageTitle",
|
|
58
|
+
"progressCount": "DGiSta_progressCount",
|
|
59
|
+
"progressFill": "DGiSta_progressFill",
|
|
60
|
+
"progressLabel": "DGiSta_progressLabel",
|
|
61
|
+
"progressRow": "DGiSta_progressRow",
|
|
62
|
+
"progressTrack": "DGiSta_progressTrack",
|
|
52
63
|
"search": "DGiSta_search",
|
|
53
64
|
"status": "DGiSta_status",
|
|
54
65
|
"statusError": "DGiSta_statusError",
|
|
@@ -71,7 +82,9 @@ window.__ModuleLoader__.load({
|
|
|
71
82
|
list: "/api/dsh-skill-center/list",
|
|
72
83
|
setEnabled: "/api/dsh-skill-center/set-enabled",
|
|
73
84
|
create: "/api/dsh-skill-center/create",
|
|
74
|
-
remove: "/api/dsh-skill-center/delete"
|
|
85
|
+
remove: "/api/dsh-skill-center/delete",
|
|
86
|
+
content: "/api/dsh-skill-center/content",
|
|
87
|
+
translationProgress: "/api/dsh-skill-center/translation-progress"
|
|
75
88
|
};
|
|
76
89
|
/** One thrown API error carrying the host's message. */
|
|
77
90
|
var ApiError = class extends Error {};
|
|
@@ -110,6 +123,27 @@ window.__ModuleLoader__.load({
|
|
|
110
123
|
}
|
|
111
124
|
});
|
|
112
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* One skill's instruction body, without the YAML frontmatter the card already
|
|
128
|
+
* shows as metadata.
|
|
129
|
+
*
|
|
130
|
+
* The path the list served travels back with the request: a row from another
|
|
131
|
+
* workspace is read from the file that was listed rather than from whatever the
|
|
132
|
+
* viewing workspace's registry resolves by name.
|
|
133
|
+
*/
|
|
134
|
+
async content(name, path, cwd) {
|
|
135
|
+
const params = new URLSearchParams({ name });
|
|
136
|
+
if (path !== void 0 && path !== "") params.set("path", path);
|
|
137
|
+
if (cwd !== void 0 && cwd !== "") params.set("cwd", cwd);
|
|
138
|
+
return this.request(API.content + "?" + params.toString());
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* The translated share of the skill set, or undefined when the host has not
|
|
142
|
+
* been told where the translations live (the route then answers `{}`).
|
|
143
|
+
*/
|
|
144
|
+
async translationProgress() {
|
|
145
|
+
return (await this.request(API.translationProgress)).progress;
|
|
146
|
+
}
|
|
113
147
|
async request(path, options = {}) {
|
|
114
148
|
const init = { method: options.method ?? "GET" };
|
|
115
149
|
if (options.body !== void 0) {
|
|
@@ -156,78 +190,183 @@ window.__ModuleLoader__.load({
|
|
|
156
190
|
});
|
|
157
191
|
}
|
|
158
192
|
/**
|
|
159
|
-
* One skill row.
|
|
160
|
-
* @param props - the entry,
|
|
193
|
+
* One skill row, with the dialog that shows the skill's own Markdown.
|
|
194
|
+
* @param props - the entry, the API client and viewing context its body is read
|
|
195
|
+
* with, its toggle, and its delete action.
|
|
161
196
|
* @returns the row.
|
|
162
197
|
*/
|
|
163
|
-
function SkillCard({ skill, t, onToggle, onDelete }) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
198
|
+
function SkillCard({ skill, api, cwd, t, onToggle, onDelete }) {
|
|
199
|
+
const [open, setOpen] = (0, react.useState)(false);
|
|
200
|
+
const [body, setBody] = (0, react.useState)({ kind: "loading" });
|
|
201
|
+
(0, react.useEffect)(() => {
|
|
202
|
+
if (!open) return;
|
|
203
|
+
let cancelled = false;
|
|
204
|
+
setBody({ kind: "loading" });
|
|
205
|
+
api.content(skill.name, skill.path, cwd).then((payload) => {
|
|
206
|
+
if (!cancelled) setBody({
|
|
207
|
+
kind: "ready",
|
|
208
|
+
content: payload.content
|
|
209
|
+
});
|
|
210
|
+
}).catch((error) => {
|
|
211
|
+
if (!cancelled) setBody({
|
|
212
|
+
kind: "failed",
|
|
213
|
+
message: error instanceof Error ? error.message : String(error)
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
return () => {
|
|
217
|
+
cancelled = true;
|
|
218
|
+
};
|
|
219
|
+
}, [
|
|
220
|
+
open,
|
|
221
|
+
api,
|
|
222
|
+
skill.name,
|
|
223
|
+
skill.path,
|
|
224
|
+
cwd
|
|
225
|
+
]);
|
|
226
|
+
const foreign = skill.isActiveWorkspace === false && skill.workspaceName !== void 0;
|
|
227
|
+
const details = [];
|
|
228
|
+
if (skill.whenToUse !== void 0) details.push({
|
|
229
|
+
key: "detail.whenToUse",
|
|
230
|
+
value: skill.whenToUse
|
|
231
|
+
});
|
|
232
|
+
details.push({
|
|
233
|
+
key: "detail.source",
|
|
234
|
+
value: skill.level
|
|
235
|
+
});
|
|
236
|
+
if (skill.provider !== void 0) details.push({
|
|
237
|
+
key: "detail.provider",
|
|
238
|
+
value: skill.provider
|
|
239
|
+
});
|
|
240
|
+
if (skill.path !== void 0) details.push({
|
|
241
|
+
key: "detail.path",
|
|
242
|
+
value: skill.path
|
|
243
|
+
});
|
|
244
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
|
|
245
|
+
className: foreign ? SkillCenterPage_module_css_default.card + " " + SkillCenterPage_module_css_default.cardForeign : SkillCenterPage_module_css_default.card,
|
|
246
|
+
children: [
|
|
247
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
248
|
+
className: SkillCenterPage_module_css_default.cardHead,
|
|
249
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
170
250
|
className: SkillCenterPage_module_css_default.cardIcon,
|
|
171
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSkillOutlineRegular, { size:
|
|
172
|
-
}),
|
|
173
|
-
|
|
174
|
-
|
|
251
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSkillOutlineRegular, { size: 16 })
|
|
252
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
253
|
+
className: SkillCenterPage_module_css_default.cardTitleRow,
|
|
254
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
255
|
+
className: SkillCenterPage_module_css_default.cardTitle,
|
|
256
|
+
children: skill.i18n?.title ?? skill.name
|
|
257
|
+
}), skill.workspaceName === void 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
258
|
+
className: SkillCenterPage_module_css_default.workspaceBadge,
|
|
259
|
+
children: skill.workspaceName
|
|
260
|
+
})]
|
|
261
|
+
})]
|
|
262
|
+
}),
|
|
263
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
264
|
+
className: SkillCenterPage_module_css_default.cardBody,
|
|
265
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
266
|
+
className: SkillCenterPage_module_css_default.cardSummary,
|
|
267
|
+
children: skill.i18n?.summary ?? skill.description
|
|
268
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
269
|
+
className: SkillCenterPage_module_css_default.cardMarks,
|
|
175
270
|
children: [
|
|
176
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
177
|
-
className: SkillCenterPage_module_css_default.
|
|
178
|
-
children:
|
|
179
|
-
className: SkillCenterPage_module_css_default.workspaceBadge,
|
|
180
|
-
children: skill.workspaceName
|
|
181
|
-
})]
|
|
182
|
-
}),
|
|
183
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
184
|
-
className: SkillCenterPage_module_css_default.cardDesc,
|
|
185
|
-
children: skill.description
|
|
271
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
272
|
+
className: skill.modelInvocable ? SkillCenterPage_module_css_default.mark + " " + SkillCenterPage_module_css_default.markOn : SkillCenterPage_module_css_default.mark + " " + SkillCenterPage_module_css_default.markOff,
|
|
273
|
+
children: t("skill.modelInvocable")
|
|
186
274
|
}),
|
|
187
|
-
|
|
188
|
-
className: SkillCenterPage_module_css_default.
|
|
189
|
-
children: skill.
|
|
275
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
276
|
+
className: skill.userInvocable ? SkillCenterPage_module_css_default.mark + " " + SkillCenterPage_module_css_default.markOn : SkillCenterPage_module_css_default.mark + " " + SkillCenterPage_module_css_default.markOff,
|
|
277
|
+
children: t("skill.userInvocable")
|
|
190
278
|
}),
|
|
191
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
192
|
-
className: SkillCenterPage_module_css_default.
|
|
193
|
-
children:
|
|
194
|
-
|
|
195
|
-
className: skill.modelInvocable ? SkillCenterPage_module_css_default.mark + " " + SkillCenterPage_module_css_default.markOn : SkillCenterPage_module_css_default.mark + " " + SkillCenterPage_module_css_default.markOff,
|
|
196
|
-
children: t("skill.modelInvocable")
|
|
197
|
-
}),
|
|
198
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
199
|
-
className: skill.userInvocable ? SkillCenterPage_module_css_default.mark + " " + SkillCenterPage_module_css_default.markOn : SkillCenterPage_module_css_default.mark + " " + SkillCenterPage_module_css_default.markOff,
|
|
200
|
-
children: t("skill.userInvocable")
|
|
201
|
-
}),
|
|
202
|
-
skill.linked === true ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
203
|
-
className: SkillCenterPage_module_css_default.mark + " " + SkillCenterPage_module_css_default.markDanger,
|
|
204
|
-
children: t("skill.linked")
|
|
205
|
-
}) : null
|
|
206
|
-
]
|
|
207
|
-
})
|
|
279
|
+
skill.linked === true ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
280
|
+
className: SkillCenterPage_module_css_default.mark + " " + SkillCenterPage_module_css_default.markDanger,
|
|
281
|
+
children: t("skill.linked")
|
|
282
|
+
}) : null
|
|
208
283
|
]
|
|
209
|
-
})
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
|
|
284
|
+
})]
|
|
285
|
+
}),
|
|
286
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
287
|
+
className: SkillCenterPage_module_css_default.cardEnd,
|
|
288
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
289
|
+
type: "button",
|
|
290
|
+
className: skill.modelInvocable ? SkillCenterPage_module_css_default.switch + " " + SkillCenterPage_module_css_default.switchOn : SkillCenterPage_module_css_default.switch,
|
|
291
|
+
"aria-label": skill.modelInvocable ? t("skill.disabled") : t("skill.enabled"),
|
|
292
|
+
"aria-pressed": skill.modelInvocable,
|
|
293
|
+
onClick: () => {
|
|
294
|
+
onToggle(skill, !skill.modelInvocable);
|
|
295
|
+
}
|
|
296
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
297
|
+
className: SkillCenterPage_module_css_default.cardActions,
|
|
298
|
+
children: [skill.path === void 0 || skill.linked === true ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
299
|
+
variant: "outline",
|
|
300
|
+
size: "sm",
|
|
223
301
|
onClick: () => {
|
|
224
302
|
onDelete(skill);
|
|
225
303
|
},
|
|
226
304
|
children: t("action.delete")
|
|
305
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
306
|
+
variant: "outline",
|
|
307
|
+
size: "sm",
|
|
308
|
+
onClick: () => {
|
|
309
|
+
setOpen(true);
|
|
310
|
+
},
|
|
311
|
+
children: t("action.showDetail")
|
|
227
312
|
})]
|
|
228
|
-
})
|
|
229
|
-
|
|
230
|
-
|
|
313
|
+
})]
|
|
314
|
+
}),
|
|
315
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
|
|
316
|
+
open,
|
|
317
|
+
onClose: () => {
|
|
318
|
+
setOpen(false);
|
|
319
|
+
},
|
|
320
|
+
title: skill.name,
|
|
321
|
+
closeLabel: t("action.close"),
|
|
322
|
+
className: SkillCenterPage_module_css_default.dialog,
|
|
323
|
+
footer: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
324
|
+
variant: "outline",
|
|
325
|
+
onClick: () => {
|
|
326
|
+
setOpen(false);
|
|
327
|
+
},
|
|
328
|
+
children: t("action.close")
|
|
329
|
+
}),
|
|
330
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("dl", {
|
|
331
|
+
className: SkillCenterPage_module_css_default.detail,
|
|
332
|
+
children: details.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
333
|
+
className: SkillCenterPage_module_css_default.detailRow,
|
|
334
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("dt", {
|
|
335
|
+
className: SkillCenterPage_module_css_default.detailLabel,
|
|
336
|
+
children: t(item.key)
|
|
337
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dd", {
|
|
338
|
+
className: SkillCenterPage_module_css_default.detailValue,
|
|
339
|
+
children: item.value
|
|
340
|
+
})]
|
|
341
|
+
}, item.key))
|
|
342
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
343
|
+
className: SkillCenterPage_module_css_default.body,
|
|
344
|
+
children: [
|
|
345
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
|
|
346
|
+
className: SkillCenterPage_module_css_default.bodyLabel,
|
|
347
|
+
children: t("detail.content")
|
|
348
|
+
}),
|
|
349
|
+
body.kind === "loading" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
350
|
+
className: SkillCenterPage_module_css_default.bodyStatus,
|
|
351
|
+
children: t("content.loading")
|
|
352
|
+
}) : null,
|
|
353
|
+
body.kind === "failed" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
|
|
354
|
+
className: SkillCenterPage_module_css_default.bodyError,
|
|
355
|
+
children: [
|
|
356
|
+
t("content.failed"),
|
|
357
|
+
": ",
|
|
358
|
+
body.message
|
|
359
|
+
]
|
|
360
|
+
}) : null,
|
|
361
|
+
body.kind === "ready" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("pre", {
|
|
362
|
+
className: SkillCenterPage_module_css_default.bodyPre,
|
|
363
|
+
"data-skill-body": skill.name,
|
|
364
|
+
children: body.content
|
|
365
|
+
}) : null
|
|
366
|
+
]
|
|
367
|
+
})]
|
|
368
|
+
})
|
|
369
|
+
]
|
|
231
370
|
});
|
|
232
371
|
}
|
|
233
372
|
/**
|
|
@@ -239,6 +378,7 @@ window.__ModuleLoader__.load({
|
|
|
239
378
|
const api = (0, react.useMemo)(() => new SkillApi(), []);
|
|
240
379
|
const [state, setState] = (0, react.useState)({ kind: "loading" });
|
|
241
380
|
const [query, setQuery] = (0, react.useState)("");
|
|
381
|
+
const [progress, setProgress] = (0, react.useState)(void 0);
|
|
242
382
|
const [creating, setCreating] = (0, react.useState)(false);
|
|
243
383
|
const [draft, setDraft] = (0, react.useState)({
|
|
244
384
|
name: "",
|
|
@@ -268,13 +408,22 @@ window.__ModuleLoader__.load({
|
|
|
268
408
|
(0, react.useEffect)(() => {
|
|
269
409
|
load();
|
|
270
410
|
}, [load]);
|
|
411
|
+
(0, react.useEffect)(() => {
|
|
412
|
+
let cancelled = false;
|
|
413
|
+
api.translationProgress().then((p) => {
|
|
414
|
+
if (!cancelled) setProgress(p);
|
|
415
|
+
}).catch(() => {});
|
|
416
|
+
return () => {
|
|
417
|
+
cancelled = true;
|
|
418
|
+
};
|
|
419
|
+
}, [api]);
|
|
271
420
|
const groups = (0, react.useMemo)(() => {
|
|
272
421
|
if (state.kind !== "ready") return [];
|
|
273
422
|
const q = query.trim().toLowerCase();
|
|
274
423
|
if (q === "") return state.payload.groups;
|
|
275
424
|
return state.payload.groups.map((g) => ({
|
|
276
425
|
...g,
|
|
277
|
-
skills: g.skills.filter((s) => s.name.toLowerCase().includes(q) || s.description.toLowerCase().includes(q) || (s.whenToUse ?? "").toLowerCase().includes(q))
|
|
426
|
+
skills: g.skills.filter((s) => s.name.toLowerCase().includes(q) || s.description.toLowerCase().includes(q) || (s.i18n?.title ?? "").toLowerCase().includes(q) || (s.i18n?.description ?? "").toLowerCase().includes(q) || (s.i18n?.summary ?? "").toLowerCase().includes(q) || (s.whenToUse ?? "").toLowerCase().includes(q))
|
|
278
427
|
})).filter((g) => g.skills.length > 0);
|
|
279
428
|
}, [state, query]);
|
|
280
429
|
const toggle = (0, react.useCallback)(async (skill, enabled) => {
|
|
@@ -349,13 +498,10 @@ window.__ModuleLoader__.load({
|
|
|
349
498
|
children: [
|
|
350
499
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
|
|
351
500
|
className: SkillCenterPage_module_css_default.pageHead,
|
|
352
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.
|
|
501
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h1", {
|
|
353
502
|
className: SkillCenterPage_module_css_default.pageTitle,
|
|
354
503
|
children: t("panel")
|
|
355
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.
|
|
356
|
-
className: SkillCenterPage_module_css_default.pageIntro,
|
|
357
|
-
children: t("panel.intro")
|
|
358
|
-
})] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
504
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
359
505
|
className: SkillCenterPage_module_css_default.toolbar,
|
|
360
506
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
361
507
|
type: "button",
|
|
@@ -461,14 +607,40 @@ window.__ModuleLoader__.load({
|
|
|
461
607
|
]
|
|
462
608
|
})
|
|
463
609
|
}),
|
|
464
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
610
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Input, {
|
|
465
611
|
className: SkillCenterPage_module_css_default.search,
|
|
612
|
+
icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutlineRegular, {}),
|
|
466
613
|
placeholder: t("search.placeholder"),
|
|
614
|
+
"aria-label": t("search.placeholder"),
|
|
467
615
|
value: query,
|
|
468
616
|
onChange: (e) => {
|
|
469
617
|
setQuery(e.target.value);
|
|
470
618
|
}
|
|
471
619
|
}),
|
|
620
|
+
progress === void 0 || progress.done >= progress.total ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
621
|
+
className: SkillCenterPage_module_css_default.progressRow,
|
|
622
|
+
children: [
|
|
623
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
624
|
+
className: SkillCenterPage_module_css_default.progressLabel,
|
|
625
|
+
children: t("translate.label")
|
|
626
|
+
}),
|
|
627
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
628
|
+
className: SkillCenterPage_module_css_default.progressTrack,
|
|
629
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
630
|
+
className: SkillCenterPage_module_css_default.progressFill,
|
|
631
|
+
style: { width: String(progress.total === 0 ? 0 : Math.round(progress.done / progress.total * 100)) + "%" }
|
|
632
|
+
})
|
|
633
|
+
}),
|
|
634
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
635
|
+
className: SkillCenterPage_module_css_default.progressCount,
|
|
636
|
+
children: [
|
|
637
|
+
progress.done,
|
|
638
|
+
" / ",
|
|
639
|
+
progress.total
|
|
640
|
+
]
|
|
641
|
+
})
|
|
642
|
+
]
|
|
643
|
+
}),
|
|
472
644
|
state.kind === "loading" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
473
645
|
className: SkillCenterPage_module_css_default.status,
|
|
474
646
|
children: t("state.loading")
|
|
@@ -493,21 +665,16 @@ window.__ModuleLoader__.load({
|
|
|
493
665
|
className: SkillCenterPage_module_css_default.group,
|
|
494
666
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h2", {
|
|
495
667
|
className: SkillCenterPage_module_css_default.groupTitle,
|
|
496
|
-
children: [
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
children: group.skills.length
|
|
501
|
-
}),
|
|
502
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
503
|
-
className: SkillCenterPage_module_css_default.groupHint,
|
|
504
|
-
children: group.hint
|
|
505
|
-
})
|
|
506
|
-
]
|
|
668
|
+
children: [group.title, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
669
|
+
className: SkillCenterPage_module_css_default.groupCount,
|
|
670
|
+
children: group.skills.length
|
|
671
|
+
})]
|
|
507
672
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
|
|
508
673
|
className: SkillCenterPage_module_css_default.cards,
|
|
509
674
|
children: group.skills.map((skill) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SkillCard, {
|
|
510
675
|
skill,
|
|
676
|
+
api,
|
|
677
|
+
cwd: state.kind === "ready" ? state.payload.cwd : scope,
|
|
511
678
|
t,
|
|
512
679
|
onToggle: (s, enabled) => {
|
|
513
680
|
toggle(s, enabled);
|
|
@@ -518,7 +685,7 @@ window.__ModuleLoader__.load({
|
|
|
518
685
|
}, group.key + ":" + skill.name))
|
|
519
686
|
})]
|
|
520
687
|
}, group.key)),
|
|
521
|
-
renderSlot("skill-center.section", {})
|
|
688
|
+
renderSlot("skill-center.section", { query })
|
|
522
689
|
]
|
|
523
690
|
});
|
|
524
691
|
}
|
|
@@ -537,18 +704,26 @@ window.__ModuleLoader__.load({
|
|
|
537
704
|
/** Simplified Chinese dictionary. */
|
|
538
705
|
const zh = {
|
|
539
706
|
"panel": "技能中心",
|
|
540
|
-
"panel.intro": "浏览已加载的技能,启用或停用模型调用",
|
|
541
707
|
"search.placeholder": "搜索技能…",
|
|
542
|
-
"search.clear": "清除搜索",
|
|
543
708
|
"search.noMatches": "无匹配技能",
|
|
544
709
|
"action.refresh": "刷新",
|
|
545
710
|
"action.create": "新建技能",
|
|
546
711
|
"action.delete": "删除",
|
|
712
|
+
"action.showDetail": "详情",
|
|
713
|
+
"action.close": "关闭",
|
|
714
|
+
"translate.label": "中文翻译",
|
|
715
|
+
"detail.whenToUse": "何时使用",
|
|
716
|
+
"detail.source": "来源",
|
|
717
|
+
"detail.provider": "提供方",
|
|
718
|
+
"detail.path": "位置",
|
|
719
|
+
"detail.content": "技能内容",
|
|
547
720
|
"action.cancel": "取消",
|
|
548
721
|
"action.confirm": "确定",
|
|
549
722
|
"state.loading": "正在加载技能…",
|
|
550
723
|
"state.empty": "该分组暂无技能",
|
|
551
724
|
"state.failed": "技能列表加载失败",
|
|
725
|
+
"content.loading": "正在读取技能正文…",
|
|
726
|
+
"content.failed": "技能正文加载失败",
|
|
552
727
|
"skill.enabled": "已启用",
|
|
553
728
|
"skill.disabled": "已停用",
|
|
554
729
|
"skill.modelInvocable": "模型可调用",
|
|
@@ -567,18 +742,26 @@ window.__ModuleLoader__.load({
|
|
|
567
742
|
/** English dictionary. */
|
|
568
743
|
const en = {
|
|
569
744
|
"panel": "Skill Center",
|
|
570
|
-
"panel.intro": "Browse loaded skills and control model invocation",
|
|
571
745
|
"search.placeholder": "Search skills…",
|
|
572
|
-
"search.clear": "Clear search",
|
|
573
746
|
"search.noMatches": "No matching skills",
|
|
574
747
|
"action.refresh": "Refresh",
|
|
575
748
|
"action.create": "New skill",
|
|
576
749
|
"action.delete": "Delete",
|
|
750
|
+
"action.showDetail": "Details",
|
|
751
|
+
"action.close": "Close",
|
|
752
|
+
"translate.label": "Chinese",
|
|
753
|
+
"detail.whenToUse": "When to use",
|
|
754
|
+
"detail.source": "Source",
|
|
755
|
+
"detail.provider": "Provider",
|
|
756
|
+
"detail.path": "Location",
|
|
757
|
+
"detail.content": "Skill content",
|
|
577
758
|
"action.cancel": "Cancel",
|
|
578
759
|
"action.confirm": "Confirm",
|
|
579
760
|
"state.loading": "Loading skills…",
|
|
580
761
|
"state.empty": "No skills in this group",
|
|
581
762
|
"state.failed": "Could not load the skill list",
|
|
763
|
+
"content.loading": "Loading the skill content…",
|
|
764
|
+
"content.failed": "Could not load the skill content",
|
|
582
765
|
"skill.enabled": "Enabled",
|
|
583
766
|
"skill.disabled": "Disabled",
|
|
584
767
|
"skill.modelInvocable": "Model invocable",
|