openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
180 lines (179 loc) • 9.34 kB
JavaScript
import { T as tryResolveConfiguredAgentWorkspaceDir } from "./agent-scope-config-DcbEhP0R.js";
import { n as resolveDefaultAgentWorkspaceDir } from "./workspace-default-DPT1Dhad.js";
import { i as getGatewayPluginMetadataSnapshot } from "./current-plugin-metadata-state-B1UoAr4G.js";
import { f as extractPluginInstallRecordsFromInstalledPluginIndex } from "./installed-plugin-index-wrDsjyMD.js";
import { t as completePluginMetadataSnapshot } from "./plugin-metadata-snapshot-w-4EjxI4.js";
import "./agent-scope-DbtJyKUL.js";
import { r as listAmbientOnlyConfiguredChannelIds } from "./channel-presence-policy-_eDSlojg.js";
import { O as setActivePluginRegistry, u as getActivePluginRegistry } from "./runtime-BL4wZfTq.js";
import { t as createEmptyPluginRegistry } from "./registry-empty-55wlVNzO.js";
import { D as collectRegisteredEmbeddingProviderIds, O as collectUnregisteredConfiguredMemoryEmbeddingProviders } from "./gateway-startup-plugin-config-Bq9ZdScF.js";
import "./loader-DPiOPJjR.js";
import "./channel-plugin-ids-DIyH-LxI.js";
import { a as setPluginRuntimeLoadContext } from "./load-context-BdeWeJHL.js";
import { t as loadPluginLookUpTable } from "./plugin-lookup-table-DXuDIg4u.js";
import { f as initSubagentRegistry } from "./subagent-registry-BMJDw92y.js";
import { r as resolveGatewayStartupPluginActivationConfig } from "./plugin-activation-runtime-config-BOxF5R5M.js";
import { n as listGatewayMethods } from "./server-methods-list-BTWMuzF7.js";
//#region src/gateway/server-startup-plugins.ts
/** Returns the config snapshot used by channel/plugin startup maintenance. */
function resolveGatewayStartupMaintenanceConfig(params) {
return params.cfgAtStart.channels === void 0 && params.startupRuntimeConfig.channels !== void 0 ? {
...params.cfgAtStart,
channels: params.startupRuntimeConfig.channels
} : params.cfgAtStart;
}
/** Runs channel, session, and pairing maintenance before plugin bootstrap. */
async function runGatewayStartupMaintenance(params) {
const { assertConfiguredWorkspaceStateReady } = await import("./workspace-state-dirs-B8xySjIm.js");
assertConfiguredWorkspaceStateReady({ cfg: params.cfgAtStart });
const startupMaintenanceConfig = resolveGatewayStartupMaintenanceConfig({
cfgAtStart: params.cfgAtStart,
startupRuntimeConfig: params.startupRuntimeConfig
});
if (!params.minimalTestGateway || startupMaintenanceConfig.channels !== void 0) {
const { runChannelPluginStartupMaintenance } = await import("./lifecycle-startup-ChgWZSWU.js");
const startupTasks = [runChannelPluginStartupMaintenance({
cfg: startupMaintenanceConfig,
env: process.env,
log: params.log
})];
if (!params.minimalTestGateway) {
const { runStartupSessionMigration } = await import("./server-startup-session-migration-CXGhrUP8.js");
startupTasks.push(runStartupSessionMigration({
cfg: params.cfgAtStart,
env: process.env,
log: params.log
}));
const { migrateLegacyDevicePairingStore } = await import("./device-pairing-migration-58_k-NjV.js");
const { migrateLegacyNodePairingStore } = await import("./node-pairing-migration-B77whfwU.js");
startupTasks.push(migrateLegacyDevicePairingStore({ log: params.log }).then(() => migrateLegacyNodePairingStore({ log: params.log }).then(() => void 0, (error) => {
params.log.warn(`node pairing store migration failed: ${String(error)}`);
}), (error) => {
params.log.warn(`device pairing store migration failed: ${String(error)}`);
}));
}
await Promise.all(startupTasks);
}
}
/** Builds plugin startup state and gateway method lists before the server binds. */
async function prepareGatewayPluginBootstrap(params) {
const activationSourceConfig = params.activationSourceConfig ?? params.cfgAtStart;
initSubagentRegistry();
const gatewayPluginConfig = params.minimalTestGateway ? params.cfgAtStart : resolveGatewayStartupPluginActivationConfig({
runtimeConfig: params.cfgAtStart,
activationSourceConfig,
env: process.env,
...params.pluginMetadataSnapshot?.manifestRegistry ? { manifestRegistry: params.pluginMetadataSnapshot.manifestRegistry } : {},
discovery: params.pluginMetadataSnapshot?.discovery,
ambientEnvTriggers: params.ambientEnvTriggers
});
const pluginsGloballyDisabled = gatewayPluginConfig.plugins?.enabled === false;
const pluginWorkspaceDir = tryResolveConfiguredAgentWorkspaceDir(gatewayPluginConfig);
const defaultWorkspaceDir = pluginWorkspaceDir ?? resolveDefaultAgentWorkspaceDir();
const pluginLookUpTable = params.minimalTestGateway || pluginsGloballyDisabled ? void 0 : loadPluginLookUpTable({
config: gatewayPluginConfig,
workspaceDir: pluginWorkspaceDir,
env: process.env,
activationSourceConfig,
metadataSnapshot: params.pluginMetadataSnapshot,
workerProviderIds: params.workerProviderIds ?? [],
ambientEnvTriggers: params.ambientEnvTriggers
});
const pluginManifestRecords = pluginLookUpTable?.manifestRegistry.plugins ?? params.pluginMetadataSnapshot?.manifestRegistry.plugins ?? [];
const startupPluginIds = [...pluginLookUpTable?.startup.pluginIds ?? []];
const ambientAutostartSuppressedChannelIds = params.ambientEnvTriggers === "suppress" ? new Set(listAmbientOnlyConfiguredChannelIds({
config: params.cfgAtStart,
activationSourceConfig,
env: process.env,
includePersistedAuthState: false,
manifestRecords: pluginManifestRecords
})) : /* @__PURE__ */ new Set();
const baseMethods = listGatewayMethods();
const emptyPluginRegistry = createEmptyPluginRegistry();
const pluginRegistry = params.minimalTestGateway && !pluginsGloballyDisabled ? getActivePluginRegistry() ?? emptyPluginRegistry : emptyPluginRegistry;
const metadataSnapshot = getGatewayPluginMetadataSnapshot() ?? completePluginMetadataSnapshot({
snapshot: pluginLookUpTable ?? params.pluginMetadataSnapshot,
config: activationSourceConfig,
env: process.env,
workspaceDir: defaultWorkspaceDir
});
setPluginRuntimeLoadContext(pluginRegistry, {
rawConfig: params.cfgAtStart,
config: gatewayPluginConfig,
activationSourceConfig,
autoEnabledReasons: {},
workspaceDir: pluginWorkspaceDir,
env: process.env,
logger: params.log,
metadataSnapshot,
manifestRegistry: metadataSnapshot?.manifestRegistry,
installRecords: metadataSnapshot ? extractPluginInstallRecordsFromInstalledPluginIndex(metadataSnapshot.index) : void 0,
preferBuiltPluginArtifacts: true
});
setActivePluginRegistry(pluginRegistry);
return {
gatewayPluginConfigAtStart: gatewayPluginConfig,
defaultWorkspaceDir,
pluginWorkspaceDir,
startupPluginIds,
pluginManifestRecords,
pluginMetadataSnapshot: metadataSnapshot,
pluginLookUpTable,
baseMethods,
pluginRegistry,
baseGatewayMethods: baseMethods,
ambientAutostartSuppressedChannelIds
};
}
/**
* Warn when `memory.search.provider` selects a memory embedding provider
* that no loaded plugin registered. Without the owning plugin, `active-memory`
* cannot embed and silently falls back to keyword/FTS-only recall.
*/
function warnUnregisteredConfiguredMemoryEmbeddingProviders(params) {
const unregistered = collectUnregisteredConfiguredMemoryEmbeddingProviders({
config: params.config,
registeredProviderIds: collectRegisteredEmbeddingProviderIds(params.pluginRegistry)
});
for (const provider of unregistered) {
const path = `memory.search.${provider.source}`;
params.log.warn(`${path}="${provider.configuredId}" is configured, but no loaded plugin registered a memory embedding provider that can serve "${provider.configuredId}". Semantic memory recall will fall back to keyword/FTS-only search. Ensure the plugin that provides "${provider.configuredId}" is installed and enabled.`);
}
}
/** Loads startup plugin runtimes after the gateway listener binds. */
async function loadGatewayStartupPluginRuntime(params) {
const { loadGatewayStartupPlugins } = await import("./server-plugin-bootstrap-Dkzu2wb7.js");
await params.pluginRuntimeClaim?.waitForUnblocked();
if (params.pluginRuntimeClaim && !params.pluginRuntimeClaim.isCurrent()) {
const currentPluginRegistry = params.getCurrentPluginRegistry?.();
if (!currentPluginRegistry) throw new Error("superseded Gateway startup cannot resolve the current plugin runtime");
return {
pluginRegistry: currentPluginRegistry,
gatewayMethods: params.baseMethods
};
}
const loaded = loadGatewayStartupPlugins({
cfg: params.cfg,
activationSourceConfig: params.activationSourceConfig,
workspaceDir: params.workspaceDir,
log: params.log,
coreGatewayMethodNames: params.coreGatewayMethodNames ?? params.baseMethods,
baseMethods: params.baseMethods,
...params.hostServices !== void 0 && { hostServices: params.hostServices },
pluginIds: params.startupPluginIds,
pluginLookUpTable: params.pluginLookUpTable,
channelPluginLoadIntent: "full",
startupTrace: params.startupTrace,
ambientEnvTriggers: params.ambientEnvTriggers,
...params.resolveGatewayContext ? { resolveGatewayContext: params.resolveGatewayContext } : {}
});
warnUnregisteredConfiguredMemoryEmbeddingProviders({
config: params.cfg,
pluginRegistry: loaded.pluginRegistry,
log: params.log
});
return loaded;
}
//#endregion
export { loadGatewayStartupPluginRuntime, prepareGatewayPluginBootstrap, resolveGatewayStartupMaintenanceConfig, runGatewayStartupMaintenance, warnUnregisteredConfiguredMemoryEmbeddingProviders };