@daweifu/capability-menu 0.1.0 → 0.1.2

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/lib/policy.js CHANGED
@@ -1,28 +1,64 @@
1
1
  /**
2
- * Exposed / Progressive / Blocked capability projection policy for the DeepSeek
2
+ * Resident / On-demand / Disabled capability projection policy for the DeepSeek
3
3
  * Harness.
4
4
  *
5
5
  * @module @daweifu/capability-menu (policy plugin)
6
6
  */
7
7
  import z from '@deepseek-ai/schemastery';
8
+ import { escapeText } from '@deepseek-ai/dsh-skill';
8
9
  import { serverNameOf } from "./registry.js";
9
10
  /** Validate and default the policy configuration. */
10
11
  export const Config = z.object({
11
12
  tools: z.object({
12
- exposed: z.array(z.string()).default([]),
13
- progressive: z.array(z.string()).default([]),
14
- blocked: z.array(z.string()).default([]),
13
+ resident: z.array(z.string()).default([]),
14
+ 'on-demand': z.array(z.string()).default([]),
15
+ disabled: z.array(z.string()).default([]),
16
+ // Deprecated pre-rename aliases: kept in the schema so a config cast keeps
17
+ // them available for `normalizeSetConfig` instead of stripping them.
18
+ blocked: z.array(z.string()),
19
+ exposed: z.array(z.string()),
20
+ progressive: z.array(z.string()),
15
21
  }),
16
22
  skills: z.object({
17
- exposed: z.array(z.string()).default([]),
18
- progressive: z.array(z.string()).default([]),
19
- blocked: z.array(z.string()).default([]),
23
+ resident: z.array(z.string()).default([]),
24
+ 'on-demand': z.array(z.string()).default([]),
25
+ disabled: z.array(z.string()).default([]),
26
+ blocked: z.array(z.string()),
27
+ exposed: z.array(z.string()),
28
+ progressive: z.array(z.string()),
20
29
  }),
21
30
  metaTools: z.array(z.string()).default(['meta_search', 'meta_invoke']),
22
31
  // schemastery object properties are optional-by-default; no `.optional()` needed.
23
- progressiveSkillCatalog: z.string(),
24
32
  });
25
33
  export const DEFAULT_META_TOOLS = ['meta_search', 'meta_invoke'];
34
+ /**
35
+ * Map a legacy rule set (old keys `exposed`/`progressive`/`blocked`) onto the
36
+ * current key names (`resident`/`on-demand`/`disabled`), so already-deployed
37
+ * `cordis.patch.yml` profiles keep working without an on-disk rewrite. New
38
+ * keys win when they carry rules; a legacy key fills in when the matching new
39
+ * list is empty.
40
+ */
41
+ export function normalizeSetConfig(set) {
42
+ if (set === undefined)
43
+ return undefined;
44
+ const next = {};
45
+ const resident = set.resident !== undefined && set.resident.length > 0 ? set.resident : undefined;
46
+ if (resident !== undefined)
47
+ next.resident = resident;
48
+ else if (set.exposed !== undefined && set.exposed.length > 0)
49
+ next.resident = set.exposed;
50
+ const onDemand = set['on-demand'] !== undefined && set['on-demand'].length > 0 ? set['on-demand'] : undefined;
51
+ if (onDemand !== undefined)
52
+ next['on-demand'] = onDemand;
53
+ else if (set.progressive !== undefined && set.progressive.length > 0)
54
+ next['on-demand'] = set.progressive;
55
+ const disabled = set.disabled !== undefined && set.disabled.length > 0 ? set.disabled : undefined;
56
+ if (disabled !== undefined)
57
+ next.disabled = disabled;
58
+ else if (set.blocked !== undefined && set.blocked.length > 0)
59
+ next.disabled = set.blocked;
60
+ return next;
61
+ }
26
62
  /**
27
63
  * Convert a user-facing rule string into a normalized {@link PolicyRule}.
28
64
  * - `server:<name>` → server-targeted rule (`target: 'server'`).
@@ -57,9 +93,9 @@ export function compileGlob(pattern) {
57
93
  /** Compile a {@link CapabilitySetConfig} into fast-matchable rules. */
