@aalis/plugin-commands 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # @aalis/plugin-commands
2
+
3
+ 运行时插件
4
+
5
+ ## 角色
6
+
7
+ 运行时插件
8
+
9
+ ## 安装
10
+
11
+ ```bash
12
+ pnpm add @aalis/plugin-commands
13
+ ```
14
+
15
+ ## 文档
16
+
17
+ 详见 [docs/plugins/plugin-commands.md](../../docs/plugins/plugin-commands.md)。
18
+
19
+ ## 许可
20
+
21
+ 见仓库根目录 LICENSE。
@@ -0,0 +1,55 @@
1
+ import type { Logger } from '@aalis/core';
2
+ import type { ExecutionGuard } from '@aalis/plugin-authority-api';
3
+ import type { AuthorityOverride, Command, CommandBuilder, CommandService, ExecutionInput, InternalCommandMeta } from '@aalis/plugin-commands-api';
4
+ export declare class CommandRegistry implements CommandService {
5
+ private readonly nodes;
6
+ /** 别名映射:aliasName → realName */
7
+ private readonly aliases;
8
+ private readonly overrides;
9
+ private readonly logger;
10
+ private _guard?;
11
+ prefix: string;
12
+ constructor(logger: Logger);
13
+ loadOverrides(overrides: Record<string, AuthorityOverride>): void;
14
+ setOverride(name: string, override: AuthorityOverride): void;
15
+ removeOverride(name: string): void;
16
+ getOverrides(): Record<string, AuthorityOverride>;
17
+ setExecutionGuard(guard: ExecutionGuard): void;
18
+ command(rawName: string, description?: string, meta?: InternalCommandMeta): CommandBuilder;
19
+ private makeBuilder;
20
+ /** 自动创建祖先分组节点(不替换已存在节点) */
21
+ private ensureGroups;
22
+ unregister(name: string): void;
23
+ unregisterByPlugin(pluginName: string): void;
24
+ parseCommand(input: string): {
25
+ name: string;
26
+ args: string[];
27
+ raw: string;
28
+ } | null;
29
+ has(name: string): boolean;
30
+ private hasTopSegment;
31
+ get(name: string): Command | undefined;
32
+ getNode(path: string | string[]): Command | undefined;
33
+ getAll(): Command[];
34
+ /**
35
+ * 沿层级最长匹配。tokens 是 parseCommand 后的 args(即 head 之后的部分);
36
+ * head 是 parseCommand 返回的 name。
37
+ *
38
+ * 返回命中节点的完整 dotName 与剩余 tokens。
39
+ */
40
+ private resolve;
41
+ private findNodesPrefixed;
42
+ /**
43
+ * 判断 head + tokens 是否能匹配到任何已注册的指令节点。
44
+ * 用于 inbound middleware 区分"未匹配指令"和"已命中"。
45
+ * 未匹配时调用方可决定走普通消息管道,而不是回显"未知指令"。
46
+ */
47
+ hasMatch(head: string, tokens?: string[]): boolean;
48
+ execute(name: string, input: ExecutionInput): Promise<string | undefined>;
49
+ private materialize;
50
+ private formatUsage;
51
+ private directChildren;
52
+ private parseArgs;
53
+ private defaultOptions;
54
+ }
55
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAA6B,MAAM,6BAA6B,CAAC;AAC7F,OAAO,KAAK,EACV,iBAAiB,EACjB,OAAO,EAEP,cAAc,EAEd,cAAc,EACd,cAAc,EACd,mBAAmB,EAMpB,MAAM,4BAA4B,CAAC;AA0CpC,qBAAa,eAAgB,YAAW,cAAc;IACpD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAC3D,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwC;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,MAAM,CAAC,CAAiB;IAEhC,MAAM,SAAO;gBAED,MAAM,EAAE,MAAM;IAM1B,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI;IAIjE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAG5D,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAGlC,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAMjD,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAM9C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,cAAc;IAqC1F,OAAO,CAAC,WAAW;IAuCnB,2BAA2B;IAC3B,OAAO,CAAC,YAAY;IAcpB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ9B,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQ5C,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAgBjF,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,OAAO,CAAC,aAAa;IASrB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAMtC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,GAAG,SAAS;IAKrD,MAAM,IAAI,OAAO,EAAE;IAMnB;;;;;OAKG;IACH,OAAO,CAAC,OAAO;IAsBf,OAAO,CAAC,iBAAiB;IAOzB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,EAAO,GAAG,OAAO;IAIhD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAiD/E,OAAO,CAAC,WAAW;IAkDnB,OAAO,CAAC,WAAW;IAyCnB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,SAAS;IAgFjB,OAAO,CAAC,cAAc;CAKvB"}
@@ -0,0 +1,664 @@
1
+ // ============================================================================
2
+ // 命令注册表(v2 — chatluna 风格)
3
+ //
4
+ // 设计 RFC:docs/design/command-system-v2.md
5
+ //
6
+ // - Map<fullDotName, Command>,name 即注册键
7
+ // - 注册 'memory.clear.all' 时自动创建 'memory' / 'memory.clear' 分组节点(无 handler)
8
+ // - 解析输入时按最长前缀匹配命中节点
9
+ // - Override key = 完整点路径名(与 name 一致)
10
+ // ============================================================================
11
+ const NAME_SEGMENT_RE = /^[a-z][a-z0-9-]*$/;
12
+ function emptyPatches() {
13
+ return {
14
+ aliases: [],
15
+ positionalArgs: [],
16
+ options: [],
17
+ examples: [],
18
+ declared: false,
19
+ };
20
+ }
21
+ export class CommandRegistry {
22
+ nodes = new Map();
23
+ /** 别名映射:aliasName → realName */
24
+ aliases = new Map();
25
+ overrides = new Map();
26
+ logger;
27
+ _guard;
28
+ prefix = '/';
29
+ constructor(logger) {
30
+ this.logger = logger.child('commands');
31
+ }
32
+ // ---- Overrides ----
33
+ loadOverrides(overrides) {
34
+ this.overrides.clear();
35
+ for (const [name, o] of Object.entries(overrides))
36
+ this.overrides.set(name, o);
37
+ }
38
+ setOverride(name, override) {
39
+ this.overrides.set(name, override);
40
+ }
41
+ removeOverride(name) {
42
+ this.overrides.delete(name);
43
+ }
44
+ getOverrides() {
45
+ return Object.fromEntries(this.overrides);
46
+ }
47
+ // ---- Guard ----
48
+ setExecutionGuard(guard) {
49
+ this._guard = guard;
50
+ }
51
+ // ---- Builder 入口 ----
52
+ command(rawName, description, meta) {
53
+ const parsed = parseCommandName(rawName);
54
+ const { name, positionalArgs } = parsed;
55
+ validateName(name);
56
+ // 确保所有祖先分组节点存在
57
+ this.ensureGroups(name);
58
+ let node = this.nodes.get(name);
59
+ if (!node) {
60
+ node = emptyPatches();
61
+ this.nodes.set(name, node);
62
+ }
63
+ else if (node.declared) {
64
+ this.logger.warn(`指令 ${this.prefix}${name} 已存在,将被覆盖(来自 ${meta?.pluginName ?? 'unknown'})`);
65
+ // 复用旧节点但清空可变字段
66
+ node.aliases = [];
67
+ node.positionalArgs = [];
68
+ node.options = [];
69
+ node.examples = [];
70
+ node.handler = undefined;
71
+ }
72
+ node.declared = true;
73
+ node.description = description ?? '';
74
+ node.baseAuthority = meta?.authority;
75
+ node.baseSafety = meta?.safety;
76
+ node.basePermissions = meta?.permissions ? [...meta.permissions] : [];
77
+ node.positionalArgs = positionalArgs;
78
+ node.usage = meta?.usage;
79
+ if (meta?.examples)
80
+ node.examples.push(...meta.examples);
81
+ node.pluginName = meta?.pluginName ?? 'unknown';
82
+ this.logger.debug(`注册指令: ${this.prefix}${name} (来自 ${node.pluginName})`);
83
+ return this.makeBuilder(name);
84
+ }
85
+ makeBuilder(name) {
86
+ const self = {
87
+ alias: (aliasName) => {
88
+ const segs = aliasName.split('.');
89
+ for (const s of segs)
90
+ validateNameSegment(s);
91
+ const existing = this.aliases.get(aliasName);
92
+ if (existing && existing !== name) {
93
+ this.logger.warn(`别名 ${this.prefix}${aliasName} 已指向 ${existing},将改指 ${name}`);
94
+ }
95
+ this.aliases.set(aliasName, name);
96
+ const node = this.nodes.get(name);
97
+ if (node && !node.aliases.includes(aliasName))
98
+ node.aliases.push(aliasName);
99
+ return self;
100
+ },
101
+ option: (optName, syntax, opts) => {
102
+ const spec = parseOptionSyntax(optName, syntax, opts);
103
+ const node = this.nodes.get(name);
104
+ if (node)
105
+ node.options.push(spec);
106
+ return self;
107
+ },
108
+ action: (handler) => {
109
+ const node = this.nodes.get(name);
110
+ if (node)
111
+ node.handler = handler;
112
+ return self;
113
+ },
114
+ usage: (text) => {
115
+ const node = this.nodes.get(name);
116
+ if (node)
117
+ node.usage = text;
118
+ return self;
119
+ },
120
+ example: (line) => {
121
+ const node = this.nodes.get(name);
122
+ if (node)
123
+ node.examples.push(line);
124
+ return self;
125
+ },
126
+ };
127
+ return self;
128
+ }
129
+ /** 自动创建祖先分组节点(不替换已存在节点) */
130
+ ensureGroups(name) {
131
+ const parts = name.split('.');
132
+ for (let i = 1; i < parts.length; i++) {
133
+ const groupName = parts.slice(0, i).join('.');
134
+ if (!this.nodes.has(groupName)) {
135
+ const patches = emptyPatches();
136
+ patches.description = `${groupName} 命令组`;
137
+ this.nodes.set(groupName, patches);
138
+ }
139
+ }
140
+ }
141
+ // ---- 注销 ----
142
+ unregister(name) {
143
+ const node = this.nodes.get(name);
144
+ if (!node)
145
+ return;
146
+ this.nodes.delete(name);
147
+ for (const a of node.aliases)
148
+ this.aliases.delete(a);
149
+ this.logger.debug(`注销指令: ${this.prefix}${name}`);
150
+ }
151
+ unregisterByPlugin(pluginName) {
152
+ for (const [name, node] of [...this.nodes]) {
153
+ if (node.pluginName === pluginName)
154
+ this.unregister(name);
155
+ }
156
+ }
157
+ // ---- 解析输入 ----
158
+ parseCommand(input) {
159
+ const trimmed = input.trim();
160
+ if (!trimmed)
161
+ return null;
162
+ let body = trimmed;
163
+ if (this.prefix) {
164
+ if (!trimmed.startsWith(this.prefix))
165
+ return null;
166
+ body = trimmed.slice(this.prefix.length);
167
+ }
168
+ const parts = tokenize(body);
169
+ const head = parts[0];
170
+ if (!head)
171
+ return null;
172
+ // 无前缀模式下,只有命中已知命令首段才认为是命令
173
+ if (!this.prefix && !this.hasTopSegment(head))
174
+ return null;
175
+ return { name: head, args: parts.slice(1), raw: trimmed };
176
+ }
177
+ has(name) {
178
+ return this.hasTopSegment(name);
179
+ }
180
+ hasTopSegment(name) {
181
+ if (this.nodes.has(name) || this.aliases.has(name))
182
+ return true;
183
+ // 也许是 'memory.x' 的 'memory' 顶层段
184
+ for (const k of this.nodes.keys()) {
185
+ if (k === name || k.startsWith(`${name}.`))
186
+ return true;
187
+ }
188
+ return false;
189
+ }
190
+ get(name) {
191
+ const real = this.aliases.get(name) ?? name;
192
+ if (!this.nodes.has(real))
193
+ return undefined;
194
+ return this.materialize(real);
195
+ }
196
+ getNode(path) {
197
+ const name = Array.isArray(path) ? path.join('.') : path;
198
+ return this.get(name);
199
+ }
200
+ getAll() {
201
+ return [...this.nodes.keys()].sort().map(n => this.materialize(n));
202
+ }
203
+ // ---- 解析与执行 ----
204
+ /**
205
+ * 沿层级最长匹配。tokens 是 parseCommand 后的 args(即 head 之后的部分);
206
+ * head 是 parseCommand 返回的 name。
207
+ *
208
+ * 返回命中节点的完整 dotName 与剩余 tokens。
209
+ */
210
+ resolve(head, tokens) {
211
+ const realHead = this.aliases.get(head) ?? head;
212
+ // 不存在 realHead 节点也不存在以 realHead 开头:未命中
213
+ if (!this.nodes.has(realHead) && !this.findNodesPrefixed(realHead))
214
+ return null;
215
+ let current = realHead;
216
+ let consumed = 0;
217
+ for (let i = 0; i < tokens.length; i++) {
218
+ const candidate = `${current}.${tokens[i]}`;
219
+ // 候选要么本身存在,要么作为更深节点的前缀存在
220
+ if (this.nodes.has(candidate) || this.findNodesPrefixed(candidate)) {
221
+ current = candidate;
222
+ consumed = i + 1;
223
+ }
224
+ else {
225
+ break;
226
+ }
227
+ }
228
+ // 若当前不是真实节点(仅是别名首段而无 head 顶级节点),不应发生(已 ensure)
229
+ if (!this.nodes.has(current))
230
+ return null;
231
+ return { name: current, remaining: tokens.slice(consumed) };
232
+ }
233
+ findNodesPrefixed(prefix) {
234
+ for (const k of this.nodes.keys()) {
235
+ if (k.startsWith(`${prefix}.`))
236
+ return true;
237
+ }
238
+ return false;
239
+ }
240
+ /**
241
+ * 判断 head + tokens 是否能匹配到任何已注册的指令节点。
242
+ * 用于 inbound middleware 区分"未匹配指令"和"已命中"。
243
+ * 未匹配时调用方可决定走普通消息管道,而不是回显"未知指令"。
244
+ */
245
+ hasMatch(head, tokens = []) {
246
+ return this.resolve(head, tokens) !== null;
247
+ }
248
+ async execute(name, input) {
249
+ const resolved = this.resolve(name, input.args);
250
+ if (!resolved)
251
+ return `未知指令: ${this.prefix}${name}。输入 ${this.prefix}help 查看帮助。`;
252
+ const cmd = this.materialize(resolved.name);
253
+ if (!cmd.handler) {
254
+ return this.formatUsage(cmd);
255
+ }
256
+ const parsed = this.parseArgs(cmd, resolved.remaining);
257
+ if (typeof parsed === 'string')
258
+ return parsed;
259
+ if (this._guard) {
260
+ const rejection = await this._guard({
261
+ name: cmd.name,
262
+ type: 'command',
263
+ authority: cmd.authority,
264
+ safety: cmd.safety,
265
+ permissions: cmd.permissions,
266
+ sessionId: input.sessionId,
267
+ platform: input.platform,
268
+ userId: input.userId,
269
+ skipSafetyCheck: input.skipSafetyCheck,
270
+ });
271
+ if (rejection)
272
+ return rejection;
273
+ }
274
+ try {
275
+ const argv = {
276
+ session: {
277
+ sessionId: input.sessionId,
278
+ platform: input.platform,
279
+ userId: input.userId,
280
+ sessionType: input.sessionType,
281
+ raw: input.raw,
282
+ },
283
+ options: parsed.options,
284
+ };
285
+ const result = await cmd.handler(argv, ...parsed.positionals);
286
+ return result ?? undefined;
287
+ }
288
+ catch (err) {
289
+ const message = err instanceof Error ? err.message : String(err);
290
+ this.logger.error(`指令 ${this.prefix}${cmd.name} 执行失败: ${message}`);
291
+ return `指令执行失败: ${message}`;
292
+ }
293
+ }
294
+ // ---- 内部:把 patches 合成有效 Command(含父级继承与 override) ----
295
+ materialize(name) {
296
+ const node = this.nodes.get(name);
297
+ if (!node)
298
+ throw new Error(`internal: node ${name} missing`);
299
+ // 父继承:沿 dot path 向上合并
300
+ let effAuthority = 1;
301
+ let effSafety = 'safe';
302
+ const inheritedPermissions = [];
303
+ const parts = name.split('.');
304
+ for (let i = 1; i < parts.length; i++) {
305
+ const parent = parts.slice(0, i).join('.');
306
+ const p = this.nodes.get(parent);
307
+ const ovr = this.overrides.get(parent);
308
+ const pAuth = ovr?.authority ?? p?.baseAuthority;
309
+ const pSafety = ovr?.safety ?? p?.baseSafety;
310
+ if (pAuth !== undefined)
311
+ effAuthority = pAuth;
312
+ if (pSafety !== undefined)
313
+ effSafety = pSafety;
314
+ if (p?.basePermissions)
315
+ inheritedPermissions.push(...p.basePermissions);
316
+ }
317
+ const ovr = this.overrides.get(name);
318
+ const baseAuth = node.baseAuthority ?? effAuthority;
319
+ const baseSafety = node.baseSafety ?? effSafety;
320
+ const auth = ovr?.authority ?? baseAuth;
321
+ const safety = ovr?.safety ?? baseSafety;
322
+ const permissions = unique([`command:${name}`, ...inheritedPermissions, ...(node.basePermissions ?? [])]);
323
+ return {
324
+ name,
325
+ pluginName: node.pluginName ?? 'unknown',
326
+ description: node.description ?? '',
327
+ baseAuthority: baseAuth,
328
+ baseSafety,
329
+ basePermissions: node.basePermissions ?? [],
330
+ authority: auth,
331
+ safety,
332
+ permissions,
333
+ aliases: [...node.aliases],
334
+ positionalArgs: [...node.positionalArgs],
335
+ options: [...node.options],
336
+ usage: node.usage,
337
+ examples: [...node.examples],
338
+ handler: node.handler,
339
+ overridden: !!ovr,
340
+ isGroup: !node.declared,
341
+ };
342
+ }
343
+ // ---- usage 自动格式化 ----
344
+ formatUsage(cmd) {
345
+ if (cmd.usage)
346
+ return cmd.usage;
347
+ const head = `${this.prefix}${cmd.name.replace(/\./g, ' ')}`;
348
+ const argText = cmd.positionalArgs
349
+ .map(a => (a.required ? `<${a.name}:${a.type}>` : `[${a.name}:${a.type}]`))
350
+ .join(' ');
351
+ const optionText = cmd.options.length > 0 ? ' [options]' : '';
352
+ const subs = this.directChildren(cmd.name);
353
+ const subText = subs.length > 0 && !cmd.handler ? ' <subcommand>' : '';
354
+ const lines = [`用法: ${head}${subText}${argText ? ` ${argText}` : ''}${optionText}`, ''];
355
+ lines.push(cmd.description);
356
+ if (cmd.positionalArgs.length > 0) {
357
+ lines.push('', '参数:');
358
+ for (const a of cmd.positionalArgs) {
359
+ lines.push(` ${a.required ? '<' : '['}${a.name}:${a.type}${a.required ? '>' : ']'}`);
360
+ }
361
+ }
362
+ if (cmd.options.length > 0) {
363
+ lines.push('', '选项:');
364
+ for (const o of cmd.options) {
365
+ const flags = [`--${o.name}`, ...o.aliases.map(a => `-${a}`)].join(', ');
366
+ const val = o.type === 'boolean' ? '' : o.valueOptional ? ` [${o.valueName ?? o.name}]` : ` <${o.valueName ?? o.name}>`;
367
+ const choices = o.choices && o.choices.length > 0 ? ` (${o.choices.join('|')})` : '';
368
+ lines.push(` ${flags}${val} — ${o.description ?? o.type}${choices}`);
369
+ }
370
+ }
371
+ if (subs.length > 0) {
372
+ lines.push('', '可用子指令:');
373
+ for (const s of subs) {
374
+ const child = this.materialize(s);
375
+ lines.push(` ${child.name.split('.').pop()} — ${child.description}`);
376
+ }
377
+ }
378
+ if (cmd.examples && cmd.examples.length > 0) {
379
+ lines.push('', '示例:');
380
+ for (const e of cmd.examples)
381
+ lines.push(` ${e}`);
382
+ }
383
+ return lines.join('\n');
384
+ }
385
+ directChildren(parent) {
386
+ const prefix = `${parent}.`;
387
+ const out = [];
388
+ for (const k of this.nodes.keys()) {
389
+ if (k.startsWith(prefix)) {
390
+ const rest = k.slice(prefix.length);
391
+ if (!rest.includes('.'))
392
+ out.push(k);
393
+ }
394
+ }
395
+ return out.sort();
396
+ }
397
+ // ---- 选项 + 位置参数 解析 ----
398
+ parseArgs(cmd, rawArgs) {
399
+ const options = this.defaultOptions(cmd.options);
400
+ const positionalTokens = [];
401
+ for (let i = 0; i < rawArgs.length; i++) {
402
+ const token = rawArgs[i];
403
+ if (token === '--') {
404
+ positionalTokens.push(...rawArgs.slice(i + 1));
405
+ break;
406
+ }
407
+ if (token.startsWith('--') && token.length > 2) {
408
+ const eq = token.indexOf('=');
409
+ const rawName = eq >= 0 ? token.slice(2, eq) : token.slice(2);
410
+ const negated = rawName.startsWith('no-');
411
+ const optName = negated ? rawName.slice(3) : rawName;
412
+ const def = findOption(cmd.options, optName);
413
+ if (!def)
414
+ return `未知选项: --${optName}\n\n${this.formatUsage(cmd)}`;
415
+ let rawValue = eq >= 0 ? token.slice(eq + 1) : undefined;
416
+ if (def.type === 'boolean') {
417
+ options[def.name] = negated ? false : rawValue === undefined ? true : parseBoolean(rawValue);
418
+ }
419
+ else {
420
+ if (rawValue === undefined) {
421
+ if (def.valueOptional) {
422
+ options[def.name] = true;
423
+ continue;
424
+ }
425
+ i += 1;
426
+ rawValue = rawArgs[i];
427
+ }
428
+ if (rawValue === undefined)
429
+ return `选项 --${optName} 缺少取值`;
430
+ options[def.name] = parseOptionValue(def, rawValue, options[def.name]);
431
+ }
432
+ continue;
433
+ }
434
+ if (token.startsWith('-') && token.length > 1) {
435
+ const alias = token.slice(1);
436
+ const def = findOption(cmd.options, alias);
437
+ if (!def)
438
+ return `未知选项: -${alias}\n\n${this.formatUsage(cmd)}`;
439
+ if (def.type === 'boolean') {
440
+ options[def.name] = true;
441
+ }
442
+ else {
443
+ i += 1;
444
+ const rawValue = rawArgs[i];
445
+ if (rawValue === undefined) {
446
+ if (def.valueOptional) {
447
+ options[def.name] = true;
448
+ continue;
449
+ }
450
+ return `选项 -${alias} 缺少取值`;
451
+ }
452
+ options[def.name] = parseOptionValue(def, rawValue, options[def.name]);
453
+ }
454
+ continue;
455
+ }
456
+ positionalTokens.push(token);
457
+ }
458
+ for (const o of cmd.options) {
459
+ if (o.required && options[o.name] === undefined)
460
+ return `缺少必填选项: --${o.name}`;
461
+ }
462
+ const positionals = [];
463
+ let cursor = 0;
464
+ for (const def of cmd.positionalArgs) {
465
+ const values = def.type === 'text' ? positionalTokens.slice(cursor) : positionalTokens.slice(cursor, cursor + 1);
466
+ if (values.length === 0) {
467
+ if (def.required)
468
+ return `缺少必填参数: ${def.name}`;
469
+ positionals.push(undefined);
470
+ continue;
471
+ }
472
+ positionals.push(parsePositionalValue(def, values));
473
+ cursor += values.length;
474
+ }
475
+ return { positionals, options };
476
+ }
477
+ defaultOptions(opts) {
478
+ const out = {};
479
+ for (const o of opts)
480
+ if (o.default !== undefined)
481
+ out[o.name] = o.default;
482
+ return out;
483
+ }
484
+ }
485
+ // ============================================================================
486
+ // 工具函数
487
+ // ============================================================================
488
+ function unique(values) {
489
+ return [...new Set(values.filter(Boolean))];
490
+ }
491
+ function tokenize(input) {
492
+ const tokens = [];
493
+ let current = '';
494
+ let quote;
495
+ let escaped = false;
496
+ for (const ch of input) {
497
+ if (escaped) {
498
+ current += ch;
499
+ escaped = false;
500
+ continue;
501
+ }
502
+ if (ch === '\\') {
503
+ escaped = true;
504
+ continue;
505
+ }
506
+ if (quote) {
507
+ if (ch === quote)
508
+ quote = undefined;
509
+ else
510
+ current += ch;
511
+ continue;
512
+ }
513
+ if (ch === '"' || ch === "'") {
514
+ quote = ch;
515
+ continue;
516
+ }
517
+ if (/\s/.test(ch)) {
518
+ if (current) {
519
+ tokens.push(current);
520
+ current = '';
521
+ }
522
+ continue;
523
+ }
524
+ current += ch;
525
+ }
526
+ if (current)
527
+ tokens.push(current);
528
+ return tokens;
529
+ }
530
+ /**
531
+ * 解析命令名字符串:
532
+ * 'memory.clear.all <key:string> [value:text]'
533
+ * → name = 'memory.clear.all'
534
+ * positionalArgs = [{name:'key', type:'string', required:true}, {name:'value', type:'text', required:false}]
535
+ */
536
+ function parseCommandName(raw) {
537
+ const trimmed = raw.trim();
538
+ const parts = trimmed.split(/\s+/);
539
+ const name = parts[0];
540
+ const positionalArgs = [];
541
+ for (const part of parts.slice(1)) {
542
+ const m = part.match(/^([<[])([a-z][a-z0-9-]*)(?::([a-z]+))?([>\]])$/i);
543
+ if (!m)
544
+ throw new Error(`无法解析位置参数: "${part}",期望 <name:type> 或 [name:type]`);
545
+ const required = m[1] === '<';
546
+ const argName = m[2];
547
+ const type = (m[3] ?? 'string');
548
+ if (m[1] === '<' ? m[4] !== '>' : m[4] !== ']') {
549
+ throw new Error(`位置参数括号不匹配: "${part}"`);
550
+ }
551
+ if (!isPositionalType(type))
552
+ throw new Error(`未知位置参数类型: "${type}"`);
553
+ positionalArgs.push({ name: argName, type, required });
554
+ }
555
+ return { name, positionalArgs };
556
+ }
557
+ function isPositionalType(t) {
558
+ return t === 'string' || t === 'number' || t === 'boolean' || t === 'text';
559
+ }
560
+ function validateName(name) {
561
+ const parts = name.split('.');
562
+ for (const p of parts)
563
+ validateNameSegment(p);
564
+ }
565
+ function validateNameSegment(seg) {
566
+ if (!NAME_SEGMENT_RE.test(seg)) {
567
+ throw new Error(`非法命令名段: "${seg}"。期望小写字母开头,仅含 [a-z0-9-]`);
568
+ }
569
+ }
570
+ /**
571
+ * 解析选项 syntax:
572
+ * '-v' → boolean flag, alias='v'
573
+ * '-p <page:number>' → number 选项, alias='p', 必带值, valueName='page'
574
+ * '-p [page:number]' → number 选项, alias='p', 值可选
575
+ * '<page:number>' → 仅长名,必带值
576
+ * '' → boolean flag, 仅长名
577
+ */
578
+ function parseOptionSyntax(name, syntax, opts) {
579
+ validateNameSegment(name);
580
+ const trimmed = (syntax ?? '').trim();
581
+ const aliases = [];
582
+ let type = 'boolean';
583
+ let valueName;
584
+ let takesValue = false;
585
+ let valueOptional = false;
586
+ if (trimmed) {
587
+ const parts = trimmed.split(/\s+/);
588
+ for (const p of parts) {
589
+ // 别名:-x 或 --foo
590
+ if (p.startsWith('--') && p.length > 2) {
591
+ aliases.push(p.slice(2));
592
+ continue;
593
+ }
594
+ if (p.startsWith('-') && p.length > 1 && !/^[<[]/.test(p)) {
595
+ aliases.push(p.slice(1));
596
+ continue;
597
+ }
598
+ // 值占位符
599
+ const m = p.match(/^([<[])([a-z][a-z0-9-]*)(?::([a-z]+(?:\[\])?))?([>\]])$/i);
600
+ if (m) {
601
+ valueOptional = m[1] === '[';
602
+ valueName = m[2];
603
+ const declared = (m[3] ?? 'string').toLowerCase();
604
+ if (declared !== 'string' && declared !== 'number' && declared !== 'boolean' && declared !== 'string[]') {
605
+ throw new Error(`未知选项值类型: "${declared}"`);
606
+ }
607
+ type = declared;
608
+ takesValue = true;
609
+ if (m[1] === '<' ? m[4] !== '>' : m[4] !== ']') {
610
+ throw new Error(`选项值括号不匹配: "${p}"`);
611
+ }
612
+ }
613
+ }
614
+ }
615
+ return {
616
+ name,
617
+ aliases,
618
+ type,
619
+ valueName,
620
+ takesValue,
621
+ valueOptional,
622
+ description: opts?.description,
623
+ default: opts?.default,
624
+ required: opts?.required === true,
625
+ choices: opts?.choices,
626
+ };
627
+ }
628
+ function findOption(defs, nameOrAlias) {
629
+ return defs.find(o => o.name === nameOrAlias || o.aliases.includes(nameOrAlias));
630
+ }
631
+ function parseBoolean(value) {
632
+ const v = value.trim().toLowerCase();
633
+ return v === '1' || v === 'true' || v === 'yes' || v === 'on';
634
+ }
635
+ function parseOptionValue(def, rawValue, previous) {
636
+ if (def.type === 'number')
637
+ return Number(rawValue);
638
+ if (def.type === 'boolean')
639
+ return parseBoolean(rawValue);
640
+ if (def.type === 'string[]') {
641
+ const current = Array.isArray(previous) ? previous : [];
642
+ return [
643
+ ...current,
644
+ ...rawValue
645
+ .split(',')
646
+ .map(s => s.trim())
647
+ .filter(Boolean),
648
+ ];
649
+ }
650
+ // string
651
+ if (def.choices && !def.choices.includes(rawValue)) {
652
+ throw new Error(`选项 --${def.name} 只能是: ${def.choices.join(', ')}`);
653
+ }
654
+ return rawValue;
655
+ }
656
+ function parsePositionalValue(def, values) {
657
+ const raw = def.type === 'text' ? values.join(' ') : values[0];
658
+ if (def.type === 'number')
659
+ return Number(raw);
660
+ if (def.type === 'boolean')
661
+ return parseBoolean(raw);
662
+ return raw;
663
+ }
664
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ConfigSchema, Context } from '@aalis/core';
2
+ export declare const name = "@aalis/plugin-commands";
3
+ export declare const displayName = "\u5185\u7F6E\u6307\u4EE4";
4
+ export declare const subsystem = "core";
5
+ export declare const provides: string[];
6
+ export declare const inject: {
7
+ required: string[];
8
+ optional: string[];
9
+ };
10
+ export declare const configSchema: ConfigSchema;
11
+ export declare const defaultConfig: {
12
+ commandPrefix: string;
13
+ };
14
+ export declare function apply(ctx: Context, config: Record<string, unknown>): void;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAcrE,eAAO,MAAM,IAAI,2BAA2B,CAAC;AAC7C,eAAO,MAAM,WAAW,6BAAS,CAAC;AAClC,eAAO,MAAM,SAAS,SAAS,CAAC;AAChC,eAAO,MAAM,QAAQ,UAAe,CAAC;AACrC,eAAO,MAAM,MAAM;;;CAGlB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,YAO1B,CAAC;AAEF,eAAO,MAAM,aAAa;;CAEzB,CAAC;AAiEF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CA2TzE"}
package/dist/index.js ADDED
@@ -0,0 +1,372 @@
1
+ import { useCommandService } from '@aalis/plugin-commands-api';
2
+ import { useDoctorService } from '@aalis/plugin-doctor-api';
3
+ import { INBOUND_PHASE } from '@aalis/plugin-gateway-api';
4
+ import { createStorageGateway } from '@aalis/plugin-storage-api';
5
+ import { CommandRegistry } from './commands.js';
6
+ // ===== 插件元数据 =====
7
+ export const name = '@aalis/plugin-commands';
8
+ export const displayName = '内置指令';
9
+ export const subsystem = 'core';
10
+ export const provides = ['commands'];
11
+ export const inject = {
12
+ required: ['gateway'],
13
+ optional: ['doctor'],
14
+ };
15
+ export const configSchema = {
16
+ commandPrefix: {
17
+ type: 'string',
18
+ label: '指令前缀',
19
+ default: '/',
20
+ description: '指令触发前缀,设为空字符串可使用纯关键词触发',
21
+ },
22
+ };
23
+ export const defaultConfig = {
24
+ commandPrefix: '/',
25
+ };
26
+ // ===== 插件入口 =====
27
+ /**
28
+ * 删除目录及内部所有内容,返回顶层子项数(用于"清了 N 张/N 个会话"提示)。
29
+ * 目录不存在返回 -1。
30
+ */
31
+ async function removeDirCounted(storage, dirUri) {
32
+ try {
33
+ const st = await storage.stat(dirUri);
34
+ if (!st.isDirectory)
35
+ return -1;
36
+ const list = await storage.list(dirUri);
37
+ await storage.delete(dirUri);
38
+ return list.entries.length;
39
+ }
40
+ catch (err) {
41
+ const msg = err instanceof Error ? err.message : String(err);
42
+ if (/ENOENT|not found|不存在/i.test(msg))
43
+ return -1;
44
+ throw err;
45
+ }
46
+ }
47
+ const CLEAR_TYPES = [
48
+ { id: 'context', label: '消息历史与会话上下文' },
49
+ { id: 'summary', label: '会话摘要' },
50
+ { id: 'vector', label: '向量记忆' },
51
+ { id: 'image', label: '图片缓存' },
52
+ { id: 'persona', label: '会话角色状态' },
53
+ { id: 'user-profile', label: '用户档案(仅全局清理)' },
54
+ ];
55
+ const CLEAR_TYPE_ALIASES = {
56
+ history: 'context',
57
+ messages: 'context',
58
+ profile: 'user-profile',
59
+ profiles: 'user-profile',
60
+ };
61
+ function normalizeClearTypes(raw) {
62
+ const values = Array.isArray(raw) ? raw : typeof raw === 'string' ? [raw] : [];
63
+ const types = values
64
+ .flatMap(v => String(v).split(','))
65
+ .map(v => v.trim())
66
+ .filter(Boolean)
67
+ .map(v => CLEAR_TYPE_ALIASES[v] ?? v);
68
+ if (types.length === 0 || types.includes('all'))
69
+ return undefined;
70
+ const known = new Set(CLEAR_TYPES.map(t => t.id));
71
+ const unknown = types.find(t => !known.has(t));
72
+ if (unknown)
73
+ throw new Error(`未知清理类型: ${unknown}。可用类型: all, ${CLEAR_TYPES.map(t => t.id).join(', ')}`);
74
+ return [...new Set(types)];
75
+ }
76
+ function renderClearTypeList() {
77
+ return [
78
+ '**可清理类型:**',
79
+ '',
80
+ ...CLEAR_TYPES.map(type => `- ${type.id}: ${type.label}`),
81
+ '',
82
+ '示例:',
83
+ '- /clear --type context,summary',
84
+ '- /clear -t vector -t image',
85
+ '- /clear all --type all',
86
+ ].join('\n');
87
+ }
88
+ export function apply(ctx, config) {
89
+ // 创建指令注册表并注册为服务
90
+ const commands = new CommandRegistry(ctx.logger);
91
+ const storage = createStorageGateway(ctx);
92
+ // 加载指令覆盖配置
93
+ const cmdOverrides = ctx.config.get('commandOverrides');
94
+ if (cmdOverrides)
95
+ commands.loadOverrides(cmdOverrides);
96
+ // 配置指令系统
97
+ commands.prefix = config.commandPrefix ?? '/';
98
+ // 注册服务
99
+ ctx.provide('commands', commands);
100
+ // ===== 统一 memory:clear 中间件:图片缓存清理 =====
101
+ //
102
+ // 之前图片缓存清理只内联在 /clear 的 runClear 路径里,导致 deleteSession
103
+ // 触发的 memory:clear 不会清图片,文件泄漏。改为独立 middleware 后,
104
+ // /clear 与 deleteSession 走同一处理路径。
105
+ ctx.middleware('memory:clear', async (data, next) => {
106
+ if (data.types && !data.types.includes('image')) {
107
+ await next();
108
+ return;
109
+ }
110
+ try {
111
+ if (data.scope === 'all') {
112
+ const removed = await removeDirCounted(storage, 'data:/images');
113
+ data.results.push({
114
+ source: 'image-cache',
115
+ success: true,
116
+ message: removed >= 0 ? `所有图片缓存已清空(${removed} 个会话目录)` : '图片缓存目录不存在,无需清空',
117
+ });
118
+ }
119
+ else if (data.sessionId) {
120
+ const safeSessionId = data.sessionId.replace(/[:/\\]/g, '_');
121
+ const removed = await removeDirCounted(storage, `data:/images/${safeSessionId}`);
122
+ data.results.push({
123
+ source: 'image-cache',
124
+ success: true,
125
+ message: removed >= 0 ? `当前会话图片缓存已清空(${removed} 张)` : '当前会话无图片缓存',
126
+ });
127
+ }
128
+ }
129
+ catch (err) {
130
+ const msg = err instanceof Error ? err.message : String(err);
131
+ data.results.push({ source: 'image-cache', success: false, message: `图片缓存清空失败: ${msg}` });
132
+ }
133
+ await next();
134
+ });
135
+ // ===== inbound:command 相位:命令命中则执行并中断后续相位 =====
136
+ //
137
+ // 历史上 OneBot 适配器内联拦截命令;现已迁移到 inbound:command 命名相位,
138
+ // 所有平台共享同一套命令解析路径。
139
+ // plugin-gateway 的 INBOUND_PHASE_ORDER 把本相位放在 flow / trigger 之前。
140
+ //
141
+ // 受信任系统源:scheduler 等内部触发器写入 message.source。
142
+ // 这些来源的权限身份来自创建时固化的 message.actor(如 scheduler 在 setJob 时
143
+ // snapshot 创建者身份),守卫按 actor 的真实等级评估——与普通用户走同一闸门,
144
+ // 不再有任何绕过路径(历史上的 bypassGuard 全绕过已废除)。
145
+ // skipSafetyCheck 仍然需要:cron 上下文无人可点 dangerous 确认弹窗。
146
+ // 同时这些 source 通常指向 internal 虚拟 session(无适配器接收),
147
+ // 因此结果不走 outbound 而是写日志,避免发到虚空。
148
+ const TRUSTED_SYSTEM_SOURCES = new Set(['scheduler', 'workflow', 'system']);
149
+ ctx.middleware(INBOUND_PHASE.COMMAND, async (data, next) => {
150
+ const { message } = data;
151
+ // 内部触发(idle-trigger 等无 userId)不参与命令解析
152
+ if (!message.content)
153
+ return next();
154
+ const parsed = commands.parseCommand(message.content);
155
+ if (!parsed)
156
+ return next();
157
+ // 解析到 "<prefix>foo" 但没有任何插件注册过该指令 → 当作普通消息处理
158
+ // (归档、trigger、agent 等下游相位继续工作),避免对错字/打字噪音回显"未知指令"。
159
+ if (!commands.hasMatch(parsed.name, parsed.args))
160
+ return next();
161
+ const isSystemTrigger = !!message.source && TRUSTED_SYSTEM_SOURCES.has(message.source);
162
+ try {
163
+ // 优先用 actor(系统触发器注入的代理身份),fallback 到消息原始身份。
164
+ // 与 agent 工具调用路径(plugin-agent resolveToolCallContext)同语义。
165
+ const result = await commands.execute(parsed.name, {
166
+ sessionId: message.sessionId,
167
+ platform: message.actor?.platform ?? message.platform,
168
+ userId: message.actor?.userId ?? message.userId,
169
+ sessionType: message.sessionType,
170
+ args: parsed.args,
171
+ raw: parsed.raw,
172
+ skipSafetyCheck: isSystemTrigger,
173
+ });
174
+ if (result) {
175
+ if (isSystemTrigger) {
176
+ // 系统触发器(scheduler/workflow)的 sessionId 通常是 internal 虚拟 session,
177
+ // 走 outbound 也无人接收;直接写日志便于排查。
178
+ const preview = result.length > 500 ? `${result.slice(0, 500)}…` : result;
179
+ ctx.logger.info(`[${message.source}] ${parsed.raw} → session=${message.sessionId} 结果:\n${preview}`);
180
+ }
181
+ else {
182
+ const gateway = ctx.getService('gateway');
183
+ const reply = {
184
+ content: result,
185
+ sessionId: message.sessionId,
186
+ platform: message.platform,
187
+ source: 'command',
188
+ };
189
+ if (gateway) {
190
+ await gateway.dispatchOutbound(reply);
191
+ }
192
+ else {
193
+ await ctx.emit('outbound:message', reply);
194
+ }
195
+ }
196
+ }
197
+ }
198
+ catch (err) {
199
+ ctx.logger.warn(`指令执行失败: ${err}`);
200
+ }
201
+ // 命令命中:不调用 next() —— 整个入站管道立即停止(不再进入 flow/trigger/dispatch)
202
+ });
203
+ // ===== 内置指令 =====
204
+ useCommandService(ctx)
205
+ .command('help', '显示可用指令列表')
206
+ .action(async () => {
207
+ const nodes = commands.getAll();
208
+ const lines = ['**可用指令:**', ''];
209
+ for (const n of nodes) {
210
+ const depth = n.name.split('.').length - 1;
211
+ const indent = ' '.repeat(depth);
212
+ const display = depth === 0 ? `\`${commands.prefix}${n.name}\`` : `\`${n.name.split('.').pop()}\``;
213
+ const tag = n.isGroup ? '(分组)' : '';
214
+ lines.push(`${indent}- ${display} — ${n.description}${tag}`);
215
+ }
216
+ return lines.join('\n');
217
+ });
218
+ useCommandService(ctx)
219
+ .command('status', '显示系统状态')
220
+ .action(async () => {
221
+ const lines = ['**系统状态:**', ''];
222
+ const checks = [
223
+ ['WebUI Server', ctx.hasService('webui-server')],
224
+ ['CLI', ctx.hasService('cli')],
225
+ ['LLM 服务', ctx.hasService('llm')],
226
+ ['Agent', ctx.hasService('agent')],
227
+ ['记忆服务', ctx.hasService('memory')],
228
+ ['人格服务', ctx.hasService('persona')],
229
+ ['Embedding', ctx.hasService('embedding')],
230
+ ['向量库', ctx.hasService('vectorstore')],
231
+ ];
232
+ for (const [label, ok] of checks) {
233
+ lines.push(`- ${label}: ${ok ? '✅ 可用' : '❌ 不可用'}`);
234
+ }
235
+ const tools = ctx.getService('tools');
236
+ lines.push(`- 已注册工具: ${tools ? tools.getAll().length : 0} 个`);
237
+ lines.push(`- 已注册指令: ${commands.getAll().length} 个`);
238
+ return lines.join('\n');
239
+ });
240
+ useCommandService(ctx)
241
+ .command('shutdown', '关闭应用', { authority: 5, safety: 'dangerous' })
242
+ .action(async () => {
243
+ const app = ctx.getService('app');
244
+ if (!app)
245
+ return '无法访问应用服务';
246
+ setTimeout(async () => {
247
+ await app.stop();
248
+ process.exit(0);
249
+ }, 500);
250
+ return '正在关闭应用…';
251
+ });
252
+ useCommandService(ctx)
253
+ .command('restart', '重启应用', { authority: 5, safety: 'dangerous' })
254
+ .action(async () => {
255
+ const app = ctx.getService('app');
256
+ if (!app)
257
+ return '无法访问应用服务';
258
+ app.restart();
259
+ return '正在重启应用…';
260
+ });
261
+ async function runClear(cmdCtx, scope, types) {
262
+ const isGlobal = scope === 'all';
263
+ const clearData = {
264
+ scope,
265
+ types,
266
+ sessionId: cmdCtx.sessionId,
267
+ results: [],
268
+ rollbacks: [],
269
+ };
270
+ await ctx.hooks.run('memory:clear', clearData, async () => {
271
+ const memory = ctx.getService('memory');
272
+ if (!memory) {
273
+ clearData.results.push({ source: 'memory', success: false, message: '记忆服务不可用' });
274
+ return;
275
+ }
276
+ if (!types || types.includes('context')) {
277
+ try {
278
+ if (isGlobal && memory.clearAll) {
279
+ await memory.clearAll();
280
+ clearData.results.push({ source: 'memory', success: true, message: '所有消息历史和归档已清空' });
281
+ }
282
+ else {
283
+ await memory.clearSession(cmdCtx.sessionId);
284
+ clearData.results.push({ source: 'memory', success: true, message: '当前会话消息历史已清空' });
285
+ }
286
+ }
287
+ catch (err) {
288
+ const msg = err instanceof Error ? err.message : String(err);
289
+ clearData.results.push({ source: 'memory', success: false, message: `清空失败: ${msg}` });
290
+ }
291
+ }
292
+ // 图片缓存与 vectorstore/persona/user-profile 等子系统的清理
293
+ // 现在统一由各自的 memory:clear middleware 处理(见 apply() 末尾的
294
+ // image-cache middleware)。runClear 仅负责调度 hook 与处理 memory 主体。
295
+ });
296
+ const hasFailure = clearData.results.some(r => !r.success);
297
+ if (hasFailure && clearData.rollbacks.length > 0) {
298
+ const rollbackResults = [];
299
+ for (const rb of clearData.rollbacks) {
300
+ try {
301
+ await rb.fn();
302
+ rollbackResults.push(`↩ ${rb.source}: 已回滚`);
303
+ }
304
+ catch (err) {
305
+ const msg = err instanceof Error ? err.message : String(err);
306
+ rollbackResults.push(`↩ ${rb.source}: 回滚失败 - ${msg}`);
307
+ }
308
+ }
309
+ return [
310
+ ...clearData.results.map(r => `${r.success ? '✅' : '❌'} ${r.message}`),
311
+ '',
312
+ '**部分清除失败,已执行回滚:**',
313
+ ...rollbackResults,
314
+ ].join('\n');
315
+ }
316
+ if (clearData.results.length === 0)
317
+ return '无可清除的记忆模块。';
318
+ return clearData.results.map(r => `${r.success ? '✅' : '⚠'} ${r.message}`).join('\n');
319
+ }
320
+ async function runClearFromOptions(argv, scope) {
321
+ let types;
322
+ try {
323
+ types = normalizeClearTypes(argv.options.type);
324
+ }
325
+ catch (err) {
326
+ return err instanceof Error ? err.message : String(err);
327
+ }
328
+ return runClear({ sessionId: argv.session.sessionId }, scope, types);
329
+ }
330
+ const clearTypeOptDesc = `清理类型,可重复或用逗号分隔。可用: all, ${CLEAR_TYPES.map(t => t.id).join(', ')}`;
331
+ useCommandService(ctx)
332
+ .command('clear', '清空当前会话记忆;用 --type 选择消息、摘要、向量、图片等清理类型')
333
+ .option('type', '-t <type:string[]>', { description: clearTypeOptDesc })
334
+ .example('/clear')
335
+ .example('/clear --type context,summary')
336
+ .example('/clear -t vector -t image')
337
+ .example('/clear all --type all')
338
+ .action(async (argv) => runClearFromOptions(argv, 'session'));
339
+ useCommandService(ctx)
340
+ .command('clear.list', '列出可清理类型')
341
+ .action(async () => renderClearTypeList());
342
+ useCommandService(ctx)
343
+ .command('clear.all', '【危险】按 --type 清空全部会话;未指定类型时清空全部类型', {
344
+ authority: 3,
345
+ safety: 'dangerous',
346
+ })
347
+ .option('type', '-t <type:string[]>', { description: clearTypeOptDesc })
348
+ .action(async (argv) => runClearFromOptions(argv, 'all'));
349
+ // 诊断检查项:检测 commandOverrides 配置中是否存在已不存在的指令名(孤立键)。
350
+ // 历史上由 plugin-doctor 内置;现迁回 commands 自身——commands 才知道自己注册了哪些指令,
351
+ // 也最有资格判定 override 是否「孤立」。
352
+ useDoctorService(ctx).registerCheck({
353
+ id: 'commands.overrides',
354
+ category: 'config',
355
+ pluginName: name,
356
+ run() {
357
+ const overrides = commands.getOverrides();
358
+ const known = new Set(commands.getAll().map(c => c.name));
359
+ const orphan = Object.keys(overrides).filter(k => !known.has(k));
360
+ return {
361
+ id: 'commands.overrides',
362
+ category: 'config',
363
+ level: orphan.length === 0 ? 'ok' : 'warn',
364
+ message: orphan.length === 0
365
+ ? `已注册指令 ${known.size} 个;覆盖配置 ${Object.keys(overrides).length} 条全部命中`
366
+ : `commandOverrides 含 ${orphan.length} 条孤立键(无对应指令)`,
367
+ detail: orphan.length > 0 ? orphan.join(', ') : undefined,
368
+ };
369
+ },
370
+ });
371
+ }
372
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@aalis/plugin-commands",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "keywords": [
6
+ "aalis-plugin"
7
+ ],
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "dependencies": {
14
+ "@aalis/plugin-commands-api": "^0.1.0",
15
+ "@aalis/plugin-doctor-api": "^0.1.0",
16
+ "@aalis/plugin-gateway-api": "^0.1.0",
17
+ "@aalis/plugin-storage-api": "^0.1.0"
18
+ },
19
+ "devDependencies": {
20
+ "@types/node": "^22.0.0",
21
+ "typescript": "^5.7.0",
22
+ "@aalis/plugin-authority-api": "0.1.0",
23
+ "@aalis/plugin-memory-api": "0.1.0",
24
+ "@aalis/core": "0.1.0",
25
+ "@aalis/plugin-tools-api": "0.1.0"
26
+ },
27
+ "peerDependencies": {
28
+ "@aalis/core": "^0.1.0"
29
+ },
30
+ "aalis": {
31
+ "service": {
32
+ "required": [
33
+ "gateway"
34
+ ],
35
+ "optional": [
36
+ "doctor"
37
+ ],
38
+ "provides": [
39
+ "commands"
40
+ ]
41
+ }
42
+ },
43
+ "scripts": {
44
+ "build": "tsc",
45
+ "dev": "tsc --watch"
46
+ }
47
+ }