@daweifu/capability-menu 0.1.2 → 0.1.3

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.
@@ -36,8 +36,11 @@ import { TypertRemoteService, Remote } from '@deepseek-ai/dsh-typert-protocol';
36
36
  import { readFile } from 'node:fs/promises';
37
37
  import yaml from 'js-yaml';
38
38
  import { BUILT_IN_SERVER } from "../registry.js";
39
+ import { describeSkillEntry, isProjectSkillsDir } from "../locations.js";
40
+ import { ADOPTABLE_SKILL_SOURCES, PROJECT_SKILL_SOURCES } from "../constants.js";
41
+ import { basename, dirname, resolve } from 'node:path';
39
42
  /**
40
- * Host-side remote face for the 能力管理 tab. Every method delegates to the
43
+ * Host-side remote face for the 能力菜单 tab. Every method delegates to the
41
44
  * policy service installed by `@daweifu/capability-menu/policy`; the registry
42
45
  * sibling (`capability`) must be mounted for `classifyAll` to return anything.
43
46
  *
@@ -53,27 +56,57 @@ let CapabilityPolicyGateway = (() => {
53
56
  let _getConfig_decorators;
54
57
  let _updateConfig_decorators;
55
58
  let _classifyAll_decorators;
59
+ let _refresh_decorators;
56
60
  let _getDetail_decorators;
57
61
  let _listSkillDir_decorators;
58
62
  let _readSkillFile_decorators;
59
63
  let _getCatalogDocs_decorators;
64
+ let _listLocations_decorators;
65
+ let _addLocation_decorators;
66
+ let _removeLocation_decorators;
67
+ let _updateLocation_decorators;
68
+ let _listSkillLocations_decorators;
69
+ let _addSkillLocation_decorators;
70
+ let _adoptSkillLocation_decorators;
71
+ let _removeSkillLocation_decorators;
72
+ let _updateSkillLocation_decorators;
60
73
  return class CapabilityPolicyGateway extends _classSuper {
61
74
  static {
62
75
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
63
76
  _getConfig_decorators = [Remote('getConfig')];
64
77
  _updateConfig_decorators = [Remote('updateConfig')];
65
78
  _classifyAll_decorators = [Remote('classifyAll')];
79
+ _refresh_decorators = [Remote('refresh')];
66
80
  _getDetail_decorators = [Remote('getDetail')];
67
81
  _listSkillDir_decorators = [Remote('listSkillDir')];
68
82
  _readSkillFile_decorators = [Remote('readSkillFile')];
69
83
  _getCatalogDocs_decorators = [Remote('getCatalogDocs')];
84
+ _listLocations_decorators = [Remote('listLocations')];
85
+ _addLocation_decorators = [Remote('addLocation')];
86
+ _removeLocation_decorators = [Remote('removeLocation')];
87
+ _updateLocation_decorators = [Remote('updateLocation')];
88
+ _listSkillLocations_decorators = [Remote('listSkillLocations')];
89
+ _addSkillLocation_decorators = [Remote('addSkillLocation')];
90
+ _adoptSkillLocation_decorators = [Remote('adoptSkillLocation')];
91
+ _removeSkillLocation_decorators = [Remote('removeSkillLocation')];
92
+ _updateSkillLocation_decorators = [Remote('updateSkillLocation')];
70
93
  __esDecorate(this, null, _getConfig_decorators, { kind: "method", name: "getConfig", static: false, private: false, access: { has: obj => "getConfig" in obj, get: obj => obj.getConfig }, metadata: _metadata }, null, _instanceExtraInitializers);
71
94
  __esDecorate(this, null, _updateConfig_decorators, { kind: "method", name: "updateConfig", static: false, private: false, access: { has: obj => "updateConfig" in obj, get: obj => obj.updateConfig }, metadata: _metadata }, null, _instanceExtraInitializers);
72
95
  __esDecorate(this, null, _classifyAll_decorators, { kind: "method", name: "classifyAll", static: false, private: false, access: { has: obj => "classifyAll" in obj, get: obj => obj.classifyAll }, metadata: _metadata }, null, _instanceExtraInitializers);
96
+ __esDecorate(this, null, _refresh_decorators, { kind: "method", name: "refresh", static: false, private: false, access: { has: obj => "refresh" in obj, get: obj => obj.refresh }, metadata: _metadata }, null, _instanceExtraInitializers);
73
97
  __esDecorate(this, null, _getDetail_decorators, { kind: "method", name: "getDetail", static: false, private: false, access: { has: obj => "getDetail" in obj, get: obj => obj.getDetail }, metadata: _metadata }, null, _instanceExtraInitializers);
74
98
  __esDecorate(this, null, _listSkillDir_decorators, { kind: "method", name: "listSkillDir", static: false, private: false, access: { has: obj => "listSkillDir" in obj, get: obj => obj.listSkillDir }, metadata: _metadata }, null, _instanceExtraInitializers);
75
99
  __esDecorate(this, null, _readSkillFile_decorators, { kind: "method", name: "readSkillFile", static: false, private: false, access: { has: obj => "readSkillFile" in obj, get: obj => obj.readSkillFile }, metadata: _metadata }, null, _instanceExtraInitializers);
76
100
  __esDecorate(this, null, _getCatalogDocs_decorators, { kind: "method", name: "getCatalogDocs", static: false, private: false, access: { has: obj => "getCatalogDocs" in obj, get: obj => obj.getCatalogDocs }, metadata: _metadata }, null, _instanceExtraInitializers);
101
+ __esDecorate(this, null, _listLocations_decorators, { kind: "method", name: "listLocations", static: false, private: false, access: { has: obj => "listLocations" in obj, get: obj => obj.listLocations }, metadata: _metadata }, null, _instanceExtraInitializers);
102
+ __esDecorate(this, null, _addLocation_decorators, { kind: "method", name: "addLocation", static: false, private: false, access: { has: obj => "addLocation" in obj, get: obj => obj.addLocation }, metadata: _metadata }, null, _instanceExtraInitializers);
103
+ __esDecorate(this, null, _removeLocation_decorators, { kind: "method", name: "removeLocation", static: false, private: false, access: { has: obj => "removeLocation" in obj, get: obj => obj.removeLocation }, metadata: _metadata }, null, _instanceExtraInitializers);
104
+ __esDecorate(this, null, _updateLocation_decorators, { kind: "method", name: "updateLocation", static: false, private: false, access: { has: obj => "updateLocation" in obj, get: obj => obj.updateLocation }, metadata: _metadata }, null, _instanceExtraInitializers);
105
+ __esDecorate(this, null, _listSkillLocations_decorators, { kind: "method", name: "listSkillLocations", static: false, private: false, access: { has: obj => "listSkillLocations" in obj, get: obj => obj.listSkillLocations }, metadata: _metadata }, null, _instanceExtraInitializers);
106
+ __esDecorate(this, null, _addSkillLocation_decorators, { kind: "method", name: "addSkillLocation", static: false, private: false, access: { has: obj => "addSkillLocation" in obj, get: obj => obj.addSkillLocation }, metadata: _metadata }, null, _instanceExtraInitializers);
107
+ __esDecorate(this, null, _adoptSkillLocation_decorators, { kind: "method", name: "adoptSkillLocation", static: false, private: false, access: { has: obj => "adoptSkillLocation" in obj, get: obj => obj.adoptSkillLocation }, metadata: _metadata }, null, _instanceExtraInitializers);
108
+ __esDecorate(this, null, _removeSkillLocation_decorators, { kind: "method", name: "removeSkillLocation", static: false, private: false, access: { has: obj => "removeSkillLocation" in obj, get: obj => obj.removeSkillLocation }, metadata: _metadata }, null, _instanceExtraInitializers);
109
+ __esDecorate(this, null, _updateSkillLocation_decorators, { kind: "method", name: "updateSkillLocation", static: false, private: false, access: { has: obj => "updateSkillLocation" in obj, get: obj => obj.updateSkillLocation }, metadata: _metadata }, null, _instanceExtraInitializers);
77
110
  if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
78
111
  }
79
112
  static inject = ['capabilityPolicy', 'capability'];
@@ -93,6 +126,15 @@ let CapabilityPolicyGateway = (() => {
93
126
  classifyAll() {
94
127
  return [...this.ctx.capabilityPolicy.classifyAll()];
95
128
  }
129
+ /**
130
+ * Rebuild the capability catalog now and resolve once it has converged.
131
+ * The UI calls this after registering a new source (an MCP server or a
132
+ * skill directory) so the list reflects it without waiting for the
133
+ * scheduler's debounce window.
134
+ */
135
+ async refresh() {
136
+ await this.ctx.capability.refresh();
137
+ }
96
138
  /** Resolve one capability's full detail (schema, description; skill body optional). */
