@zhin.js/command 1.1.10 → 1.1.11

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.
@@ -2,6 +2,8 @@ import { operationClientAdapter } from '@zhin.js/feature-kit';
2
2
  import { explainPermitRules, toPermissionSubject, type PermissionSubject, type PermissionConditionExplanation } from '@zhin.js/permission';
3
3
  import { resolveCommandSender, resolveCommandSession, type CommandMessage } from './definition.js';
4
4
  import type { CommandDescriptor } from './command-index.js';
5
+ import { resolveLocale, type Locale } from '@zhin.js/plugin-runtime';
6
+ import { commandMessages } from './messages.js';
5
7
 
6
8
  /** The exact subject projection used by the real command permit gate. No factories or checkers run. */
7
9
  export function toCommandPermissionSubject(source: unknown): PermissionSubject {
@@ -20,8 +22,9 @@ export type CommandPermissionHostStatus = 'present' | 'missing' | 'unverified';
20
22
  /** Read-only hypothetical conditions. A match is not permission to execute the command. */
21
23
  export function explainCommandPermissions(
22
24
  command: Pick<CommandDescriptor, 'adapter' | 'permit'>,
23
- options: Readonly<{ source?: unknown; rolesKnown?: boolean; permissionHost: CommandPermissionHostStatus }>,
25
+ options: Readonly<{ source?: unknown; rolesKnown?: boolean; permissionHost: CommandPermissionHostStatus; locale?: Locale }>,
24
26
  ) {
27
+ const locale = resolveLocale(options.locale);
25
28
  const projected = toCommandPermissionSubject(options.source);
26
29
  const inputSender = options.source && typeof options.source === 'object'
27
30
  ? (options.source as Pick<CommandMessage, 'sender'>).sender : undefined;
@@ -36,23 +39,23 @@ export function explainCommandPermissions(
36
39
  && subject.sender?.role.length === 1 && subject.sender.role[0] === 'user';
37
40
  const actualAdapter = operationClientAdapter(options.source);
38
41
  const adapter: PermissionConditionExplanation = !command.adapter
39
- ? { outcome: 'not_evaluated', reason: '命令未声明 adapter 约束' }
40
- : !actualAdapter ? { outcome: 'unknown', reason: '未选择当前 Endpoint,无法判断命令的精确 adapter 约束' }
41
- : { outcome: commandAdapterMatches(command, options.source) ? 'match' : 'mismatch', reason: '命令 adapter 与当前 Endpoint 声明的原生适配器精确比较;未探测在线状态' };
42
- const rules = explainPermitRules(command.permit ?? [], subject, { rolesKnown: options.rolesKnown });
42
+ ? { outcome: 'not_evaluated', reason: commandMessages(locale, 'noAdapter') }
43
+ : !actualAdapter ? { outcome: 'unknown', reason: commandMessages(locale, 'missingEndpoint') }
44
+ : { outcome: commandAdapterMatches(command, options.source) ? 'match' : 'mismatch', reason: commandMessages(locale, 'adapterComparison') };
45
+ const rules = explainPermitRules(command.permit ?? [], subject, { rolesKnown: options.rolesKnown, locale });
43
46
  const conditions = [...(command.adapter ? [adapter] : []), ...rules];
44
47
  let summary: PermissionConditionExplanation;
45
- if (conditions.some(item => item.outcome === 'mismatch')) summary = { outcome: 'mismatch', reason: '至少一个声明条件与假设输入不符;这不是实际准入检查' };
48
+ if (conditions.some(item => item.outcome === 'mismatch')) summary = { outcome: 'mismatch', reason: commandMessages(locale, 'conditionMismatch') };
46
49
  else if ((rules.length > 0 && options.permissionHost !== 'present') || conditions.some(item => item.outcome === 'unknown')) {
47
50
  summary = { outcome: 'unknown', reason: rules.length > 0 && options.permissionHost !== 'present'
48
- ? 'PermissionHost 缺失或无法确认;不能推断命令可执行' : '存在缺少依据的条件,不能推断命令可执行' };
49
- } else if (rules.length === 0) summary = { outcome: 'not_evaluated', reason: '命令未声明 permit 限制;这不表示已获得执行权限' };
50
- else if (conditions.some(item => item.outcome === 'not_evaluated')) summary = { outcome: 'not_evaluated', reason: '存在未执行的平台或自定义条件,不能推断命令可执行' };
51
- else summary = { outcome: 'match', reason: '已解释的 builtin 条件与假设输入匹配;不代表真实授权或命令可执行' };
51
+ ? commandMessages(locale, 'missingPermissionHost') : commandMessages(locale, 'missingEvidence') };
52
+ } else if (rules.length === 0) summary = { outcome: 'not_evaluated', reason: commandMessages(locale, 'noPermit') };
53
+ else if (conditions.some(item => item.outcome === 'not_evaluated')) summary = { outcome: 'not_evaluated', reason: commandMessages(locale, 'uncheckedConditions') };
54
+ else summary = { outcome: 'match', reason: commandMessages(locale, 'conditionsMatch') };
52
55
  return Object.freeze({ permissionHost: options.permissionHost, adapter: Object.freeze(adapter), rules, summary: Object.freeze(summary),
53
- unconstrained: Object.freeze(['已解释的 builtin 规则不检查具体 Endpoint、parent 或 thread;保留完整目标不等于这些维度受规则限制']),
54
- assumptions: Object.freeze(['身份与角色仅用于模拟,未向平台核实', '未执行命令、动态默认值、平台或自定义 checker',
56
+ unconstrained: Object.freeze([commandMessages(locale, 'unconstrained')]),
57
+ assumptions: Object.freeze([commandMessages(locale, 'simulatedIdentity'), commandMessages(locale, 'unevaluatedCode'),
55
58
  ...(defaultedRoles
56
- ? ['canonical 输入未附角色时按命令运行时默认 user 解释;这不是已核验的平台角色'] : [])]),
59
+ ? [commandMessages(locale, 'defaultedRole')] : [])]),
57
60
  });
58
61
  }
package/src/provider.ts CHANGED
@@ -311,7 +311,7 @@ const commandFeature = defineFeatureProvider({
311
311
  const rawKeyword = rootConfig?.menuKeyword;
312
312
  const menu = rawKeyword === false || rawKeyword === ''
313
313
  ? undefined
314
- : { keyword: typeof rawKeyword === 'string' ? rawKeyword : '菜单' };
314
+ : typeof rawKeyword === 'string' ? { keyword: rawKeyword } : {};
315
315
  return { value: new CommandIndex(slots, context.snapshot, menu) };
316
316
  },
317
317
  },