




















@@ -1,20 +1,25 @@
1-import { registerSkillsChangeListener } from "../agents/skills/refresh.js";
21import type { GatewayTailscaleMode } from "../config/types.gateway.js";
32import type { OpenClawConfig } from "../config/types.openclaw.js";
43import { resolveCronStorePath } from "../cron/store.js";
5-import { getMachineDisplayName } from "../infra/machine-name.js";
6-import {
7-primeRemoteSkillsCache,
8-refreshRemoteBinsForConnectedNodes,
9-setSkillsRemoteRegistry,
10-} from "../infra/skills-remote.js";
114import type { PluginRegistry } from "../plugins/registry-types.js";
12-import {
13-configureTaskRegistryMaintenance,
14-startTaskRegistryMaintenance,
15-} from "../tasks/task-registry.maintenance.js";
16-import { startGatewayDiscovery } from "./server-discovery-runtime.js";
17-import { startGatewayMaintenanceTimers } from "./server-maintenance.js";
5+6+type Awaitable<T> = T | Promise<T>;
7+8+type GatewayStartupTrace = {
9+measure: <T>(name: string, run: () => Awaitable<T>) => Promise<T>;
10+};
11+12+type StartGatewayMaintenanceTimers =
13+typeof import("./server-maintenance.js").startGatewayMaintenanceTimers;
14+type GatewayMaintenanceParams = Parameters<StartGatewayMaintenanceTimers>[0];
15+16+async function measureStartup<T>(
17+startupTrace: GatewayStartupTrace | undefined,
18+name: string,
19+run: () => Awaitable<T>,
20+): Promise<T> {
21+return startupTrace ? startupTrace.measure(name, run) : await run();
22+}
18231924export async function startGatewayPluginDiscovery(params: {
2025minimalTestGateway: boolean;
@@ -27,25 +32,33 @@ export async function startGatewayPluginDiscovery(params: {
2732warn: (msg: string) => void;
2833};
2934pluginRegistry?: PluginRegistry;
35+startupTrace?: GatewayStartupTrace;
3036}): Promise<(() => Promise<void>) | null> {
3137if (params.minimalTestGateway) {
3238return null;
3339}
34-const machineDisplayName = await getMachineDisplayName();
35-const discovery = await startGatewayDiscovery({
36- machineDisplayName,
37-port: params.port,
38-gatewayTls: params.gatewayTls.enabled
39- ? { enabled: true, fingerprintSha256: params.gatewayTls.fingerprintSha256 }
40- : undefined,
41-wideAreaDiscoveryEnabled: params.cfgAtStart.discovery?.wideArea?.enabled === true,
42-wideAreaDiscoveryDomain: params.cfgAtStart.discovery?.wideArea?.domain,
43-tailscaleMode: params.tailscaleMode,
44-mdnsMode: params.cfgAtStart.discovery?.mdns?.mode,
45-gatewayDiscoveryServices: params.pluginRegistry?.gatewayDiscoveryServices,
46-logDiscovery: params.logDiscovery,
40+const machineDisplayName = await measureStartup(
41+params.startupTrace,
42+"runtime.early.discovery.machine-name",
43+async () => (await import("../infra/machine-name.js")).getMachineDisplayName(),
44+);
45+return await measureStartup(params.startupTrace, "runtime.early.discovery.start", async () => {
46+const { startGatewayDiscovery } = await import("./server-discovery-runtime.js");
47+const discovery = await startGatewayDiscovery({
48+ machineDisplayName,
49+port: params.port,
50+gatewayTls: params.gatewayTls.enabled
51+ ? { enabled: true, fingerprintSha256: params.gatewayTls.fingerprintSha256 }
52+ : undefined,
53+wideAreaDiscoveryEnabled: params.cfgAtStart.discovery?.wideArea?.enabled === true,
54+wideAreaDiscoveryDomain: params.cfgAtStart.discovery?.wideArea?.domain,
55+tailscaleMode: params.tailscaleMode,
56+mdnsMode: params.cfgAtStart.discovery?.mdns?.mode,
57+gatewayDiscoveryServices: params.pluginRegistry?.gatewayDiscoveryServices,
58+logDiscovery: params.logDiscovery,
59+});
60+return discovery.bonjourStop;
4761});
48-return discovery.bonjourStop;
4962}
50635164export async function startGatewayEarlyRuntime(params: {
@@ -62,67 +75,82 @@ export async function startGatewayEarlyRuntime(params: {
6275info: (msg: string) => void;
6376warn: (msg: string) => void;
6477};
65-nodeRegistry: Parameters<typeof setSkillsRemoteRegistry>[0];
78+nodeRegistry: Parameters<typeof import("../infra/skills-remote.js").setSkillsRemoteRegistry>[0];
6679pluginRegistry?: PluginRegistry;
67-broadcast: Parameters<typeof startGatewayMaintenanceTimers>[0]["broadcast"];
68-nodeSendToAllSubscribed: Parameters<
69-typeof startGatewayMaintenanceTimers
70->[0]["nodeSendToAllSubscribed"];
71-getPresenceVersion: Parameters<typeof startGatewayMaintenanceTimers>[0]["getPresenceVersion"];
72-getHealthVersion: Parameters<typeof startGatewayMaintenanceTimers>[0]["getHealthVersion"];
73-refreshGatewayHealthSnapshot: Parameters<
74-typeof startGatewayMaintenanceTimers
75->[0]["refreshGatewayHealthSnapshot"];
76-logHealth: Parameters<typeof startGatewayMaintenanceTimers>[0]["logHealth"];
77-dedupe: Parameters<typeof startGatewayMaintenanceTimers>[0]["dedupe"];
78-chatAbortControllers: Parameters<typeof startGatewayMaintenanceTimers>[0]["chatAbortControllers"];
79-chatRunState: Parameters<typeof startGatewayMaintenanceTimers>[0]["chatRunState"];
80-chatRunBuffers: Parameters<typeof startGatewayMaintenanceTimers>[0]["chatRunBuffers"];
81-chatDeltaSentAt: Parameters<typeof startGatewayMaintenanceTimers>[0]["chatDeltaSentAt"];
82-chatDeltaLastBroadcastLen: Parameters<
83-typeof startGatewayMaintenanceTimers
84->[0]["chatDeltaLastBroadcastLen"];
85-removeChatRun: Parameters<typeof startGatewayMaintenanceTimers>[0]["removeChatRun"];
86-agentRunSeq: Parameters<typeof startGatewayMaintenanceTimers>[0]["agentRunSeq"];
87-nodeSendToSession: Parameters<typeof startGatewayMaintenanceTimers>[0]["nodeSendToSession"];
80+broadcast: GatewayMaintenanceParams["broadcast"];
81+nodeSendToAllSubscribed: Parameters<StartGatewayMaintenanceTimers>[0]["nodeSendToAllSubscribed"];
82+getPresenceVersion: GatewayMaintenanceParams["getPresenceVersion"];
83+getHealthVersion: GatewayMaintenanceParams["getHealthVersion"];
84+refreshGatewayHealthSnapshot: GatewayMaintenanceParams["refreshGatewayHealthSnapshot"];
85+logHealth: GatewayMaintenanceParams["logHealth"];
86+dedupe: GatewayMaintenanceParams["dedupe"];
87+chatAbortControllers: GatewayMaintenanceParams["chatAbortControllers"];
88+chatRunState: GatewayMaintenanceParams["chatRunState"];
89+chatRunBuffers: GatewayMaintenanceParams["chatRunBuffers"];
90+chatDeltaSentAt: GatewayMaintenanceParams["chatDeltaSentAt"];
91+chatDeltaLastBroadcastLen: GatewayMaintenanceParams["chatDeltaLastBroadcastLen"];
92+removeChatRun: GatewayMaintenanceParams["removeChatRun"];
93+agentRunSeq: GatewayMaintenanceParams["agentRunSeq"];
94+nodeSendToSession: GatewayMaintenanceParams["nodeSendToSession"];
8895mediaCleanupTtlMs?: number;
8996skillsRefreshDelayMs: number;
9097getSkillsRefreshTimer: () => ReturnType<typeof setTimeout> | null;
9198setSkillsRefreshTimer: (timer: ReturnType<typeof setTimeout> | null) => void;
9299getRuntimeConfig: () => OpenClawConfig;
100+startupTrace?: GatewayStartupTrace;
93101}) {
94-const bonjourStop = await startGatewayPluginDiscovery(params);
102+const bonjourStop = await measureStartup(params.startupTrace, "runtime.early.discovery", () =>
103+startGatewayPluginDiscovery(params),
104+);
9510596106if (!params.minimalTestGateway) {
107+const [{ primeRemoteSkillsCache, setSkillsRemoteRegistry }, taskRegistryMaintenance] =
108+await measureStartup(params.startupTrace, "runtime.early.lazy-runtime-imports", () =>
109+Promise.all([
110+import("../infra/skills-remote.js"),
111+import("../tasks/task-registry.maintenance.js"),
112+]),
113+);
97114setSkillsRemoteRegistry(params.nodeRegistry);
98115void primeRemoteSkillsCache();
99-configureTaskRegistryMaintenance({
116+taskRegistryMaintenance.configureTaskRegistryMaintenance({
100117cronStorePath: resolveCronStorePath(params.cfgAtStart.cron?.store),
101118cronRuntimeAuthoritative: true,
102119});
103-startTaskRegistryMaintenance();
120+taskRegistryMaintenance.startTaskRegistryMaintenance();
104121}
105122106123const skillsChangeUnsub = params.minimalTestGateway
107124 ? () => {}
108- : registerSkillsChangeListener((event) => {
109-if (event.reason === "remote-node") {
110-return;
111-}
112-const existingTimer = params.getSkillsRefreshTimer();
113-if (existingTimer) {
114-clearTimeout(existingTimer);
115-}
116-const nextTimer = setTimeout(() => {
117-params.setSkillsRefreshTimer(null);
118-void refreshRemoteBinsForConnectedNodes(params.getRuntimeConfig());
119-}, params.skillsRefreshDelayMs);
120-params.setSkillsRefreshTimer(nextTimer);
125+ : await measureStartup(params.startupTrace, "runtime.early.skills-listener", async () => {
126+const [{ registerSkillsChangeListener }, { refreshRemoteBinsForConnectedNodes }] =
127+await Promise.all([
128+import("../agents/skills/refresh.js"),
129+import("../infra/skills-remote.js"),
130+]);
131+return registerSkillsChangeListener((event) => {
132+if (event.reason === "remote-node") {
133+return;
134+}
135+const existingTimer = params.getSkillsRefreshTimer();
136+if (existingTimer) {
137+clearTimeout(existingTimer);
138+}
139+const nextTimer = setTimeout(() => {
140+params.setSkillsRefreshTimer(null);
141+void refreshRemoteBinsForConnectedNodes(params.getRuntimeConfig());
142+}, params.skillsRefreshDelayMs);
143+params.setSkillsRefreshTimer(nextTimer);
144+});
121145});
122146123-const maintenance = params.minimalTestGateway
124- ? null
125- : startGatewayMaintenanceTimers({
147+const startMaintenance = async () => {
148+if (params.minimalTestGateway) {
149+return null;
150+}
151+return await measureStartup(params.startupTrace, "post-ready.maintenance", async () => {
152+const { startGatewayMaintenanceTimers } = await import("./server-maintenance.js");
153+return startGatewayMaintenanceTimers({
126154broadcast: params.broadcast,
127155nodeSendToAllSubscribed: params.nodeSendToAllSubscribed,
128156getPresenceVersion: params.getPresenceVersion,
@@ -142,10 +170,12 @@ export async function startGatewayEarlyRuntime(params: {
142170 ? { mediaCleanupTtlMs: params.mediaCleanupTtlMs }
143171 : {}),
144172});
173+});
174+};
145175146176return {
147177 bonjourStop,
148178 skillsChangeUnsub,
149-maintenance,
179+startMaintenance,
150180};
151181}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。