97
139
  async getDetail(id) {
98
140
  return this.ctx.capability.getDetail(id);
@@ -111,7 +153,7 @@ let CapabilityPolicyGateway = (() => {
111
153
  * server → 工具短名 分级列出;skills 无 server 维度,resident 恒为 '*',
112
154
  * 例外为短名平铺。空例外不渲染 key,避免 []/{} 歧义。
113
155
  * 另返回按需能力目录物化文件(~/.dsh/capability-catalog.yaml)的路径和内容。
114
- * 两者都是只读视图——策略持久化入口仍是 cordis.patch.yml。
156
+ * 两者都是只读视图;改规则的入口是「能力菜单」的点选,改动会自动写回 cordis.patch.yml。
115
157
  */
116
158
  async getCatalogDocs() {
117
159
  const effective = [...this.ctx.capabilityPolicy.classifyAll()];
@@ -159,8 +201,10 @@ let CapabilityPolicyGateway = (() => {
159
201
  if (disabledSkills.length > 0)
160
202
  skills.disabled = disabledSkills;
161
203
  const policyYaml = [
162
- '# 能力管理 · 当前生效策略(只读;持久化入口:cordis.patch.yml)',
163
- '# 语义:默认全部能力常驻;下方 on-demand / disabled 为按 server → 工具名分级的例外。',
204
+ '# 能力菜单 · 当前生效策略(只读视图)',
205
+ '# 实时生成自内存中的规则;「能力菜单」里的点选会在停手后写回 cordis.patch.yml。',
206
+ '# 语义:未命中任何规则的能力默认常驻,下面只列例外——',
207
+ '# tools 按 server → 工具名分级;skills 无 server 维度,直接平铺技能名。',
164
208
  `# 生效:tools 常驻 ${count(toolRows, 'resident')} · 按需 ${count(toolRows, 'on-demand')} · 禁用 ${count(toolRows, 'disabled')};` +
165
209
  `skills 常驻 ${count(skillRows, 'resident')} · 按需 ${count(skillRows, 'on-demand')} · 禁用 ${count(skillRows, 'disabled')}`,
166
210
  yaml.dump({
@@ -182,6 +226,95 @@ let CapabilityPolicyGateway = (() => {
182
226
  return { policyYaml, catalogMissing: 'read-failed' };
183
227
  }
184
228
  }
229
+ // — 注册能力(MCP 服务器 / Skill 目录)—
230
+ //
231
+ // Every mutation edits the patch file and lets dsh hot-reload mount or
232
+ // unmount the source. The gateway never mounts anything itself.
233
+ /** MCP servers declared in the patch file. */
234
+ async listLocations() {
235
+ return this.ctx.capabilityPolicy.listLocations();
236
+ }
237
+ /** Declare a new MCP server. */
238
+ async addLocation(input) {
239
+ return this.ctx.capabilityPolicy.addLocation(input);
240
+ }
241
+ /** Remove a declared MCP server. */
242
+ async removeLocation(id) {
243
+ return this.ctx.capabilityPolicy.removeLocation(id);
244
+ }
245
+ /** Replace a declared MCP server's connection config. */
246
+ async updateLocation(id, input) {
247
+ return this.ctx.capabilityPolicy.updateLocation(id, input);
248
+ }
249
+ /**
250
+ * Skill entries the operator can manage: everything under the user root, plus
251
+ * the project-scoped entries the skill index knows about.
252
+ *
253
+ * dsh discovers a project's skills from `<projectRoot>/.dsh/skills` and
254
+ * `<projectRoot>/.agents/skills` for whichever project the *session* cwd sits
255
+ * in, so reading the user root alone cannot see them. The index records each
256
+ * skill's own directory, which is what lets these rows be edited and removed
257
+ * rather than merely listed.
258
+ */
259
+ async listSkillLocations() {
260
+ const rows = [...await this.ctx.capabilityPolicy.listSkillLocations()];
261
+ const seen = new Set(rows.map(row => `${row.entryDir}\u0000${row.name}`));
262
+ for (const entry of this.ctx.capability.skillDirs()) {
263
+ if (!PROJECT_SKILL_SOURCES.has(entry.source ?? ''))
264
+ continue;
265
+ const entryDir = dirname(entry.skillDir);
266
+ if (!isProjectSkillsDir(entryDir))
267
+ continue;
268
+ // `entry.name` is the skill's *declared* name, which need not match the
269
+ // directory dsh found it in. `describeSkillEntry` addresses the entry
270
+ // itself, so it has to be given the directory's own basename — passing the
271
+ // declared name made it look for a directory that does not exist and
272
+ // silently drop the row, leaving such a skill uneditable.
273
+ const entryName = basename(entry.skillDir);
274
+ const key = `${resolve(entryDir)}\u0000${entryName}`;
275
+ if (seen.has(key))
276
+ continue;
277
+ seen.add(key);
278
+ const row = await describeSkillEntry(entryDir, entryName, 'project');
279
+ if (row !== undefined)
280
+ rows.push(row);
281
+ }
282
+ return rows;
283
+ }
284
+ /**
285
+ * Register a skill directory: into the user root by default, or into a
286
+ * project's `.dsh/skills` when `projectPath` names a path inside that project.
287
+ * Returns the entry path actually written so the UI can report it.
288
+ */
289
+ async addSkillLocation(dir, projectPath) {
290
+ return this.ctx.capabilityPolicy.addSkillLocation(dir, projectPath);
291
+ }
292
+ /**
293
+ * Adopt a skill that already lives in a user-level root this plugin reads but
294
+ * does not manage (`~/.agents/skills`, custom dirs) by linking its own
295
+ * directory into the user root. The content is untouched — this is exactly how
296
+ * the entries already in `~/.dsh/skills` are set up — and the skill becomes
297
+ * editable afterwards. Returns the entry path written.
298
+ */
299
+ async adoptSkillLocation(name) {
300
+ const record = this.ctx.capability.get(name.trim(), 'skill');
301
+ const dir = record?.origin.path;
302
+ const source = record?.origin.source;
303
+ if (dir === undefined)
304
+ throw new Error(`该技能没有可链接的目录,无法纳入管理:${name}`);
305
+ if (source === undefined || !ADOPTABLE_SKILL_SOURCES.has(source)) {
306
+ throw new Error(`该技能来自 ${source ?? '未知来源'},不支持纳入管理`);
307
+ }
308
+ return this.ctx.capabilityPolicy.addSkillLocation(dir);
309
+ }
310
+ /** Unregister a skill entry; `entryDir` addresses a project entry. */
311
+ async removeSkillLocation(name, entryDir) {
312
+ return this.ctx.capabilityPolicy.removeSkillLocation(name, entryDir);
313
+ }
314
+ /** Repoint a registered skill entry at a different directory. */
315
+ async updateSkillLocation(name, dir, entryDir) {
316
+ return this.ctx.capabilityPolicy.updateSkillLocation(name, dir, entryDir);
317
+ }
185
318
  };
186
319
  })();
187
320
  export { CapabilityPolicyGateway };
@@ -1 +1 @@
1
- {"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/server/remote.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/server/remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Constants shared by the server-side registry and the browser bundle.
3
+ *
4
+ * Kept in a dependency-free module so `src/client` can import them without
5
+ * pulling the registry's `node:fs` / `js-yaml` imports into the web bundle.
6
+ */
7
+ /** Prefix of every MCP tool's registered name: `mcp__<server>__<raw>`. */
8
+ export declare const MCP_ID_PREFIX = "mcp__";
9
+ /**
10
+ * Reserved pseudo-server that groups harness-native (non-MCP) tools in the
11
+ * management surface. Native tools (bash/read/write/…) are cataloged like MCP
12
+ * tools — same `server` dimension — so 能力菜单 can group them, classify them
13
+ * Resident/On-demand/Disabled, and `meta_invoke` can dispatch them.
14
+ */
15
+ export declare const BUILT_IN_SERVER = "built-in";
16
+ /**
17
+ * dsh's source labels for a project's own skill roots — the `project`-prefixed
18
+ * providers of `@deepseek-ai/dsh-skill-filesystem`, which scan
19
+ * `<projectRoot>/.dsh/skills` and `<projectRoot>/.agents/skills`. Every other
20
+ * label (`user-dsh`, `user-agents`, `bundled`, `custom`, `runtime`) is a
21
+ * user-level root. Shared so the server's location manager and the browser's
22
+ * 全局 / 项目 grouping agree on what "project scoped" means.
23
+ */
24
+ export declare const PROJECT_SKILL_SOURCES: ReadonlySet<string>;
25
+ /**
26
+ * Source labels for user-level skill roots whose entries this plugin can adopt:
27
+ * linking the skill's own directory into the user root (where the entry becomes
28
+ * editable) without touching its content. `user-dsh` is excluded because that
29
+ * root is already managed, and `bundled` because a packaged skill should not be
30
+ * shadowed by a user copy.
31
+ */
32
+ export declare const ADOPTABLE_SKILL_SOURCES: ReadonlySet<string>;
33
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,0EAA0E;AAC1E,eAAO,MAAM,aAAa,UAAU,CAAA;AAEpC;;;;;GAKG;AACH,eAAO,MAAM,eAAe,aAAa,CAAA;AAEzC;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAA8C,CAAA;AAEpG;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,CAAsC,CAAA"}
@@ -11,7 +11,7 @@
11
11
  * - `policy` (P3): Resident/On-demand/Disabled projection policy + `ctx.capabilityPolicy`.
12
12
  * - the package root entry (`name` + `apply` below): mounts the Typert gateway
13
13
  * that exposes `ctx.capabilityPolicy` to the browser as the `capabilityPolicy`
14
- * remote namespace — the data source of the 能力管理 settings tab.
14
+ * remote namespace — the data source of the 能力菜单 settings tab.
15
15
  * - a browser bundle via the `./client` subpath (`src/client`), discovered by
16
16
  * `@deepseek-ai/dsh-client-modules` from this package's `dsh.client`
17
17
  * declaration and served as `/plugins/<id>/client.js`.
@@ -0,0 +1,142 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ /** Plugin name of the MCP bridge, as declared in patch rows. */
3
+ export declare const MCP_CLIENT_PLUGIN = "@deepseek-ai/dsh-mcp-client";
4
+ export interface LocationConfig {
5
+ /** Patch file holding the MCP rows. Defaults to the home-level layer. */
6
+ readonly patchFile: string;
7
+ /** Skill root that `skill-filesystem` discovers by default. */
8
+ readonly skillsDir: string;
9
+ }
10
+ export declare function defaultLocationConfig(): LocationConfig;
11
+ /** Default skill root: the user root `skill-filesystem` scans with no config. */
12
+ export declare function defaultSkillsDir(): string;
13
+ /** One MCP server, as declared in the patch file. */
14
+ export interface McpLocation {
15
+ /** Patch row id (e.g. `mcp-gongfeng`). */
16
+ readonly id: string;
17
+ readonly serverName: string;
18
+ readonly transport: 'stdio' | 'streamable-http';
19
+ readonly disabled: boolean;
20
+ /** stdio: executable, argv, extra environment, working directory. */
21
+ readonly command?: string;
22
+ readonly args?: readonly string[];
23
+ readonly env?: Readonly<Record<string, string>>;
24
+ readonly cwd?: string;
25
+ /** streamable-http: endpoint and extra request headers (auth lives here). */
26
+ readonly url?: string;
27
+ readonly headers?: Readonly<Record<string, string>>;
28
+ /** Per-tool-call timeout in milliseconds (`dsh-mcp-client` default 60000). */
29
+ readonly toolCallTimeoutMs?: number;
30
+ }
31
+ /** Which skill root an entry lives in. */
32
+ export type SkillRootKind = 'user' | 'project';
33
+ /** One skill entry under a managed skill root. */
34
+ export interface SkillLocation {
35
+ /**
36
+ * The entry's own name — the symlink or directory under `entryDir`. This is
37
+ * what remove and update address, and it is *not* necessarily the skill's
38
+ * name: `addSkill` derives the link name from the source directory's basename.
39
+ */
40
+ readonly name: string;
41
+ /**
42
+ * The name the skill declares in its own `SKILL.md` frontmatter. That is the
43
+ * identity dsh keys the skill by, and what the capability panel's rows are
44
+ * named, so it is the field to match a row against. Absent when the manifest
45
+ * cannot be read — there is no declared name to disagree with `name` then.
46
+ */
47
+ readonly skillName?: string;
48
+ /** The entry itself: `<entryDir>/<name>`, a symlink or a real directory. */
49
+ readonly path: string;
50
+ /** True when the entry is a symlink to a directory outside the skill root. */
51
+ readonly linked: boolean;
52
+ /**
53
+ * False when dsh would not load the entry: no `SKILL.md`, or a frontmatter
54
+ * that is not a YAML mapping with a kebab-case `name` and a `description`.
55
+ */
56
+ readonly valid: boolean;
57
+ /** `user` for the default root, `project` for a project's own skill root. */
58
+ readonly root: SkillRootKind;
59
+ /**
60
+ * The skills directory holding the entry (`…/.dsh/skills` or
61
+ * `…/.agents/skills`). Opaque to callers: pass it back to update or remove,
62
+ * rather than rebuilding it from parts.
63
+ */
64
+ readonly entryDir: string;
65
+ /** The directory the entry points at, with symlinks resolved. */
66
+ readonly target?: string;
67
+ }
68
+ /**
69
+ * Input for editing a declared MCP server. `serverName` is deliberately absent:
70
+ * it is the row's identity and is baked into every `mcp__<serverName>__<tool>`
71
+ * name, session history and permission rule, so editing must not change it.
72
+ */
73
+ export type McpUpdateInput = Omit<McpInput, 'serverName'>;
74
+ /** Input for registering a new MCP server. */
75
+ export interface McpInput {
76
+ readonly serverName: string;
77
+ readonly transport: 'stdio' | 'streamable-http';
78
+ readonly command?: string;
79
+ readonly args?: readonly string[];
80
+ readonly env?: Readonly<Record<string, string>>;
81
+ readonly cwd?: string;
82
+ readonly url?: string;
83
+ readonly headers?: Readonly<Record<string, string>>;
84
+ /** Per-tool-call timeout in milliseconds; omit to use the dsh default. */
85
+ readonly toolCallTimeoutMs?: number;
86
+ }
87
+ export declare class LocationRegistry {
88
+ private readonly ctx;
89
+ private readonly config;
90
+ constructor(ctx: Context, config: LocationConfig);
91
+ /** Every MCP server declared in the patch file, in file order. */
92
+ listMcp(): Promise<McpLocation[]>;
93
+ /** Declare a new MCP server row. Throws on invalid or duplicate input. */
94
+ addMcp(input: McpInput): Promise<string>;
95
+ /** Remove a declared MCP server. Returns false when the row is absent. */
96
+ removeMcp(id: string): Promise<boolean>;
97
+ /**
98
+ * Replace a declared server's connection config. The row id (and therefore
99
+ * `serverName`, which is baked into every `mcp__<serverName>__<tool>` tool
100
+ * name, session history and permission rule) is never changed here.
101
+ */
102
+ updateMcp(id: string, input: McpUpdateInput): Promise<boolean>;
103
+ private hasMcp;
104
+ /** Every entry under the default (user) skill root. */
105
+ listSkills(): Promise<SkillLocation[]>;
106
+ /**
107
+ * Which skills directory an operation targets.
108
+ *
109
+ * `entryDir` comes back from a listing and is taken as given, but validated —
110
+ * a caller must not be able to aim `remove` at an arbitrary tree. Otherwise,
111
+ * `projectPath` is a path *inside* a project and the project root is derived
112
+ * from it exactly the way dsh derives it; with neither, the user root.
113
+ */
114
+ private resolveSkillsDir;
115
+ /**
116
+ * Register a skill directory by symlinking it into a managed root — the user
117
+ * root by default, or a project's `.dsh/skills` when `projectPath` is given.
118
+ * Returns the entry path actually written, so the caller can report where the
119
+ * skill landed instead of leaving the operator to guess.
120
+ */
121
+ addSkill(dir: string, projectPath?: string): Promise<string>;
122
+ /**
123
+ * Unregister a skill entry. Only removes a symlink or a directory that
124
+ * actually carries a `SKILL.md` — never an arbitrary file.
125
+ */
126
+ removeSkill(name: string, entryDir?: string): Promise<boolean>;
127
+ /**
128
+ * Repoint a registered skill at a different directory: unlink the old entry
129
+ * and link the new one under the same name. The name is the skill's identity
130
+ * in `ctx.skills`, so a rename is a remove + add, not an update.
131
+ */
132
+ updateSkill(name: string, dir: string, entryDir?: string): Promise<boolean>;
133
+ }
134
+ /**
135
+ * Describe `<entryDir>/<name>` as a skill entry, or `undefined` when nothing
136
+ * there looks like one. Used both for listing the user root and for describing
137
+ * project entries that dsh discovered on its own.
138
+ */
139
+ export declare function describeSkillEntry(entryDir: string, name: string, root: SkillRootKind): Promise<SkillLocation | undefined>;
140
+ /** True when `dir` has the shape of a project skills root. */
141
+ export declare function isProjectSkillsDir(dir: string): boolean;
142
+ //# sourceMappingURL=locations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locations.d.ts","sourceRoot":"","sources":["../../src/locations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import YAML from 'yaml';
2
+ /** One `- id: … / name: … / config: …` row in a patch file. */
3
+ export interface PatchEntry {
4
+ readonly id: string;
5
+ readonly name: string;
6
+ readonly disabled?: boolean;
7
+ readonly config?: Record<string, unknown>;
8
+ }
9
+ /** Default patch file: the home-level layer shared by every profile. */
10
+ export declare function defaultPatchFile(): string;
11
+ /** Find the entry row with `id`, if the file declares one. */
12
+ export declare function findEntry(doc: YAML.Document.Parsed, id: string): YAML.YAMLMap | undefined;
13
+ /** Read every declared entry as plain data (never mutates the file). */
14
+ export declare function readEntries(file: string): Promise<PatchEntry[]>;
15
+ /**
16
+ * Append a row to the document. Reuses the last `- insert:` block so new rows
17
+ * land next to the existing ones; creates one when the file has none.
18
+ */
19
+ export declare function addEntry(doc: YAML.Document.Parsed, entry: PatchEntry): void;
20
+ /**
21
+ * Append a bare, id-targeted override row (`- id: … / name: … / config: …`) at
22
+ * the top level — a patch that *finds* a row instead of adding one.
23
+ *
24
+ * Deliberately not {@link addEntry}: the row being configured is usually
25
+ * contributed by another layer. This plugin's own bundle patch inserts
26
+ * `capability-menu-policy`, and a profile's home layer is applied *after* that
27
+ * layer, so inserting a second row with the same id here leaves the composed
28
+ * tree with two rows sharing an id — which dsh refuses outright with
29
+ * `duplicate loader entry id`, taking the whole profile down.
30
+ */
31
+ export declare function addEntryOverride(doc: YAML.Document.Parsed, entry: PatchEntry): void;
32
+ /** Remove the row with `id`. Returns false when the file has no such row. */
33
+ export declare function removeEntry(doc: YAML.Document.Parsed, id: string): boolean;
34
+ /** Set or clear `disabled:` on the row with `id`. */
35
+ export declare function setEntryDisabled(doc: YAML.Document.Parsed, id: string, disabled: boolean): boolean;
36
+ /** Replace the row's `config:` (patch semantics replace the whole value). */
37
+ export declare function setEntryConfig(doc: YAML.Document.Parsed, id: string, config: Record<string, unknown>): boolean;
38
+ /**
39
+ * Load the patch file, apply `mutate`, and persist only when it reports a
40
+ * change. Returns whether a write happened (i.e. whether dsh will hot-reload).
41
+ *
42
+ * `mutate` must be pure apart from its edits to `doc`: it may be the only
43
+ * chance to change the file, and a thrown error leaves the file untouched.
44
+ */
45
+ export declare function mutatePatch(file: string, mutate: (doc: YAML.Document.Parsed) => boolean): Promise<boolean>;
46
+ //# sourceMappingURL=patch-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch-file.d.ts","sourceRoot":"","sources":["../../src/patch-file.ts"],"names":[],"mappings":"AAwBA,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,+DAA+D;AAC/D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC1C;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAuBD,8DAA8D;AAC9D,wBAAgB,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,GAAG,SAAS,CAKzF;AAED,wEAAwE;AACxE,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAUrE;AAeD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAW3E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAMnF;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAO1E;AAED,qDAAqD;AACrD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAMlG;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAK9G;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO,GAC7C,OAAO,CAAC,OAAO,CAAC,CAwBlB"}
@@ -8,6 +8,7 @@ import type { Context } from '@deepseek-ai/cordis';
8
8
  import z from '@deepseek-ai/schemastery';
9
9
  import type { PromptAssembly } from '@deepseek-ai/dsh-system-prompt';
10
10
  import { type CapabilityKind } from './registry.ts';
11
+ import { type McpInput, type McpLocation, type McpUpdateInput, type SkillLocation } from './locations.ts';
11
12
  /**
12
13
  * Canonical policy classes, mirroring the registry's `CapabilityKind`.
13
14
  *
@@ -75,6 +76,17 @@ export interface Config {
75
76
  * On-demand or Disabled. Default `[meta_search, meta_invoke]`.
76
77
  */
77
78
  metaTools?: string[];
79
+ /**
80
+ * Patch file holding the MCP server rows the 能力菜单 UI manages. Defaults
81
+ * to the home-level layer (`~/.dsh/cordis.patch.yml`) — the same file as any
82
+ * hand-written `@deepseek-ai/dsh-mcp-client` rows, so both are managed in one
83
+ * place. dsh owns the mounting; this plugin only edits the file.
84
+ */
85
+ patchFile?: string;
86
+ /** Skill root that UI skill registration links into. Defaults to `~/.dsh/skills`. */
87
+ skillsDir?: string;
88
+ /** Milliseconds to coalesce tier changes before persisting them. */
89
+ persistDebounceMs?: number;
78
90
  }
79
91
  /** Validate and default the policy configuration. */
80
92
  export declare const Config: z<Config>;
@@ -143,6 +155,12 @@ export interface CapabilityClassification {
143
155
  readonly server?: string;
144
156
  /** Skill source root label, present only for skills. */
145
157
  readonly source?: string;
158
+ /**
159
+ * The skill's own directory on disk, present only for skills whose provider
160
+ * has one. The 纳入管理 confirmation shows it so the operator sees which
161
+ * directory is about to be linked, not just the root it came from.
162
+ */
163
+ readonly path?: string;
146
164
  readonly class: CapabilityClass;
147
165
  /** Human-friendly display label for the classification. */
148
166
  readonly classLabel: string;
@@ -186,6 +204,27 @@ export interface CapabilityPolicyService {
186
204
  * registry sibling). Returns an empty array when the registry is not mounted.
187
205
  */
188
206
  classifyAll(): readonly CapabilityClassification[];
207
+ /** MCP servers declared in the patch file, in file order. */
208
+ listLocations(): Promise<McpLocation[]>;
209
+ /** Declare a new MCP server. Rejects a duplicate `serverName`. */
210
+ addLocation(input: McpInput): Promise<string>;
211
+ /** Remove a declared MCP server. */
212
+ removeLocation(id: string): Promise<boolean>;
213
+ /** Replace a declared server's connection config (`serverName` is immutable). */
214
+ updateLocation(id: string, input: McpUpdateInput): Promise<boolean>;
215
+ /** Skill entries under the user root, plus project entries the skill index knows about. */
216
+ listSkillLocations(): Promise<SkillLocation[]>;
217
+ /**
218
+ * Register a skill directory by linking it into the user root, or into
219
+ * `<projectRoot>/.dsh/skills` when `projectPath` names a path inside a project
220
+ * (the project root is derived from it the way dsh derives it). Returns the
221
+ * entry path actually written.
222
+ */
223
+ addSkillLocation(dir: string, projectPath?: string): Promise<string>;
224
+ /** Unregister a skill entry; `entryDir` addresses a project entry, omit it for the user root. */
225
+ removeSkillLocation(name: string, entryDir?: string): Promise<boolean>;
226
+ /** Repoint a registered skill entry at a different directory. */
227
+ updateSkillLocation(name: string, dir: string, entryDir?: string): Promise<boolean>;
189
228
  }
190
229
  declare module '@deepseek-ai/cordis' {
191
230
  interface Context {
@@ -1 +1 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/policy.ts"],"names":[],"mappings":"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"}