UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

85 lines (84 loc) 3.63 kB
import { r as STATE_DIR } from "./paths-mvMm5bYV.js"; import { o as emitTrustedDiagnosticEventWithPrivateData, p as onTrustedInternalDiagnosticEvent } from "./diagnostic-events-Chmz2PSy.js"; import { t as createSubsystemLogger } from "./subsystem-BzXSmsuh.js"; import { t as encodeStartupTraceSegment } from "./startup-trace-segment-Cd4cVDJE.js"; import { n as withPluginHttpRouteRegistry } from "./http-registry-C6KnnU9A.js"; //#region src/plugins/services.ts /** Starts, stops, and inspects plugin service registrations. */ const log = createSubsystemLogger("plugins"); function createPluginLogger() { return { info: (msg) => log.info(msg), warn: (msg) => log.warn(msg), error: (msg) => log.error(msg), debug: (msg) => log.debug(msg) }; } function createServiceContext(params) { const grantsInternalDiagnostics = params.service?.pluginId === params.service?.service.id && (params.service?.service.id === "diagnostics-otel" || params.service?.service.id === "diagnostics-prometheus") && (params.service?.origin === "bundled" || params.service?.trustedOfficialInstall === true); return { config: params.config, workspaceDir: params.workspaceDir, stateDir: STATE_DIR, logger: createPluginLogger(), ...params.startupTrace ? { startupTrace: createScopedPluginServiceStartupTrace(params.startupTrace, createPluginServiceTraceName(params.service)) } : {}, ...grantsInternalDiagnostics ? { internalDiagnostics: { emit: emitTrustedDiagnosticEventWithPrivateData, onEvent: onTrustedInternalDiagnosticEvent } } : {} }; } function createPluginServiceTraceName(entry) { return `sidecars.plugin-services.${encodeStartupTraceSegment(entry.pluginId)}.${encodeStartupTraceSegment(entry.service.id)}`; } function createScopedPluginServiceStartupTrace(startupTrace, prefix) { const scopeName = (name) => `${prefix}.${name.split(".").map((segment) => encodeStartupTraceSegment(segment)).join(".")}`; return { measure: (name, run) => startupTrace.measure(scopeName(name), run), ...startupTrace.detail ? { detail: (name, metrics) => startupTrace.detail?.(scopeName(name), metrics) } : {} }; } async function startPluginServices(params) { const running = []; let failedCount = 0; for (const entry of params.registry.services) { const service = entry.service; const traceName = createPluginServiceTraceName(entry); const serviceContext = createServiceContext({ config: params.config, startupTrace: params.startupTrace, workspaceDir: params.workspaceDir, service: entry }); try { const startService = () => withPluginHttpRouteRegistry(params.registry, () => service.start(serviceContext)); if (params.startupTrace) await params.startupTrace.measure(traceName, startService); else await startService(); running.push({ id: service.id, stop: service.stop ? () => service.stop?.(serviceContext) : void 0 }); } catch (err) { failedCount += 1; const error = err; log.error(`plugin service failed (${service.id}, plugin=${entry.pluginId}, root=${entry.rootDir ?? "unknown"}): ${error?.message ?? String(err)}`); } } params.startupTrace?.detail?.("sidecars.plugin-services.summary", [ ["serviceCount", params.registry.services.length], ["startedCount", running.length], ["failedCount", failedCount] ]); return { stop: async () => { for (const entry of running.toReversed()) { if (!entry.stop) continue; try { await withPluginHttpRouteRegistry(params.registry, () => entry.stop?.()); } catch (err) { log.warn(`plugin service stop failed (${entry.id}): ${String(err)}`); } } } }; } //#endregion export { startPluginServices };