UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

393 lines (392 loc) 15.6 kB
import { i as tracePluginLifecyclePhase, n as buildPluginDependencyStatus } from "./discovery-BDSfxwT6.js"; import { o as resolveCompatibilityHostVersion } from "./version-Crcn9X9T.js"; import { r as hasKind } from "./slots-kpL659LX.js"; import { s as normalizePluginsConfig } from "./config-state-CikNNz7T.js"; import "./agent-scope-MrLta7Pq.js"; import { c as resolveDefaultAgentId, o as resolveAgentWorkspaceDir } from "./agent-scope-config-CgCYpZfK.js"; import { n as resolveDefaultAgentWorkspaceDir } from "./workspace-default-B3AjhIK3.js"; import { i as loadPluginMetadataSnapshot } from "./plugin-metadata-snapshot-Ctk9Oarq.js"; import { i as getRuntimeConfig } from "./io-Gi7-pyU-.js"; import { n as normalizeOpenClawVersionBase } from "./version-NKzkBmMs.js"; import "./config-C9RxTsn1.js"; import { t as withBundledPluginEnablementCompat } from "./bundled-compat-DLBZcHgM.js"; import { s as resolveBundledProviderCompatPluginIds } from "./plugin-auto-enable-pAtqig-B.js"; import { c as loadOpenClawPlugins } from "./loader-Dp13N9qc.js"; import { n as inspectBundleMcpRuntimeSupport } from "./bundle-mcp-BeA96PNA.js"; import { d as listImportedRuntimePluginIds } from "./runtime-B2ROiq5l.js"; import { n as listImportedBundledPluginFacadeIds } from "./facade-loader-Dp8IS24b.js"; import "./facade-runtime-BMJRpsns.js"; import { i as resolvePluginRuntimeLoadContext, t as buildPluginRuntimeLoadOptions } from "./load-context-DpVH8qxj.js"; import "./workspace-B0bmoo98.js"; import { t as inspectBundleLspRuntimeSupport } from "./bundle-lsp-BWPiW--l.js"; import { t as resolveEffectivePluginIds } from "./effective-plugin-ids-uhbbZtKh.js"; import { t as loadPluginMetadataRegistrySnapshot } from "./metadata-registry-loader-ClATmcTA.js"; import "./status-snapshot-DfN6qhDb.js"; //#region src/plugins/inspect-shape.ts function buildPluginCapabilityEntries(plugin) { return [ { kind: "cli-backend", ids: plugin.cliBackendIds ?? [] }, { kind: "text-inference", ids: plugin.providerIds }, { kind: "embedding", ids: plugin.embeddingProviderIds }, { kind: "speech", ids: plugin.speechProviderIds }, { kind: "realtime-transcription", ids: plugin.realtimeTranscriptionProviderIds }, { kind: "realtime-voice", ids: plugin.realtimeVoiceProviderIds }, { kind: "media-understanding", ids: plugin.mediaUnderstandingProviderIds }, { kind: "transcript-source", ids: plugin.transcriptSourceProviderIds }, { kind: "image-generation", ids: plugin.imageGenerationProviderIds }, { kind: "video-generation", ids: plugin.videoGenerationProviderIds }, { kind: "music-generation", ids: plugin.musicGenerationProviderIds }, { kind: "web-search", ids: plugin.webSearchProviderIds }, { kind: "agent-harness", ids: plugin.agentHarnessIds }, { kind: "context-engine", ids: plugin.status === "loaded" && hasKind(plugin.kind, "context-engine") ? plugin.contextEngineIds ?? [] : [] }, { kind: "channel", ids: plugin.channelIds } ].filter((entry) => entry.ids.length > 0); } function derivePluginInspectShape(params) { if (params.capabilityCount > 1) return "hybrid-capability"; if (params.capabilityCount === 1) return "plain-capability"; if (params.typedHookCount + params.customHookCount > 0 && params.toolCount === 0 && params.commandCount === 0 && params.cliCount === 0 && params.serviceCount === 0 && params.gatewayDiscoveryServiceCount === 0 && params.gatewayMethodCount === 0 && params.httpRouteCount === 0) return "hook-only"; return "non-capability"; } function buildPluginShapeSummary(params) { const capabilities = buildPluginCapabilityEntries(params.plugin); const typedHookCount = params.report.typedHooks.filter((entry) => entry.pluginId === params.plugin.id).length; const customHookCount = params.report.hooks.filter((entry) => entry.pluginId === params.plugin.id).length; const toolCount = params.report.tools.filter((entry) => entry.pluginId === params.plugin.id).length; const gatewayMethodCount = (params.report.gatewayMethodDescriptors ?? []).filter((descriptor) => descriptor.owner.kind === "plugin" && descriptor.owner.pluginId === params.plugin.id).length; const capabilityCount = capabilities.length; return { shape: derivePluginInspectShape({ capabilityCount, typedHookCount, customHookCount, toolCount, commandCount: params.plugin.commands.length, cliCount: params.plugin.cliCommands.length, serviceCount: params.plugin.services.length, gatewayDiscoveryServiceCount: params.plugin.gatewayDiscoveryServiceIds.length, gatewayMethodCount, httpRouteCount: params.plugin.httpRoutes }), capabilityMode: capabilityCount === 0 ? "none" : capabilityCount === 1 ? "plain" : "hybrid", capabilityCount, capabilities, usesLegacyBeforeAgentStart: params.report.typedHooks.some((entry) => entry.pluginId === params.plugin.id && entry.hookName === "before_agent_start") }; } //#endregion //#region src/plugins/status.ts function buildCompatibilityNoticesForInspect(inspect) { const warnings = []; if (inspect.usesLegacyBeforeAgentStart) warnings.push({ pluginId: inspect.plugin.id, code: "legacy-before-agent-start", compatCode: "legacy-before-agent-start", severity: "warn", message: "still uses legacy before_agent_start; keep regression coverage on this plugin, and prefer before_model_resolve/before_prompt_build for new work." }); if (inspect.shape === "hook-only") warnings.push({ pluginId: inspect.plugin.id, code: "hook-only", compatCode: "hook-only-plugin-shape", severity: "info", message: "is hook-only. This remains a supported compatibility path, but it has not migrated to explicit capability registration yet." }); if ((inspect.plugin.memoryEmbeddingProviderIds.length > 0 || (inspect.plugin.contracts?.memoryEmbeddingProviders?.length ?? 0) > 0 || inspect.hasRuntimeMemoryEmbeddingProviderRegistration) && inspect.plugin.origin !== "bundled") warnings.push({ pluginId: inspect.plugin.id, code: "deprecated-memory-embedding-provider-api", compatCode: "deprecated-memory-embedding-provider-api", severity: "warn", message: "uses deprecated memory-specific embedding provider API; use api.registerEmbeddingProvider and contracts.embeddingProviders for new embedding providers." }); return warnings; } function resolveReportedPluginVersion(plugin, env) { if (plugin.origin !== "bundled") return plugin.version; return normalizeOpenClawVersionBase(resolveCompatibilityHostVersion(env)) ?? normalizeOpenClawVersionBase(plugin.version) ?? plugin.version; } function buildPluginReport(params, loadModules) { const rawConfig = params?.config ?? getRuntimeConfig(); const initialWorkspaceDir = params?.workspaceDir ?? resolveAgentWorkspaceDir(rawConfig, resolveDefaultAgentId(rawConfig), params?.env); const metadataSnapshot = !loadModules ? loadPluginMetadataSnapshot({ config: rawConfig, env: params?.env ?? process.env, workspaceDir: initialWorkspaceDir }) : void 0; const baseContext = resolvePluginRuntimeLoadContext({ config: rawConfig, env: params?.env, logger: params?.logger, workspaceDir: initialWorkspaceDir, manifestRegistry: metadataSnapshot?.manifestRegistry }); const workspaceDir = baseContext.workspaceDir ?? initialWorkspaceDir ?? resolveDefaultAgentWorkspaceDir(); const context = workspaceDir === baseContext.workspaceDir ? baseContext : { ...baseContext, workspaceDir }; const config = context.config; const runtimeCompatConfig = withBundledPluginEnablementCompat({ config, pluginIds: resolveBundledProviderCompatPluginIds({ config, workspaceDir, env: params?.env, manifestRegistry: metadataSnapshot?.manifestRegistry }) }); const onlyPluginIds = params?.effectiveOnly === true ? resolveEffectivePluginIds({ config: rawConfig, workspaceDir, env: params?.env ?? process.env }) : params?.onlyPluginIds === void 0 ? void 0 : [...params.onlyPluginIds]; const registry = loadModules ? tracePluginLifecyclePhase("runtime plugin registry load", () => loadOpenClawPlugins(buildPluginRuntimeLoadOptions(context, { config: runtimeCompatConfig, activationSourceConfig: rawConfig, workspaceDir, env: params?.env, loadModules, activate: false, cache: false, onlyPluginIds })), { surface: "status", onlyPluginCount: onlyPluginIds?.length }) : tracePluginLifecyclePhase("plugin registry snapshot", () => loadPluginMetadataRegistrySnapshot({ config: runtimeCompatConfig, activationSourceConfig: rawConfig, workspaceDir, env: params?.env, logger: params?.logger, loadModules: false, onlyPluginIds, manifestRegistry: metadataSnapshot?.manifestRegistry, runtimeContext: context }), { surface: "status", onlyPluginCount: onlyPluginIds?.length }); const importedPluginIds = new Set([ ...loadModules ? registry.plugins.filter((plugin) => plugin.status === "loaded" && plugin.format !== "bundle").map((plugin) => plugin.id) : [], ...listImportedRuntimePluginIds(), ...listImportedBundledPluginFacadeIds() ]); return { workspaceDir, ...registry, plugins: registry.plugins.map((plugin) => Object.assign({}, plugin, { imported: plugin.format !== `bundle` && importedPluginIds.has(plugin.id), version: resolveReportedPluginVersion(plugin, params?.env), dependencyStatus: plugin.dependencyStatus ?? buildPluginDependencyStatus({ rootDir: plugin.rootDir, dependencies: metadataSnapshot?.byPluginId.get(plugin.id)?.packageDependencies, optionalDependencies: metadataSnapshot?.byPluginId.get(plugin.id)?.packageOptionalDependencies }) })) }; } function buildPluginSnapshotReport(params) { return buildPluginReport(params, false); } function buildPluginDiagnosticsReport(params) { return buildPluginReport(params, true); } function buildPluginInspectReport(params) { const rawConfig = params.config ?? getRuntimeConfig(); const config = params.resolvedConfig ?? resolvePluginRuntimeLoadContext({ config: rawConfig, env: params.env, logger: params.logger, workspaceDir: params.workspaceDir }).config; const report = params.report ?? buildPluginDiagnosticsReport({ config: rawConfig, logger: params.logger, workspaceDir: params.workspaceDir, env: params.env }); const plugin = report.plugins.find((entry) => entry.id === params.id || entry.name === params.id); if (!plugin) return null; const typedHooks = report.typedHooks.filter((entry) => entry.pluginId === plugin.id).map((entry) => ({ name: entry.hookName, priority: entry.priority })).toSorted((a, b) => a.name.localeCompare(b.name)); const customHooks = report.hooks.filter((entry) => entry.pluginId === plugin.id).map((entry) => ({ name: entry.entry.hook.name, events: [...entry.events].toSorted() })).toSorted((a, b) => a.name.localeCompare(b.name)); const tools = report.tools.filter((entry) => entry.pluginId === plugin.id).map((entry) => ({ names: [...entry.names], optional: entry.optional })); const diagnostics = report.diagnostics.filter((entry) => entry.pluginId === plugin.id); const policyEntry = normalizePluginsConfig(config.plugins).entries[plugin.id]; const shapeSummary = buildPluginShapeSummary({ plugin, report }); const shape = shapeSummary.shape; const gatewayMethods = (report.gatewayMethodDescriptors ?? []).filter((descriptor) => descriptor.owner.kind === "plugin" && descriptor.owner.pluginId === plugin.id).map((descriptor) => descriptor.name); let mcpServers = []; if (plugin.format === "bundle" && plugin.bundleFormat && plugin.rootDir) { const mcpSupport = inspectBundleMcpRuntimeSupport({ pluginId: plugin.id, rootDir: plugin.rootDir, bundleFormat: plugin.bundleFormat }); mcpServers = [...mcpSupport.supportedServerNames.map((name) => ({ name, hasStdioTransport: true })), ...mcpSupport.unsupportedServerNames.map((name) => ({ name, hasStdioTransport: false }))]; } let lspServers = []; if (plugin.format === "bundle" && plugin.bundleFormat && plugin.rootDir) { const lspSupport = inspectBundleLspRuntimeSupport({ pluginId: plugin.id, rootDir: plugin.rootDir, bundleFormat: plugin.bundleFormat }); lspServers = [...lspSupport.supportedServerNames.map((name) => ({ name, hasStdioTransport: true })), ...lspSupport.unsupportedServerNames.map((name) => ({ name, hasStdioTransport: false }))]; } const usesLegacyBeforeAgentStart = shapeSummary.usesLegacyBeforeAgentStart; const compatibility = buildCompatibilityNoticesForInspect({ plugin, shape, usesLegacyBeforeAgentStart, hasRuntimeMemoryEmbeddingProviderRegistration: report.memoryEmbeddingProviders.some((entry) => entry.pluginId === plugin.id) }); return { workspaceDir: report.workspaceDir, plugin, shape, capabilityMode: shapeSummary.capabilityMode, capabilityCount: shapeSummary.capabilityCount, capabilities: shapeSummary.capabilities, typedHooks, customHooks, tools, commands: [...plugin.commands], cliCommands: [...plugin.cliCommands], services: [...plugin.services], gatewayDiscoveryServices: [...plugin.gatewayDiscoveryServiceIds], gatewayMethods, mcpServers, lspServers, httpRouteCount: plugin.httpRoutes, bundleCapabilities: plugin.bundleCapabilities ?? [], diagnostics, policy: { allowPromptInjection: policyEntry?.hooks?.allowPromptInjection, allowConversationAccess: policyEntry?.hooks?.allowConversationAccess, hookTimeoutMs: policyEntry?.hooks?.timeoutMs, hookTimeouts: policyEntry?.hooks?.timeouts ? { ...policyEntry.hooks.timeouts } : void 0, allowModelOverride: policyEntry?.subagent?.allowModelOverride, allowedModels: [...policyEntry?.subagent?.allowedModels ?? []], hasAllowedModelsConfig: policyEntry?.subagent?.hasAllowedModelsConfig === true }, usesLegacyBeforeAgentStart, compatibility }; } function buildAllPluginInspectReports(params) { const rawConfig = params?.config ?? getRuntimeConfig(); const config = resolvePluginRuntimeLoadContext({ config: rawConfig, env: params?.env, logger: params?.logger, workspaceDir: params?.workspaceDir }).config; const report = params?.report ?? buildPluginDiagnosticsReport({ config: rawConfig, logger: params?.logger, workspaceDir: params?.workspaceDir, env: params?.env }); return report.plugins.map((plugin) => buildPluginInspectReport({ id: plugin.id, config: rawConfig, logger: params?.logger, workspaceDir: params?.workspaceDir, env: params?.env, resolvedConfig: config, report })).filter((entry) => entry !== null); } function buildPluginCompatibilityWarnings(params) { return buildPluginCompatibilityNotices(params).map(formatPluginCompatibilityNotice); } function buildPluginCompatibilityNotices(params) { return buildAllPluginInspectReports(params).flatMap((inspect) => inspect.compatibility); } function buildPluginCompatibilitySnapshotNotices(params) { const report = buildPluginSnapshotReport(params); return buildPluginCompatibilityNotices({ ...params, report }); } function formatPluginCompatibilityNotice(notice) { return `${notice.pluginId} ${notice.message}`; } function summarizePluginCompatibility(notices) { return { noticeCount: notices.length, pluginCount: new Set(notices.map((notice) => notice.pluginId)).size }; } //#endregion export { buildPluginDiagnosticsReport as a, formatPluginCompatibilityNotice as c, buildPluginCompatibilityWarnings as i, summarizePluginCompatibility as l, buildPluginCompatibilityNotices as n, buildPluginInspectReport as o, buildPluginCompatibilitySnapshotNotices as r, buildPluginSnapshotReport as s, buildAllPluginInspectReports as t };