Files
openclaw/src/extension-host/runtime-backend-arbitration.ts
2026-03-15 23:15:55 +00:00

65 lines
2.6 KiB
TypeScript

import type {
ExtensionHostRuntimeBackendCatalogEntry,
ExtensionHostRuntimeBackendSubsystemId,
} from "./runtime-backend-catalog.js";
type ExtensionHostRuntimeBackendArbitrationPredicate = (
entry: ExtensionHostRuntimeBackendCatalogEntry,
) => boolean;
export function listExtensionHostRuntimeBackendCandidatesByArbitration(params: {
entries: readonly ExtensionHostRuntimeBackendCatalogEntry[];
subsystemId: ExtensionHostRuntimeBackendSubsystemId;
include?: ExtensionHostRuntimeBackendArbitrationPredicate;
}): readonly ExtensionHostRuntimeBackendCatalogEntry[] {
const include = params.include ?? (() => true);
return params.entries
.filter((entry) => entry.subsystemId === params.subsystemId && include(entry))
.toSorted((left, right) => left.defaultRank - right.defaultRank);
}
export function listExtensionHostRuntimeBackendIdsByArbitration(params: {
entries: readonly ExtensionHostRuntimeBackendCatalogEntry[];
subsystemId: ExtensionHostRuntimeBackendSubsystemId;
include?: ExtensionHostRuntimeBackendArbitrationPredicate;
}): readonly string[] {
return listExtensionHostRuntimeBackendCandidatesByArbitration(params).map(
(entry) => entry.backendId,
);
}
export function resolveExtensionHostRuntimeBackendOrderByArbitration(params: {
entries: readonly ExtensionHostRuntimeBackendCatalogEntry[];
subsystemId: ExtensionHostRuntimeBackendSubsystemId;
preferredBackendId: string;
include?: ExtensionHostRuntimeBackendArbitrationPredicate;
}): readonly string[] {
const ordered = listExtensionHostRuntimeBackendIdsByArbitration(params);
if (!ordered.includes(params.preferredBackendId)) {
return [params.preferredBackendId, ...ordered];
}
return [
params.preferredBackendId,
...ordered.filter((backendId) => backendId !== params.preferredBackendId),
];
}
export function resolveExtensionHostRuntimeBackendFallbackChainByArbitration(params: {
entries: readonly ExtensionHostRuntimeBackendCatalogEntry[];
subsystemId: ExtensionHostRuntimeBackendSubsystemId;
preferredBackendId: string;
include?: ExtensionHostRuntimeBackendArbitrationPredicate;
}): readonly string[] {
return resolveExtensionHostRuntimeBackendOrderByArbitration(params);
}
export function resolveExtensionHostDefaultRuntimeBackendIdByArbitration(params: {
entries: readonly ExtensionHostRuntimeBackendCatalogEntry[];
subsystemId: ExtensionHostRuntimeBackendSubsystemId;
include?: ExtensionHostRuntimeBackendArbitrationPredicate;
fallbackBackendId?: string;
}): string | undefined {
const ordered = listExtensionHostRuntimeBackendIdsByArbitration(params);
return ordered[0] ?? params.fallbackBackendId;
}