PRA-only-demo/packages/rpa-core/src/engine/registry.ts
yu 8414c4f355 feat: 平台标记单一源 PLATFORM_GROUPS + catalog 重生成 platformTag 生效
迁移前置项(指南五件小事 #1 + 第 0 步作业 #2):
- register-all.ts 新增 PLATFORM_GROUPS 单一权威表(33 域全标 win32,darwin/linux 仅类型占位)
- registerAll 逐域加载时把平台默认值落进 meta.platforms(能力显式声明优先);
  新增 buildDomainPlatformMap 供构建脚本与运行时共用同一张表
- build-catalog.mjs 删除 WIN32_GROUPS 硬编码,platformTag 从包内分组表派生(改 tsx 运行)
- 守卫测试 platform-groups.test.ts:域无缺行 / 不偷填非 win32 数据 / meta 派生一致
- catalog.json 重生成:687 个组件获得 platformTag=win32(此前从未生效)
- 源数据恢复:对面重构删了 shizai-catalog-data.js,从其历史 commit 7bc627c8 恢复到
  temp/catalog-source/(不入库)并作为回退路径
- catalog-overrides 增强 addFields 支持;把此前直接改 catalog.json 的 96 处假必填修正、
  label 修正、Screenlock 字段清理、12 个实现读取但源数据缺失的字段全部沉淀进 overrides,
  重生成后参数审计 A/B 类保持 0/0
2026-11-05 17:53:07 +08:00

84 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { CapabilityHandler } from "./types";
/**
* 能力结构化元数据(任务 4.1,决策点 8:meta 可选 + 新能力强制)。
* 老能力逐步补齐;规范 v1 验收 checklist 对新能力要求必填。
*/
export interface CapabilityParamMeta {
key: string;
label?: string;
type: "string" | "number" | "boolean" | "object" | "array";
required?: boolean;
defaultValue?: string | number | boolean | null;
description?: string;
}
/** 平台类型;现阶段只有 win32 有实现,darwin/linux 仅类型占位(dev-conventions 规则 4) */
export type CapabilityPlatform = "win32" | "darwin" | "linux";
export interface CapabilityMeta {
/** 一句话能力摘要(中文) */
summary?: string;
/** 参数 schema(按字段名列出) */
params?: CapabilityParamMeta[];
/** 返回值说明 */
returns?: string;
/** 默认超时毫秒(无外部交互语义的能力省略) */
timeoutMs?: number;
/** 可能抛出的稳定错误码(见 engine/error-codes.ts) */
errorCodes?: string[];
/** 执行中是否需要回传截图(Agent 侧视觉判断用) */
needsScreenshot?: boolean;
/** 平台限制;省略表示跨平台 */
platforms?: CapabilityPlatform[];
}
const handlers = new Map<string, CapabilityHandler>();
const metas = new Map<string, CapabilityMeta>();
export function register(ids: string | string[], handler: CapabilityHandler, meta?: CapabilityMeta): void {
const list = Array.isArray(ids) ? ids : [ids];
for (const id of list) {
handlers.set(id, handler);
if (meta) metas.set(id, meta);
}
}
export function getHandler(id: string): CapabilityHandler | undefined {
return handlers.get(id);
}
export function getCapabilityMeta(id: string): CapabilityMeta | undefined {
return metas.get(id);
}
export function hasCapability(id: string): boolean {
return handlers.has(id);
}
export function capabilityIds(): string[] {
return [...handlers.keys()];
}
export function capabilityCount(): number {
return handlers.size;
}
/**
* 给一批能力落平台默认值(来自 register-all.ts 的 PLATFORM_GROUPS 单一权威表)。
* - 空数组 = 平台无限制,不落 meta;
* - 已有 meta 且已声明 platforms 的不覆盖(能力可显式声明更窄的平台限制);
* - 无 meta 的补一个只含 platforms 的 meta。
*/
export function applyPlatformDefaults(ids: string[], platforms: CapabilityPlatform[]): void {
if (!platforms.length) return;
for (const id of ids) {
const meta = metas.get(id);
if (meta) {
if (!meta.platforms) metas.set(id, { ...meta, platforms: [...platforms] });
} else {
metas.set(id, { platforms: [...platforms] });
}
}
}