58
94
  export function compileSet(set = {}) {
59
95
  return {
60
- exposed: (set.exposed ?? []).map(parseRule),
61
- progressive: (set.progressive ?? []).map(parseRule),
62
- blocked: (set.blocked ?? []).map(parseRule),
96
+ resident: (set.resident ?? []).map(parseRule),
97
+ onDemand: (set['on-demand'] ?? []).map(parseRule),
98
+ disabled: (set.disabled ?? []).map(parseRule),
63
99
  };
64
100
  }
65
101
  function ruleMatches(rule, target) {
@@ -68,8 +104,8 @@ function ruleMatches(rule, target) {
68
104
  if (rule.target === 'id') {
69
105
  if (!rule.wildcard) {
70
106
  // An exact rule matches the full id OR the bare name (e.g. `debugging`
71
- // matches `skill:debugging`, `bash` matches the harness-native tool
72
- // `bash` whose public name is its bare name).
107
+ // matches a skill named `debugging`, `bash` matches the harness-native
108
+ // tool `bash` whose public name is its bare name).
73
109
  return rule.pattern === target.id || rule.pattern === target.name;
74
110
  }
75
111
  return compileGlob(rule.pattern).test(target.id);
@@ -83,73 +119,88 @@ function ruleMatches(rule, target) {
83
119
  }
84
120
  /**
85
121
  * Classify a capability against compiled rules. Priority (hit stops the walk):
86
- * blocked-exact > blocked-wildcard > exposed-exact > exposed-wildcard >
87
- * progressive-exact > progressive-wildcard > default (exposed). `blocked`
88
- * is a control decision, so it beats an explicit `exposed` rule.
122
+ * disabled-exact > disabled-wildcard > resident-exact > on-demand-exact >
123
+ * resident-wildcard > on-demand-wildcard > default (resident). `disabled` is a
124
+ * control decision, so it beats an explicit `resident` rule. Within
125
+ * resident/on-demand an exact name beats a wildcard, so the management UI can
126
+ * pin a single capability to a class even when a broader wildcard rule says
127
+ * otherwise (e.g. `tools.resident: ['mcp__gongfeng__*']` must not silently win
128
+ * over an explicit per-tool `on-demand` rule).
89
129
  */
90
130
  export function classify(compiled, target, metaTools = DEFAULT_META_TOOLS) {
91
131
  const meta = metaTools instanceof Set ? metaTools : new Set(metaTools);
92
132
  const id = target.id;
93
- // metaTools can never be Progressive/Blocked for tools.
133
+ // metaTools can never be On-demand/Disabled for tools.
94
134
  if (target.kind === 'tool' && meta.has(id))
95
- return 'exposed';
96
- for (const rule of compiled.blocked) {
135
+ return 'resident';
136
+ for (const rule of compiled.disabled) {
97
137
  if (!rule.wildcard && ruleMatches(rule, target))
98
- return 'blocked';
138
+ return 'disabled';
99
139
  }
100
- for (const rule of compiled.blocked) {
140
+ for (const rule of compiled.disabled) {
101
141
  if (rule.wildcard && ruleMatches(rule, target))
102
- return 'blocked';
142
+ return 'disabled';
103
143
  }
104
- for (const rule of compiled.exposed) {
144
+ for (const rule of compiled.resident) {
105
145
  if (!rule.wildcard && ruleMatches(rule, target))
106
- return 'exposed';
107
- }
108
- for (const rule of compiled.exposed) {
109
- if (rule.wildcard && ruleMatches(rule, target))
110
- return 'exposed';
146
+ return 'resident';
111
147
  }
112
- for (const rule of compiled.progressive) {
148
+ for (const rule of compiled.onDemand) {
113
149
  if (!rule.wildcard && ruleMatches(rule, target))
114
- return 'progressive';
150
+ return 'on-demand';
115
151
  }
116
- for (const rule of compiled.progressive) {
152
+ for (const rule of compiled.resident) {
117
153
  if (rule.wildcard && ruleMatches(rule, target))
118
- return 'progressive';
154
+ return 'resident';
119
155
  }
120
- return 'exposed';
156
+ for (const rule of compiled.onDemand) {
157
+ if (rule.wildcard && ruleMatches(rule, target))
158
+ return 'on-demand';
159
+ }
160
+ return 'resident';
121
161
  }
122
162
  /** True when any rule in the list matches the target (used for fail-loud validation). */
123
163
  function anyRuleMatches(rules, target) {
124
164
  return rules.some(rule => ruleMatches(rule, target));
125
165
  }
126
166
  const CLASS_LABELS = {
127
- exposed: 'Exposed · 常驻(直接调用)',
128
- progressive: 'Progressive · 按需(目录渐进加载)',
129
- blocked: 'Blocked · 禁用',
167
+ resident: 'Resident · 常驻(直接调用)',
168
+ 'on-demand': 'On-demand · 按需(目录渐进加载)',
169
+ disabled: 'Disabled · 禁用',
130
170
  };
131
171
  /**
132
- * Build the projection listener for one assembly: keep only Exposed tools plus
172
+ * Build the projection listener for one assembly: keep only Resident tools plus
133
173
  * the mandatory meta tools.
134
174
  */
135
175
  export function projectAssemblyTools(assembly, service) {
136
- const kept = assembly.tools.filter(tool => service.isExposedTool(tool.name));
176
+ const kept = assembly.tools.filter(tool => service.isResidentTool(tool.name));
137
177
  if (kept.length === assembly.tools.length)
138
178
  return assembly;
139
179
  return { ...assembly, tools: kept };
140
180
  }
141
181
  /** Build the policy plugin. */
142
182
  export const name = 'capability-menu-policy';
143
- // The policy needs `meta` (the registry sibling) for classifyAll(); `tools` /
183
+ // The policy needs `capability` (the registry sibling) for classifyAll(); `tools` /
144
184
  // `skills` are injected purely for startup ordering — projection itself runs on
145
185
  // the `system-prompt/assemble` chain, not through the registries. The bundle
146
- // mounts registry before policy, so `meta` is always available in practice.
147
- export const inject = ['meta', 'tools', 'skills'];
148
- export function apply(ctx, config = {}) {
149
- // Mutable runtime state so the management surface (能力菜单) can live-update
186
+ // mounts registry before policy, so `capability` is always available in practice.
187
+ export const inject = ['capability', 'tools', 'skills'];
188
+ export async function apply(ctx, config = {}) {
189
+ // Accept legacy rule keys (`exposed`/`progressive`) with the same meaning as
190
+ // the current `resident`/`on-demand`, so pre-rename profiles keep working
191
+ // without a disk rewrite. The management UI always writes the new keys.
192
+ const normalized = { ...config };
193
+ const legacyTools = config.tools?.exposed !== undefined || config.tools?.progressive !== undefined || config.tools?.blocked !== undefined;
194
+ const legacySkills = config.skills?.exposed !== undefined || config.skills?.progressive !== undefined || config.skills?.blocked !== undefined;
195
+ normalized.tools = normalizeSetConfig(config.tools);
196
+ normalized.skills = normalizeSetConfig(config.skills);
197
+ if (legacyTools || legacySkills) {
198
+ ctx.logger.warn('capability-policy: legacy rule keys `exposed`/`progressive`/`blocked` were auto-mapped to `resident`/`on-demand`/`disabled`; edit the profile patch to persist the new keys');
199
+ }
200
+ // Mutable runtime state so the management surface (能力管理) can live-update
150
201
  // the policy without a reload.
151
- let current = { ...config };
152
- let metaTools = [...(config.metaTools ?? DEFAULT_META_TOOLS)];
202
+ let current = normalized;
203
+ let metaTools = [...(normalized.metaTools ?? DEFAULT_META_TOOLS)];
153
204
  let metaToolSet = new Set(metaTools);
154
205
  let toolCompiled;
155
206
  let skillCompiled;
@@ -158,21 +209,21 @@ export function apply(ctx, config = {}) {
158
209
  const skillRules = compileSet(current.skills);
159
210
  // Normalize tool/skill rule kinds for matching.
160
211
  toolCompiled = {
161
- exposed: toolRules.exposed.map(rule => ({ ...rule, kind: 'tool' })),
162
- progressive: toolRules.progressive.map(rule => ({ ...rule, kind: 'tool' })),
163
- blocked: toolRules.blocked.map(rule => ({ ...rule, kind: 'tool' })),
212
+ resident: toolRules.resident.map(rule => ({ ...rule, kind: 'tool' })),
213
+ onDemand: toolRules.onDemand.map(rule => ({ ...rule, kind: 'tool' })),
214
+ disabled: toolRules.disabled.map(rule => ({ ...rule, kind: 'tool' })),
164
215
  };
165
216
  skillCompiled = {
166
- exposed: skillRules.exposed.map(rule => ({ ...rule, kind: 'skill' })),
167
- progressive: skillRules.progressive.map(rule => ({ ...rule, kind: 'skill' })),
168
- blocked: skillRules.blocked.map(rule => ({ ...rule, kind: 'skill' })),
217
+ resident: skillRules.resident.map(rule => ({ ...rule, kind: 'skill' })),
218
+ onDemand: skillRules.onDemand.map(rule => ({ ...rule, kind: 'skill' })),
219
+ disabled: skillRules.disabled.map(rule => ({ ...rule, kind: 'skill' })),
169
220
  };
170
221
  // Meta tools are the control-plane escape hatch: blocking one is a
171
222
  // misconfiguration that must fail loud, never silently disable the surface.
172
223
  for (const name of metaTools) {
173
224
  const target = { id: name, name, server: serverNameOf(name), kind: 'tool', ruleKind: 'tool' };
174
- if (anyRuleMatches(toolCompiled.blocked, target)) {
175
- throw new Error(`meta tool "${name}" cannot be blocked; remove it from tools.blocked`);
225
+ if (anyRuleMatches(toolCompiled.disabled, target)) {
226
+ throw new Error(`meta tool "${name}" cannot be disabled; remove it from tools.disabled`);
176
227
  }
177
228
  }
178
229
  };
@@ -183,33 +234,26 @@ export function apply(ctx, config = {}) {
183
234
  return classify(toolCompiled, { id: name, name, server, kind: 'tool', ruleKind: 'tool' }, metaToolSet);
184
235
  },
185
236
  classifySkill(name) {
186
- return classify(skillCompiled, { id: `skill:${name}`, name, kind: 'skill', ruleKind: 'skill' }, new Set());
187
- },
188
- classifyCapability(id) {
189
- if (id.startsWith('skill:'))
190
- return service.classifySkill(id.slice('skill:'.length));
191
- return service.classifyTool(id);
192
- },
193
- isExposedTool(name) {
194
- return service.classifyTool(name) === 'exposed';
237
+ return classify(skillCompiled, { id: name, name, kind: 'skill', ruleKind: 'skill' }, new Set());
195
238
  },
196
- isExposedSkill(name) {
197
- return service.classifySkill(name) === 'exposed';
239
+ classifyCapability(id, kind) {
240
+ // `kind` disambiguates a bare name shared by a tool and a skill.
241
+ return kind === 'skill' ? service.classifySkill(id) : service.classifyTool(id);
198
242
  },
199
- isProgressiveTool(name) {
200
- return service.classifyTool(name) === 'progressive';
243
+ isResidentTool(name) {
244
+ return service.classifyTool(name) === 'resident';
201
245
  },
202
- isProgressiveSkill(name) {
203
- return service.classifySkill(name) === 'progressive';
246
+ isResidentSkill(name) {
247
+ return service.classifySkill(name) === 'resident';
204
248
  },
205
- isBlockedTool(name) {
206
- return service.classifyTool(name) === 'blocked';
249
+ isDisabledTool(name) {
250
+ return service.classifyTool(name) === 'disabled';
207
251
  },
208
- isBlockedSkill(name) {
209
- return service.classifySkill(name) === 'blocked';
252
+ isDisabledSkill(name) {
253
+ return service.classifySkill(name) === 'disabled';
210
254
  },
211
- isBlockedCapability(id) {
212
- return service.classifyCapability(id) === 'blocked';
255
+ isDisabledCapability(id, kind) {
256
+ return service.classifyCapability(id, kind) === 'disabled';
213
257
  },
214
258
  metaTools() {
215
259
  return metaTools;
@@ -223,25 +267,32 @@ export function apply(ctx, config = {}) {
223
267
  getConfig() {
224
268
  return { ...current };
225
269
  },
226
- updateConfig(partial) {
270
+ async updateConfig(partial) {
227
271
  current = { ...current, ...partial };
228
272
  if (partial.metaTools !== undefined) {
229
273
  metaTools = [...(partial.metaTools ?? DEFAULT_META_TOOLS)];
230
274
  metaToolSet = new Set(metaTools);
231
275
  }
232
276
  recompile();
277
+ // Classification changed → the on-demand catalog on disk is stale (a
278
+ // capability reclassified to disabled must disappear from the grep-able
279
+ // YAML). Await the registry refresh so callers get a completion signal:
280
+ // the disk catalog is rewritten before the call returns, closing the
281
+ // window where a disabled capability stayed visible on disk.
282
+ await ctx.capability.refresh();
233
283
  },
234
284
  classifyAll() {
235
285
  // The registry default maxResults (20) would truncate the management
236
286
  // surface: enumerate every indexed capability, not just the top-20.
237
- return ctx.meta.search({ maxResults: Number.MAX_SAFE_INTEGER }).map(summary => {
238
- const cls = service.classifyCapability(summary.id);
287
+ return ctx.capability.search({ maxResults: Number.MAX_SAFE_INTEGER }).map(summary => {
288
+ const cls = service.classifyCapability(summary.id, summary.kind);
239
289
  const mandatory = summary.kind === 'tool' && metaToolSet.has(summary.id);
240
290
  return {
241
291
  id: summary.id,
242
292
  kind: summary.kind,
243
293
  name: summary.name,
244
294
  ...summary.server !== undefined ? { server: summary.server } : {},
295
+ ...summary.source !== undefined ? { source: summary.source } : {},
245
296
  class: cls,
246
297
  classLabel: CLASS_LABELS[cls],
247
298
  mandatory,
@@ -249,16 +300,109 @@ export function apply(ctx, config = {}) {
249
300
  });
250
301
  },
251
302
  };
252
- // Project the model-visible tool list. This runs on the projection chain only
253
- // (system-prompt/assemble); the execution chain (ctx.tools.execute) is
254
- // untouched, so Progressive tools remain executable via meta_invoke. Skills
255
- // keep the dsh-native `<available_skills>` catalog, which is the Exposed
256
- // surface; catalog-level skill filtering needs an upstream `dsh-tool-skill`
257
- // filter hook (out of bundle scope).
303
+ // Disabled capabilities are a hard deny at the execution surface, not just a
304
+ // projection concern: a hallucinated direct call to a disabled tool (or to the
305
+ // `skill` loader for a disabled skill) must never reach the underlying server.
306
+ // On-demand tools stay executable — meta_invoke forwards through this same
307
+ // pipeline, so only Disabled is rejected here.
308
+ ctx.on('tools/pre-execute', async (exec, next) => {
309
+ if (service.isDisabledTool(exec.name)) {
310
+ return { kind: 'deny', reason: `capability "${exec.name}" is disabled and cannot be executed` };
311
+ }
312
+ if (exec.name === 'skill') {
313
+ const args = exec.arguments;
314
+ const name = typeof args?.name === 'string' ? args.name : '';
315
+ if (name.length > 0 && service.isDisabledSkill(name)) {
316
+ return { kind: 'deny', reason: `skill "${name}" is disabled and cannot be loaded` };
317
+ }
318
+ }
319
+ return next();
320
+ });
321
+ // On-demand/Disabled skills must not appear in the model-facing
322
+ // `<available_skills>` catalog injected by `dsh-tool-skill`. The catalog is a
323
+ // user-role message whose `source.kind === 'skill-catalog'`; rewrite it every
324
+ // pre-step to keep only Resident skills. dsh-tool-skill republishes the full
325
+ // catalog earlier on the same chain, so this filter is idempotent: whatever
326
+ // it publishes, only the Resident subset reaches the model.
327
+ ctx.on('agent/pre-step', async (_payload, next) => {
328
+ const decision = await next();
329
+ if (decision.kind !== 'enter')
330
+ return decision;
331
+ let changed = false;
332
+ const messages = decision.messages.map(message => {
333
+ const source = message.source;
334
+ if (source.kind !== 'skill-catalog')
335
+ return message;
336
+ const entries = Array.isArray(source.entries)
337
+ ? source.entries.filter((entry) => typeof entry === 'object' && entry !== null && typeof entry.name === 'string')
338
+ : [];
339
+ const kept = entries
340
+ .filter(entry => service.isResidentSkill(entry.name))
341
+ .map(entry => ({ name: entry.name, description: entry.description ?? '' }));
342
+ if (kept.length === entries.length)
343
+ return message;
344
+ changed = true;
345
+ return {
346
+ ...message,
347
+ content: [{ type: 'text', text: renderSkillCatalog(kept) }],
348
+ source: { ...message.source, entries: kept },
349
+ };
350
+ });
351
+ if (!changed)
352
+ return decision;
353
+ return { ...decision, messages };
354
+ });
355
+ // Project the model-visible tool list, then append a one-line pointer to the
356
+ // on-demand catalog so the model knows it exists without having to "think of"
357
+ // meta_search first. Skills keep the dsh-native catalog, but filtered to
358
+ // Resident by the `agent/pre-step` hook above.
258
359
  ctx.on('system-prompt/assemble', async (_assembly, _context, next) => {
259
360
  const resolved = await next();
260
- return projectAssemblyTools(resolved, service);
361
+ const projected = projectAssemblyTools(resolved, service);
362
+ const catalogPath = ctx.capability.catalogPath?.();
363
+ // Skip the pointer when there is nothing On-demand to browse: an empty
364
+ // hint wastes ~77 tokens of context and points at an empty file.
365
+ if (catalogPath === undefined || (ctx.capability.onDemandCount?.() ?? 0) === 0)
366
+ return projected;
367
+ const pointer = {
368
+ name: 'capability-menu-catalog',
369
+ text: [
370
+ 'On-demand capabilities are not in the resident tool list above. Their catalog is a YAML file you can browse with grep/read:',
371
+ ` ${catalogPath}`,
372
+ 'Search it (e.g. grep -n "name:" <path>) or call meta_search with an exact id for a schema, then meta_invoke to run/load the capability.',
373
+ ].join('\n'),
374
+ };
375
+ return { ...projected, sections: [...projected.sections, pointer] };
261
376
  });
262
377
  ctx.provide('capabilityPolicy', service);
378
+ // Emit the on-demand catalog before the plugin finishes mounting. The
379
+ // registry's own startup path (rebuildTools + refreshSkills) bypasses
380
+ // refresh(), so without this the YAML would not exist until the first
381
+ // tools/skills change event. Awaiting here closes the cold-start window
382
+ // where the first assemble could point at a file that does not exist yet.
383
+ await ctx.capability.refresh();
384
+ }
385
+ /**
386
+ * Rebuild the text body of a skill-catalog user message from a filtered entry
387
+ * list. Mirrors the `<available_skills>` format emitted by `dsh-tool-skill` so
388
+ * the model sees a consistent, complete replacement catalog.
389
+ */
390
+ function renderSkillCatalog(entries) {
391
+ const guidance = entries.length === 0
392
+ ? ['No skills are currently available through the `skill` tool. Do not use names from earlier skill catalogs.']
393
+ : [
394
+ 'If the user names a skill, or the task clearly matches a skill\u2019s description, call the `skill` tool with the exact skill name before taking task actions. Load all applicable skills, then follow their full instructions. This catalog contains summaries only; do not infer or follow a skill\u2019s instructions until it has been loaded.',
395
+ ];
396
+ return [
397
+ '<system-reminder>',
398
+ 'A skill is a reusable set of task-specific instructions. The following skills are available in this session:',
399
+ '',
400
+ '<available_skills>',
401
+ ...entries.map(entry => `- \`${escapeText(entry.name)}\`: ${escapeText(entry.description ?? '')}`),
402
+ '</available_skills>',
403
+ '',
404
+ ...guidance,
405
+ '</system-reminder>',
406
+ ].join('\n');
263
407
  }
264
408
  //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}