@daweifu/capability-menu 0.1.3 → 0.1.4
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.en.md +24 -14
- package/README.md +24 -14
- package/lib/client.d.ts +29 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +497 -92
- package/lib/invoke.js +72 -2
- package/lib/invoke.js.map +1 -1
- package/lib/policy.js +30 -6
- package/lib/policy.js.map +1 -1
- package/lib/registry.js +23 -4
- package/lib/registry.js.map +1 -1
- package/lib/server/remote.js +27 -0
- package/lib/server/remote.js.map +1 -1
- package/lib/types/invoke.d.ts.map +1 -1
- package/lib/types/policy.d.ts +6 -0
- package/lib/types/policy.d.ts.map +1 -1
- package/lib/types/registry.d.ts +23 -0
- package/lib/types/registry.d.ts.map +1 -1
- package/lib/types/server/remote.d.ts +18 -0
- package/lib/types/server/remote.d.ts.map +1 -1
- package/package.json +1 -1
package/README.en.md
CHANGED
|
@@ -59,20 +59,30 @@ The model gets two meta tools:
|
|
|
59
59
|
<img src="assets/screenshot-catalog.png" alt="Policy & catalog · On-demand catalog" width="48%"/>
|
|
60
60
|
</p>
|
|
61
61
|
|
|
62
|
-
Once installed, a Capability Management tab appears under Settings → General Settings (between "Model" and "Plugins"). It
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
62
|
+
Once installed, a Capability Management tab appears under Settings → General Settings (between "Model" and "Plugins"). It is where you view and adjust a capability's exposure tier; changes apply immediately, no restart needed.
|
|
63
|
+
|
|
64
|
+
| What you want to do | Where |
|
|
65
|
+
| --- | --- |
|
|
66
|
+
| Change a tier | Click the dot on a capability row, or a tier count at the top to switch the whole group |
|
|
67
|
+
| Register an MCP server / skill directory | Register capability, top right |
|
|
68
|
+
| Edit or remove a registered entry | Edit on an MCP server's group header (Tools) or a skill row (Skills) |
|
|
69
|
+
| See the effective policy and the On-demand catalog | Policy & catalog, on the header's description row |
|
|
70
|
+
| The list is stale (you changed a source outside dsh) | Nothing to do: returning to the tab, a settings change and a carrier reconnect all re-read it, with a ~5s poll as the backstop |
|
|
71
|
+
| Find a capability in a long list | The filter box under the tab bar matches a name **and the group it sits in** (server / source / preset id), case-insensitively, and takes a regex (shared by Tools and Skills) |
|
|
72
|
+
|
|
73
|
+
**The tier is that dot**: filled = Resident (the model calls it directly), half-filled ring = On-demand (reached through `meta_search` → `meta_invoke`), ring with a slash (a no-entry sign) = Disabled. If a higher-priority rule (a wildcard, say) overrides it, the UI reports that the classification did not apply.
|
|
74
|
+
|
|
75
|
+
**How the page is laid out**: the Tools tab groups by server and folds — MCP tools under their own server, harness-native tools together under the built-in group; the Skills tab splits into "Global skills" / "Project skills" / "Preset skills" — **the third appears only when skills that ship with an agent preset actually exist** (without them the tab bar stays at two), and preset ids are section headings inside that tab rather than another level of tabs. A filter box under the tab bar matches names and the group a row sits in and accepts a regex, which beats folding groups once a list gets long. Click a capability row for its model-facing definition, a skill row to expand its directory tree, and a file to preview it.
|
|
76
|
+
|
|
77
|
+
**Three behaviours worth knowing**:
|
|
78
|
+
|
|
79
|
+
- **A tier click does not hit disk immediately**: it changes memory first (so it feels instant) and is written back to `patchFile` (the home layer's `~/.dsh/cordis.patch.yml` by default) once you stop for ~1.5s — writing that file makes dsh hot-reload this plugin, so it cannot happen on every click.
|
|
80
|
+
- **Registering writes files**: an MCP server goes into the same patch file (an `@deepseek-ai/dsh-mcp-client` row, mounted natively by dsh — this plugin never manages the connection), and a skill directory becomes a symlink under the skill root. Credentials such as headers are stored there in **plain text**.
|
|
81
|
+
- **Some skill rows offer Adopt rather than Edit**: those are skills in user-level roots such as `~/.agents/skills` / `customSkillDirs`. The confirmation names the directory it currently lives in, and confirming links it into `~/.dsh/skills/` with the **content untouched**; rows that cannot be adopted show their source instead. **Skills that ship with an agent preset are never adoptable**: linking a preset asset into the user skill root would make it apply to every session, the opposite of "visible only to sessions that mount this preset", so those rows just say "From preset X".
|
|
82
|
+
|
|
83
|
+
> **Skill sources and same-name handling**: a row's source label comes from dsh's provider (`project-dsh` / `user-agents` / `custom` / `bundled` …), and a **preset skill and a user-configured `customSkillDirs` entry are both labelled `custom`** — only scope provenance tells them apart, so grouping uses the preset id recorded while scanning, never the source label. Tier rules apply by **bare name**: same-named skills across scopes share one switch, and indexing is **global layer first, then presets in order** (matching the tool side); a name collision does not affect tiers, but only one of the implementations shows up in the list.
|
|
84
|
+
|
|
85
|
+
What each form field means, how visible a global versus a project skill is, what a removal actually costs, and how `SKILL.md` is validated are all stated where you act on them — no need to repeat them here.
|
|
76
86
|
|
|
77
87
|
## Quick Install
|
|
78
88
|
|
package/README.md
CHANGED
|
@@ -59,20 +59,30 @@ Capability 是本插件引入的上位概念:Tool / Skill 是不同类型的 c
|
|
|
59
59
|
<img src="assets/screenshot-catalog.png" alt="策略与目录 · 按需能力目录" width="48%"/>
|
|
60
60
|
</p>
|
|
61
61
|
|
|
62
|
-
安装后,「设置 / 通用设置」下出现「能力菜单」tab
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
62
|
+
安装后,「设置 / 通用设置」下出现「能力菜单」tab(在「模型」与「插件」之间),用来查看和调整能力的暴露档位,改动即时生效、无需重启。
|
|
63
|
+
|
|
64
|
+
| 想做什么 | 在哪 |
|
|
65
|
+
| --- | --- |
|
|
66
|
+
| 切档位 | 点能力行右侧的圆点;或点顶部的档位计数,整组切 |
|
|
67
|
+
| 在长列表里找能力 | 页签栏下方的过滤框,匹配名字**和所属分组**(server / 来源 / preset id),忽略大小写、可写正则(Tools / Skills 共用) |
|
|
68
|
+
| 注册 MCP 服务器 / Skill 目录 | 右上角「注册能力」 |
|
|
69
|
+
| 编辑、移除已注册项 | Tools 页 server 分组头、Skills 页技能行右侧的「编辑」 |
|
|
70
|
+
| 看当前生效策略与按需能力目录 | 页头说明行右侧的「策略与目录」 |
|
|
71
|
+
| 列表没跟上(你在 dsh 之外改过来源) | 不用管:切回本页、配置变更、carrier 重连都会自动重读,另有约 5s 的兜底轮询 |
|
|
72
|
+
|
|
73
|
+
**档位就是那个圆点**:实心 = 常驻(模型直接调用)、上半实心圆环 = 按需(走 `meta_search` → `meta_invoke`)、圆环 + 斜杠(禁行标志)= 禁用。被更高优先级规则(如通配)挡住时,界面会提示「分类未生效」。
|
|
74
|
+
|
|
75
|
+
**页面结构**:Tools 页按 server 分组、可折叠,MCP 工具挂在各自 server 下,内置原生工具统一在「系统内置」组;Skills 页分「全局技能 / 项目技能 / 预设技能」子页签——**「预设技能」只在确实存在随 agent preset 分发的技能时出现**(没有就是原来的两个页签),组内以 preset id 作小标题,不再往下分层。页签下方是过滤框:匹配名字与所属分组、支持正则(列表长时比翻分组快)。点能力行看模型侧的工具定义,点技能行展开目录树、点文件预览正文。
|
|
76
|
+
|
|
77
|
+
**三点需要知道的行为**:
|
|
78
|
+
|
|
79
|
+
- **切档位不立刻落盘**:先改内存(所以响应快),停手约 1.5s 后才写回 `patchFile`(默认 home 层的 `~/.dsh/cordis.patch.yml`)——写这个文件会让 dsh 热重载本插件,所以不能每次点击都写。
|
|
80
|
+
- **注册是写文件**:MCP 服务器写进同一个 patch 文件(`@deepseek-ai/dsh-mcp-client` 条目,由 dsh 原生挂载,插件不自己管连接);Skill 在技能根下建软链。请求头等凭据**明文**存在那里。
|
|
81
|
+
- **有的技能行给的是「纳入管理」而不是「编辑」**:`~/.agents/skills` / `customSkillDirs` 这类用户级根里的技能,确认框会写明它当前所在的目录,确认后软链进 `~/.dsh/skills/`,**内容不动**;不能纳管的行改为显示来源。**随 agent preset 分发的技能不提供「纳入管理」**:把预设资产软链进用户技能根等于让它对所有会话生效,与该类技能"只对挂载了预设的会话可见"的定位相反,因此这类行只显示「来自预设 X」。
|
|
82
|
+
|
|
83
|
+
> **技能来源与同名规则**:技能行上的来源标签来自 dsh 的 provider(`project-dsh` / `user-agents` / `custom` / `bundled` …),而**预设技能和用户自配的 `customSkillDirs` 都是 `custom`**——两者只能靠作用域归属区分,所以分组用的是扫描时记下的 preset id,不是来源标签。档位规则按**裸名字**生效:同名技能跨作用域共享同一个开关,且索引时**全局层优先、预设之间先到先得**(与工具侧一致);同名冲突不影响档位,但会让另一份实现不出现在列表里。
|
|
84
|
+
|
|
85
|
+
字段含义与可见范围(全局 / 项目)、移除的具体后果、注册时的 `SKILL.md` 校验口径,都在你操作的那一刻写着,这里不重复。
|
|
76
86
|
|
|
77
87
|
## 快速安装
|
|
78
88
|
|
package/lib/client.d.ts
CHANGED
|
@@ -13,6 +13,12 @@ interface CapabilityRow {
|
|
|
13
13
|
readonly server?: string;
|
|
14
14
|
/** Skill source root label (`project-dsh`/`user-agents`/…), present only for skills. */
|
|
15
15
|
readonly source?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Agent preset id, present only for skills that live in a preset's own layer.
|
|
18
|
+
* The source label is `custom` for these as well, so this is what tells a
|
|
19
|
+
* preset skill apart from one in a user-configured `customSkillDirs` root.
|
|
20
|
+
*/
|
|
21
|
+
readonly preset?: string;
|
|
16
22
|
/** The skill's own directory on disk, present only for skills whose provider has one. */
|
|
17
23
|
readonly path?: string;
|
|
18
24
|
readonly class: 'resident' | 'on-demand' | 'disabled';
|
|
@@ -51,6 +57,7 @@ interface ToolDetail {
|
|
|
51
57
|
readonly serverName?: string;
|
|
52
58
|
readonly path?: string;
|
|
53
59
|
readonly source?: string;
|
|
60
|
+
readonly preset?: string;
|
|
54
61
|
};
|
|
55
62
|
readonly tags: readonly string[];
|
|
56
63
|
readonly stats: {
|
|
@@ -111,6 +118,7 @@ declare module '@deepseek-ai/dsh-typert-protocol' {
|
|
|
111
118
|
updateConfig: (partial: Record<string, unknown>) => Promise<RemoteResult<void>>;
|
|
112
119
|
classifyAll: () => Promise<RemoteResult<CapabilityRow[]>>;
|
|
113
120
|
refresh: () => Promise<RemoteResult<void>>;
|
|
121
|
+
catalogVersion: () => Promise<RemoteResult<number>>;
|
|
114
122
|
listSkillDir: (id: string, relPath?: string) => Promise<RemoteResult<SkillFileEntry[] | undefined>>;
|
|
115
123
|
readSkillFile: (id: string, relPath: string) => Promise<RemoteResult<string | undefined>>;
|
|
116
124
|
getDetail: (id: string) => Promise<RemoteResult<ToolDetail | undefined>>;
|
|
@@ -130,6 +138,7 @@ declare module '@deepseek-ai/dsh-typert-protocol' {
|
|
|
130
138
|
'capabilityPolicy/updateConfig': (partial: Record<string, unknown>) => Promise<RemoteResult<void>>;
|
|
131
139
|
'capabilityPolicy/classifyAll': () => Promise<RemoteResult<CapabilityRow[]>>;
|
|
132
140
|
'capabilityPolicy/refresh': () => Promise<RemoteResult<void>>;
|
|
141
|
+
'capabilityPolicy/catalogVersion': () => Promise<RemoteResult<number>>;
|
|
133
142
|
'capabilityPolicy/listSkillDir': (id: string, relPath?: string) => Promise<RemoteResult<SkillFileEntry[] | undefined>>;
|
|
134
143
|
'capabilityPolicy/readSkillFile': (id: string, relPath: string) => Promise<RemoteResult<string | undefined>>;
|
|
135
144
|
'capabilityPolicy/getDetail': (id: string) => Promise<RemoteResult<ToolDetail | undefined>>;
|
|
@@ -196,6 +205,17 @@ interface CapabilityPolicyRemote {
|
|
|
196
205
|
message: string;
|
|
197
206
|
};
|
|
198
207
|
}>;
|
|
208
|
+
/** One number naming the host's current catalog state; see the registry's `version()`. */
|
|
209
|
+
catalogVersion(): Promise<{
|
|
210
|
+
ok: true;
|
|
211
|
+
value: number;
|
|
212
|
+
} | {
|
|
213
|
+
ok: false;
|
|
214
|
+
error: {
|
|
215
|
+
code: string;
|
|
216
|
+
message: string;
|
|
217
|
+
};
|
|
218
|
+
}>;
|
|
199
219
|
listSkillDir(id: string, relPath?: string): Promise<{
|
|
200
220
|
ok: true;
|
|
201
221
|
value: SkillFileEntry[] | undefined;
|
|
@@ -335,9 +355,17 @@ interface CapabilitySectionInjected {
|
|
|
335
355
|
t(key: CapabilityKey, params?: Record<string, unknown>): string;
|
|
336
356
|
/** Diagnostic: `$mount` failure surfaced instead of crashing the section. */
|
|
337
357
|
mountError?: string;
|
|
358
|
+
/**
|
|
359
|
+
* Subscribe to signals that the host catalog may have moved without this page
|
|
360
|
+
* asking: a settings document edit (registering a source, editing a
|
|
361
|
+
* composition file outside the browser) or a carrier reconnect. Returns a
|
|
362
|
+
* disposer. Optional so the section still mounts on a runtime that predates
|
|
363
|
+
* the forwarded-event API — it then falls back to the version poll alone.
|
|
364
|
+
*/
|
|
365
|
+
subscribeSignals?: (listener: () => void) => () => void;
|
|
338
366
|
}
|
|
339
367
|
type CapabilitySectionProps = CapabilitySectionInjected;
|
|
340
|
-
type CapabilityKey = 'nav' | 'title' | 'desc' | 'resident' | 'on-demand' | 'disabled' | 'tool' | 'skill' | 'mandatory' | 'toolsGroup' | 'skillsGroup' | 'builtInGroup' | 'globalSkills' | 'projectSkills' | 'emptyTools' | 'emptySkills' | 'emptyGlobalSkills' | 'emptyProjectSkills' | '
|
|
368
|
+
type CapabilityKey = 'nav' | 'title' | 'desc' | 'resident' | 'on-demand' | 'disabled' | 'tool' | 'skill' | 'mandatory' | 'toolsGroup' | 'skillsGroup' | 'builtInGroup' | 'globalSkills' | 'projectSkills' | 'presetSkills' | 'emptyTools' | 'emptySkills' | 'emptyGlobalSkills' | 'emptyProjectSkills' | 'filterByName' | 'filterHint' | 'filterNoMatch' | 'toolCount' | 'residentShort' | 'onDemandShort' | 'disabledShort' | 'cycleHint' | 'notPreviewable' | 'previewClose' | 'detailNotFound' | 'cycleOverridden' | 'refreshFailed' | 'retry' | 'carrierFailureHint' | 'registerCapability' | 'editMcp' | 'editSkillNamed' | 'edit' | 'save' | 'remove' | 'cancel' | 'confirmRemove' | 'confirmRemoveMcp' | 'confirmRemoveSkillLink' | 'confirmRemoveSkillDir' | 'confirmSaveAnyway' | 'saveConfirmRealDir' | 'register' | 'notEditable' | 'entryNotFound' | 'mcpServers' | 'skillDirs' | 'skillDirPath' | 'skillDirHint' | 'skillRoot' | 'skillRootUser' | 'skillRootProject' | 'skillRootHintUser' | 'skillRootHintProject' | 'skillProjectPath' | 'skillProjectPathHint' | 'skillRegisteredAt' | 'skillRepointed' | 'skillAdopted' | 'skillSource' | 'skillSourceHint' | 'skillFromPreset' | 'skillFromPresetHint' | 'skillUnmanaged' | 'adoptSkill' | 'adoptSkillHint' | 'adoptSkillTitle' | 'sourceCustom' | 'sourceBundled' | 'serverName' | 'serverNameImmutable' | 'transport' | 'transportStdio' | 'transportHttp' | 'transportHintStdio' | 'transportHintHttp' | 'command' | 'args' | 'cwd' | 'env' | 'url' | 'headers' | 'headersHint' | 'timeout' | 'timeoutInvalid' | 'viewCatalog' | 'catalogPolicy' | 'catalogOnDemand' | 'catalogPolicyNote' | 'catalogDisabled' | 'catalogUnreadable';
|
|
341
369
|
//#endregion
|
|
342
370
|
//#region src/client/index.d.ts
|
|
343
371
|
declare module '@deepseek-ai/dsh-client-ui-slots' {
|
package/lib/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","names":[],"sources":["../src/client/remote.ts","../src/client/store.ts","../src/client/CapabilitySection.tsx","../src/client/index.ts"],"mappings":";;;;;;;;UAkBiB;WACN;WACA;WACA;WACA;;WAEA;;WAEA;WACA;WACA;WACA;;;UAIM;;WAEN;;WAEA;aAAqB;aAAuB;;;WAE5C;;;UAIM;WACN;WACA;;;UAIM;WACN;WACA;WACA;WACA;WACA;WACA;WACA,YAAY;WACZ,SAAS;WACT;aAAmB;aAA2B;aAA8B;aAAwB;;
|
|
1
|
+
{"version":3,"file":"client.d.ts","names":[],"sources":["../src/client/remote.ts","../src/client/store.ts","../src/client/CapabilitySection.tsx","../src/client/index.ts"],"mappings":"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"}
|