

























@@ -130,6 +130,20 @@ function schedulePostAttachUpdateSentinelRefresh(params: {
130130handle.unref?.();
131131}
132132133+function schedulePostReadySidecarTask(params: {
134+startupTrace?: GatewayStartupTrace;
135+name: string;
136+log: { warn: (msg: string) => void };
137+run: () => Awaitable<void>;
138+}): void {
139+const handle = setImmediate(() => {
140+void measureStartup(params.startupTrace, params.name, params.run).catch((err) => {
141+params.log.warn(`${params.name} failed after gateway ready: ${String(err)}`);
142+});
143+});
144+handle.unref?.();
145+}
146+133147function resolveRestartSentinelPathFast(env: NodeJS.ProcessEnv = process.env): string {
134148const normalizePathEnv = (value: string | undefined) => {
135149const trimmed = value?.trim();
@@ -369,37 +383,6 @@ export async function startGatewaySidecars(params: {
369383logChannels: { info: (msg: string) => void; error: (msg: string) => void };
370384startupTrace?: GatewayStartupTrace;
371385}) {
372-await measureStartup(params.startupTrace, "sidecars.session-locks", async () => {
373-try {
374-const [{ resolveStateDir }, { resolveAgentSessionDirs }, { cleanStaleLockFiles }] =
375-await Promise.all([
376-import("../config/paths.js"),
377-import("../agents/session-dirs.js"),
378-import("../agents/session-write-lock.js"),
379-]);
380-const stateDir = resolveStateDir(process.env);
381-const sessionDirs = await resolveAgentSessionDirs(stateDir);
382-for (const sessionsDir of sessionDirs) {
383-const result = await cleanStaleLockFiles({
384- sessionsDir,
385-staleMs: SESSION_LOCK_STALE_MS,
386-removeStale: true,
387-log: { warn: (message) => params.log.warn(message) },
388-});
389-if (result.cleaned.length > 0) {
390-const { markRestartAbortedMainSessionsFromLocks } =
391-await import("../agents/main-session-restart-recovery.js");
392-await markRestartAbortedMainSessionsFromLocks({
393- sessionsDir,
394-cleanedLocks: result.cleaned,
395-});
396-}
397-}
398-} catch (err) {
399-params.log.warn(`session lock cleanup failed on startup: ${String(err)}`);
400-}
401-});
402-403386await measureStartup(params.startupTrace, "sidecars.gmail-watch", async () => {
404387if (params.cfg.hooks?.enabled && params.cfg.hooks.gmail?.account) {
405388const { startGmailWatcherWithLogs } = await import("../hooks/gmail-watcher-lifecycle.js");
@@ -564,33 +547,84 @@ export async function startGatewaySidecars(params: {
564547scheduleGatewayMemoryBackend({ cfg: params.cfg, log: params.log, policy });
565548});
566549567-await measureStartup(params.startupTrace, "sidecars.restart-sentinel", async () => {
568-if (!shouldCheckRestartSentinel()) {
569-return;
570-}
571-if (!hasRestartSentinelFileFast()) {
572-return;
573-}
574-setTimeout(() => {
575-void import("./server-restart-sentinel.js")
576-.then(({ scheduleRestartSentinelWake }) =>
577-scheduleRestartSentinelWake({ deps: params.deps }),
578-)
579-.catch((err) => {
580-params.log.warn(`restart sentinel wake failed to schedule: ${String(err)}`);
581-});
582-}, 750);
550+schedulePostReadySidecarTask({
551+startupTrace: params.startupTrace,
552+name: "sidecars.session-locks",
553+log: params.log,
554+run: async () => {
555+try {
556+const [{ resolveStateDir }, { resolveAgentSessionDirs }, { cleanStaleLockFiles }] =
557+await Promise.all([
558+import("../config/paths.js"),
559+import("../agents/session-dirs.js"),
560+import("../agents/session-write-lock.js"),
561+]);
562+const stateDir = resolveStateDir(process.env);
563+const sessionDirs = await resolveAgentSessionDirs(stateDir);
564+for (const sessionsDir of sessionDirs) {
565+const result = await cleanStaleLockFiles({
566+ sessionsDir,
567+staleMs: SESSION_LOCK_STALE_MS,
568+removeStale: true,
569+log: { warn: (message) => params.log.warn(message) },
570+});
571+if (result.cleaned.length > 0) {
572+const { markRestartAbortedMainSessionsFromLocks } =
573+await import("../agents/main-session-restart-recovery.js");
574+await markRestartAbortedMainSessionsFromLocks({
575+ sessionsDir,
576+cleanedLocks: result.cleaned,
577+});
578+}
579+}
580+} catch (err) {
581+params.log.warn(`session lock cleanup failed on startup: ${String(err)}`);
582+}
583+},
584+});
585+586+schedulePostReadySidecarTask({
587+startupTrace: params.startupTrace,
588+name: "sidecars.restart-sentinel",
589+log: params.log,
590+run: async () => {
591+if (!shouldCheckRestartSentinel()) {
592+return;
593+}
594+if (!hasRestartSentinelFileFast()) {
595+return;
596+}
597+setTimeout(() => {
598+void import("./server-restart-sentinel.js")
599+.then(({ scheduleRestartSentinelWake }) =>
600+scheduleRestartSentinelWake({ deps: params.deps }),
601+)
602+.catch((err) => {
603+params.log.warn(`restart sentinel wake failed to schedule: ${String(err)}`);
604+});
605+}, 750);
606+},
583607});
584608585-await measureStartup(params.startupTrace, "sidecars.subagent-recovery", async () => {
586-const { scheduleSubagentOrphanRecovery } = await import("../agents/subagent-registry.js");
587-scheduleSubagentOrphanRecovery();
609+schedulePostReadySidecarTask({
610+startupTrace: params.startupTrace,
611+name: "sidecars.subagent-recovery",
612+log: params.log,
613+run: async () => {
614+const { scheduleSubagentOrphanRecovery } = await import("../agents/subagent-registry.js");
615+scheduleSubagentOrphanRecovery();
616+},
588617});
589618590-await measureStartup(params.startupTrace, "sidecars.main-session-recovery", async () => {
591-const { scheduleRestartAbortedMainSessionRecovery } =
592-await import("../agents/main-session-restart-recovery.js");
593-scheduleRestartAbortedMainSessionRecovery();
619+schedulePostReadySidecarTask({
620+startupTrace: params.startupTrace,
621+name: "sidecars.main-session-recovery",
622+log: params.log,
623+run: async () => {
624+const { scheduleRestartAbortedMainSessionRecovery } =
625+await import("../agents/main-session-restart-recovery.js");
626+scheduleRestartAbortedMainSessionRecovery();
627+},
594628});
595629596630return { pluginServices };
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。