2026-03-16 00:53:44 +00:00

103 lines
3.7 KiB
TypeScript

import type { OpenClawConfig } from "../../config/config.js";
import type { NormalizedPluginsConfig } from "../../plugins/config-state.js";
import type { PluginCandidate } from "../../plugins/discovery.js";
import type { PluginManifestRecord } from "../../plugins/manifest-registry.js";
import type { PluginRecord, PluginRegistry } from "../../plugins/registry.js";
import type { OpenClawPluginApi, OpenClawPluginModule, PluginLogger } from "../../plugins/types.js";
import type { ExtensionHostProvenanceIndex } from "../policy/loader-provenance.js";
import { finalizeExtensionHostRegistryLoad } from "./loader-finalize.js";
import { processExtensionHostPluginCandidate } from "./loader-flow.js";
export type ExtensionHostLoaderSession = {
registry: PluginRegistry;
logger: PluginLogger;
env: NodeJS.ProcessEnv;
provenance: ExtensionHostProvenanceIndex;
cacheEnabled: boolean;
cacheKey: string;
memorySlot?: string | null;
seenIds: Map<string, PluginRecord["origin"]>;
selectedMemoryPluginId: string | null;
memorySlotMatched: boolean;
setCachedRegistry: (cacheKey: string, registry: PluginRegistry) => void;
activateRegistry: (registry: PluginRegistry, cacheKey: string) => void;
};
export function createExtensionHostLoaderSession(params: {
registry: PluginRegistry;
logger: PluginLogger;
env: NodeJS.ProcessEnv;
provenance: ExtensionHostProvenanceIndex;
cacheEnabled: boolean;
cacheKey: string;
memorySlot?: string | null;
setCachedRegistry: (cacheKey: string, registry: PluginRegistry) => void;
activateRegistry: (registry: PluginRegistry, cacheKey: string) => void;
}): ExtensionHostLoaderSession {
return {
registry: params.registry,
logger: params.logger,
env: params.env,
provenance: params.provenance,
cacheEnabled: params.cacheEnabled,
cacheKey: params.cacheKey,
memorySlot: params.memorySlot,
seenIds: new Map(),
selectedMemoryPluginId: null,
memorySlotMatched: false,
setCachedRegistry: params.setCachedRegistry,
activateRegistry: params.activateRegistry,
};
}
export function processExtensionHostLoaderSessionCandidate(params: {
session: ExtensionHostLoaderSession;
candidate: PluginCandidate;
manifestRecord: PluginManifestRecord;
normalizedConfig: NormalizedPluginsConfig;
rootConfig: OpenClawConfig;
validateOnly: boolean;
createApi: (
record: PluginRecord,
options: {
config: OpenClawConfig;
pluginConfig?: Record<string, unknown>;
hookPolicy?: { allowPromptInjection?: boolean };
},
) => OpenClawPluginApi;
loadModule: (safeSource: string) => OpenClawPluginModule;
}): void {
const processed = processExtensionHostPluginCandidate({
candidate: params.candidate,
manifestRecord: params.manifestRecord,
normalizedConfig: params.normalizedConfig,
rootConfig: params.rootConfig,
validateOnly: params.validateOnly,
logger: params.session.logger,
registry: params.session.registry,
seenIds: params.session.seenIds,
selectedMemoryPluginId: params.session.selectedMemoryPluginId,
createApi: params.createApi,
loadModule: params.loadModule,
});
params.session.selectedMemoryPluginId = processed.selectedMemoryPluginId;
params.session.memorySlotMatched ||= processed.memorySlotMatched;
}
export function finalizeExtensionHostLoaderSession(
session: ExtensionHostLoaderSession,
): PluginRegistry {
return finalizeExtensionHostRegistryLoad({
registry: session.registry,
memorySlot: session.memorySlot,
memorySlotMatched: session.memorySlotMatched,
provenance: session.provenance,
logger: session.logger,
env: session.env,
cacheEnabled: session.cacheEnabled,
cacheKey: session.cacheKey,
setCachedRegistry: session.setCachedRegistry,
activateRegistry: session.activateRegistry,
});
}