aps-agent/server/core/registry/registry.ts

60 lines
2.2 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.

/**
* 能力目录(架构设计 2 / 4:registry 模块)。
*
* 保存已注册 Provider 与它们声明的能力;上层按身份取「能力清单」(A4 起按策略过滤,
* 当前只做注册与查找)。能力目录是唯一来源——引擎的工具列表是它的投影。
*/
import type { Capability, Provider, ProviderManifest } from '@aps/provider-sdk';
export interface RegisteredProvider {
manifest: ProviderManifest;
provider: Provider;
}
export interface ResolvedCapability {
capability: Capability;
provider: Provider;
providerId: string;
}
export class CapabilityRegistry {
private readonly providers = new Map<string, RegisteredProvider>();
async register(provider: Provider): Promise<ProviderManifest> {
const manifest = await provider.describe();
if (manifest.platformVersion !== 1) {
throw new Error(`Provider ${manifest.id} 声明兼容平台版本 ${manifest.platformVersion},当前平台只支持 1`);
}
this.providers.set(manifest.id, { manifest, provider });
return manifest;
}
list(): Capability[] {
return [...this.providers.values()].flatMap((entry) => entry.manifest.capabilities);
}
resolve(capabilityId: string): ResolvedCapability | undefined {
for (const entry of this.providers.values()) {
const capability = entry.manifest.capabilities.find((item) => item.id === capabilityId);
if (capability) return { capability, provider: entry.provider, providerId: entry.manifest.id };
}
return undefined;
}
providerIds(): string[] {
return [...this.providers.keys()];
}
async health(): Promise<Array<{ providerId: string; status: string; detail?: string }>> {
const results: Array<{ providerId: string; status: string; detail?: string }> = [];
for (const [providerId, entry] of this.providers) {
try {
const health = await entry.provider.health();
results.push(health.detail === undefined ? { providerId, status: health.status } : { providerId, status: health.status, detail: health.detail });
} catch (error) {
results.push({ providerId, status: 'down', detail: error instanceof Error ? error.message : '健康探测失败' });
}
}
return results;
}
}