























@@ -413,6 +413,7 @@ export async function startGatewaySidecars(params: {
413413deps: CliDeps;
414414startChannels: () => Promise<void>;
415415prewarmPrimaryModel?: typeof prewarmConfiguredPrimaryModel;
416+onPluginServices?: (pluginServices: PluginServicesHandle | null) => void;
416417log: { warn: (msg: string) => void };
417418logHooks: {
418419info: (msg: string) => void;
@@ -445,6 +446,31 @@ export async function startGatewaySidecars(params: {
445446}
446447});
447448449+const pluginServicesPromise = measureStartup(
450+params.startupTrace,
451+"sidecars.plugin-services",
452+async () => {
453+try {
454+const { startPluginServices } = await import("../plugins/services.js");
455+return await startPluginServices({
456+registry: params.pluginRegistry,
457+config: params.cfg,
458+workspaceDir: params.defaultWorkspaceDir,
459+startupTrace: params.startupTrace,
460+});
461+} catch (err) {
462+params.log.warn(`plugin services failed to start: ${String(err)}`);
463+return null;
464+}
465+},
466+);
467+const pluginServicesReportPromise = params.onPluginServices
468+ ? pluginServicesPromise.then((pluginServices) => {
469+params.onPluginServices?.(pluginServices);
470+return pluginServices;
471+})
472+ : pluginServicesPromise;
473+448474const skipChannels =
449475isTruthyEnvValue(process.env.OPENCLAW_SKIP_CHANNELS) ||
450476isTruthyEnvValue(process.env.OPENCLAW_SKIP_PROVIDERS);
@@ -492,20 +518,7 @@ export async function startGatewaySidecars(params: {
492518}, 250);
493519}
494520495-let pluginServices: PluginServicesHandle | null = null;
496-await measureStartup(params.startupTrace, "sidecars.plugin-services", async () => {
497-try {
498-const { startPluginServices } = await import("../plugins/services.js");
499-pluginServices = await startPluginServices({
500-registry: params.pluginRegistry,
501-config: params.cfg,
502-workspaceDir: params.defaultWorkspaceDir,
503-startupTrace: params.startupTrace,
504-});
505-} catch (err) {
506-params.log.warn(`plugin services failed to start: ${String(err)}`);
507-}
508-});
521+const pluginServices = await pluginServicesReportPromise;
509522510523if (params.cfg.acp?.enabled) {
511524void (async () => {
@@ -804,7 +817,7 @@ export async function startGatewayPostAttachRuntime(
804817await params.onStartupPluginsLoaded?.(loaded);
805818}
806819807-await measureStartup(params.startupTrace, "post-attach.log", () =>
820+const startupLogPromise = measureStartup(params.startupTrace, "post-attach.log", () =>
808821runtimeDeps.logGatewayStartup({
809822cfg: params.cfgAtStart,
810823bindHost: params.bindHost,
@@ -849,6 +862,12 @@ export async function startGatewayPostAttachRuntime(
849862}),
850863);
851864865+let pluginServicesReported = false;
866+const reportPluginServices = (pluginServices: PluginServicesHandle | null) => {
867+pluginServicesReported = true;
868+params.onPluginServices?.(pluginServices);
869+};
870+852871const sidecarsPromise = params.minimalTestGateway
853872 ? Promise.resolve({ pluginServices: null, pluginRegistry, postReadySidecars: [] })
854873 : new Promise<void>((resolve) => setImmediate(resolve)).then(async () => {
@@ -865,6 +884,7 @@ export async function startGatewayPostAttachRuntime(
865884logHooks: params.logHooks,
866885logChannels: params.logChannels,
867886startupTrace: params.startupTrace,
887+onPluginServices: reportPluginServices,
868888}),
869889);
870890const loaderStatsAfter = getPluginModuleLoaderStats();
@@ -884,7 +904,9 @@ export async function startGatewayPostAttachRuntime(
884904for (const method of STARTUP_UNAVAILABLE_GATEWAY_METHODS) {
885905params.unavailableGatewayMethods.delete(method);
886906}
887-params.onPluginServices?.(result.pluginServices);
907+if (!pluginServicesReported) {
908+reportPluginServices(result.pluginServices);
909+}
888910params.onPostReadySidecars?.(result.postReadySidecars);
889911params.onSidecarsReady?.();
890912params.startupTrace?.detail("sidecars.ready", [
@@ -937,7 +959,8 @@ export async function startGatewayPostAttachRuntime(
937959});
938960939961if (params.deferSidecars !== true) {
940-const [stopGatewayUpdateCheck, tailscaleCleanup, sidecarsResult] = await Promise.all([
962+const [, stopGatewayUpdateCheck, tailscaleCleanup, sidecarsResult] = await Promise.all([
963+startupLogPromise,
941964stopGatewayUpdateCheckPromise,
942965tailscaleCleanupPromise,
943966sidecarsPromise,
@@ -949,7 +972,8 @@ export async function startGatewayPostAttachRuntime(
949972};
950973}
951974952-const [stopGatewayUpdateCheck, tailscaleCleanup] = await Promise.all([
975+const [, stopGatewayUpdateCheck, tailscaleCleanup] = await Promise.all([
976+startupLogPromise,
953977stopGatewayUpdateCheckPromise,
954978tailscaleCleanupPromise,
955979]);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。