





















@@ -15,48 +15,12 @@ const UPDATE_RESPAWN_HEALTH_POLL_MS = 200;
1515type GatewayRunSignalAction = "stop" | "restart";
1616type RestartDrainTimeoutMs = number | undefined;
171718-type EmbeddedRunsModule = typeof import("../../agents/pi-embedded-runner/runs.js");
19-type RuntimeConfigModule = typeof import("../../config/config.js");
20-type ProcessRespawnModule = typeof import("../../infra/process-respawn.js");
21-type RestartSentinelModule = typeof import("../../infra/restart-sentinel.js");
22-type RestartModule = typeof import("../../infra/restart.js");
23-type SupervisorMarkersModule = typeof import("../../infra/supervisor-markers.js");
24-type DiagnosticStabilityBundleModule =
25-typeof import("../../logging/diagnostic-stability-bundle.js");
26-type BundledRuntimeDepsActivityModule =
27-typeof import("../../plugins/bundled-runtime-deps-activity.js");
28-type CommandQueueModule = typeof import("../../process/command-queue.js");
29-type RuntimeInternalModule = typeof import("../../tasks/runtime-internal.js");
18+type GatewayLifecycleRuntimeModule = typeof import("./lifecycle.runtime.js");
301931-let embeddedRunsModule: Promise<EmbeddedRunsModule> | undefined;
32-let runtimeConfigModule: Promise<RuntimeConfigModule> | undefined;
33-let processRespawnModule: Promise<ProcessRespawnModule> | undefined;
34-let restartSentinelModule: Promise<RestartSentinelModule> | undefined;
35-let restartModule: Promise<RestartModule> | undefined;
36-let supervisorMarkersModule: Promise<SupervisorMarkersModule> | undefined;
37-let diagnosticStabilityBundleModule: Promise<DiagnosticStabilityBundleModule> | undefined;
38-let bundledRuntimeDepsActivityModule: Promise<BundledRuntimeDepsActivityModule> | undefined;
39-let commandQueueModule: Promise<CommandQueueModule> | undefined;
40-let runtimeInternalModule: Promise<RuntimeInternalModule> | undefined;
20+let gatewayLifecycleRuntimeModule: Promise<GatewayLifecycleRuntimeModule> | undefined;
412142-const loadEmbeddedRunsModule = () =>
43-(embeddedRunsModule ??= import("../../agents/pi-embedded-runner/runs.js"));
44-const loadRuntimeConfigModule = () => (runtimeConfigModule ??= import("../../config/config.js"));
45-const loadProcessRespawnModule = () =>
46-(processRespawnModule ??= import("../../infra/process-respawn.js"));
47-const loadRestartSentinelModule = () =>
48-(restartSentinelModule ??= import("../../infra/restart-sentinel.js"));
49-const loadRestartModule = () => (restartModule ??= import("../../infra/restart.js"));
50-const loadSupervisorMarkersModule = () =>
51-(supervisorMarkersModule ??= import("../../infra/supervisor-markers.js"));
52-const loadDiagnosticStabilityBundleModule = () =>
53-(diagnosticStabilityBundleModule ??= import("../../logging/diagnostic-stability-bundle.js"));
54-const loadBundledRuntimeDepsActivityModule = () =>
55-(bundledRuntimeDepsActivityModule ??= import("../../plugins/bundled-runtime-deps-activity.js"));
56-const loadCommandQueueModule = () =>
57-(commandQueueModule ??= import("../../process/command-queue.js"));
58-const loadRuntimeInternalModule = () =>
59-(runtimeInternalModule ??= import("../../tasks/runtime-internal.js"));
22+const loadGatewayLifecycleRuntimeModule = () =>
23+(gatewayLifecycleRuntimeModule ??= import("./lifecycle.runtime.js"));
60246125function createRestartIterationHook(onRestart: () => Promise<void> | void): () => Promise<boolean> {
6226let isFirstIteration = true;
@@ -137,7 +101,7 @@ export async function runGatewayLoop(params: {
137101};
138102const writeStabilityBundle = async (reason: string, error?: unknown) => {
139103const { writeDiagnosticStabilityBundleForFailureSync } =
140-await loadDiagnosticStabilityBundleModule();
104+await loadGatewayLifecycleRuntimeModule();
141105const result = writeDiagnosticStabilityBundleForFailureSync(reason, error);
142106if ("message" in result) {
143107gatewayLog.warn(result.message);
@@ -165,10 +129,12 @@ export async function runGatewayLoop(params: {
165129const handleRestartAfterServerClose = async (restartReason?: string) => {
166130const hadLock = await releaseLockIfHeld();
167131const isUpdateRestart = restartReason === "update.run";
168-const { respawnGatewayProcessForUpdate, restartGatewayProcessWithFreshPid } =
169-await loadProcessRespawnModule();
170-const { detectRespawnSupervisor } = await loadSupervisorMarkersModule();
171-const { markUpdateRestartSentinelFailure } = await loadRestartSentinelModule();
132+const {
133+ detectRespawnSupervisor,
134+ markUpdateRestartSentinelFailure,
135+ respawnGatewayProcessForUpdate,
136+ restartGatewayProcessWithFreshPid,
137+} = await loadGatewayLifecycleRuntimeModule();
172138173139if (isUpdateRestart) {
174140const respawn = respawnGatewayProcessForUpdate();
@@ -279,10 +245,8 @@ export async function runGatewayLoop(params: {
279245const SHUTDOWN_TIMEOUT_MS = SUPERVISOR_STOP_TIMEOUT_MS - 5_000;
280246const resolveRestartDrainTimeoutMs = async (): Promise<RestartDrainTimeoutMs> => {
281247try {
282-const [{ getRuntimeConfig }, { resolveGatewayRestartDeferralTimeoutMs }] = await Promise.all([
283-loadRuntimeConfigModule(),
284-loadRestartModule(),
285-]);
248+const { getRuntimeConfig, resolveGatewayRestartDeferralTimeoutMs } =
249+await loadGatewayLifecycleRuntimeModule();
286250const timeoutMs = getRuntimeConfig().gateway?.reload?.deferralTimeoutMs;
287251return resolveGatewayRestartDeferralTimeoutMs(timeoutMs);
288252} catch {
@@ -351,15 +315,16 @@ export async function runGatewayLoop(params: {
351315// On restart, wait for in-flight agent turns to finish before
352316// tearing down the server so buffered messages are delivered.
353317if (isRestart) {
354-const [
355-{ abortEmbeddedPiRun, getActiveEmbeddedRunCount, waitForActiveEmbeddedRuns },
356-{ getActiveBundledRuntimeDepsInstallCount, waitForBundledRuntimeDepsInstallIdle },
357-{ getActiveTaskCount, markGatewayDraining, waitForActiveTasks },
358-] = await Promise.all([
359-loadEmbeddedRunsModule(),
360-loadBundledRuntimeDepsActivityModule(),
361-loadCommandQueueModule(),
362-]);
318+const {
319+ abortEmbeddedPiRun,
320+ getActiveBundledRuntimeDepsInstallCount,
321+ getActiveEmbeddedRunCount,
322+ getActiveTaskCount,
323+ markGatewayDraining,
324+ waitForActiveEmbeddedRuns,
325+ waitForActiveTasks,
326+ waitForBundledRuntimeDepsInstallIdle,
327+} = await loadGatewayLifecycleRuntimeModule();
363328const createStillPendingDrainLogger = () =>
364329setInterval(() => {
365330gatewayLog.warn(
@@ -429,7 +394,7 @@ export async function runGatewayLoop(params: {
429394const onSigterm = () => {
430395gatewayLog.info("signal SIGTERM received");
431396void (async () => {
432-const { consumeGatewayRestartIntentSync } = await loadRestartModule();
397+const { consumeGatewayRestartIntentSync } = await loadGatewayLifecycleRuntimeModule();
433398request(consumeGatewayRestartIntentSync() ? "restart" : "stop", "SIGTERM");
434399})();
435400};
@@ -446,7 +411,7 @@ export async function runGatewayLoop(params: {
446411 markGatewaySigusr1RestartHandled,
447412 peekGatewaySigusr1RestartReason,
448413 scheduleGatewaySigusr1Restart,
449-} = await loadRestartModule();
414+} = await loadGatewayLifecycleRuntimeModule();
450415const authorized = consumeGatewaySigusr1RestartAuthorization();
451416if (!authorized) {
452417if (!isGatewaySigusr1RestartExternallyAllowed()) {
@@ -482,15 +447,11 @@ export async function runGatewayLoop(params: {
482447// new work from draining. The same boundary also discards stale restart
483448// deferral timers and reloads the task registry from durable state so
484449// cancelled/completed work is not kept alive by old in-memory maps.
485-const [
486-{ resetAllLanes },
487-{ resetGatewayRestartStateForInProcessRestart },
488-{ reloadTaskRegistryFromStore },
489-] = await Promise.all([
490-loadCommandQueueModule(),
491-loadRestartModule(),
492-loadRuntimeInternalModule(),
493-]);
450+const {
451+ reloadTaskRegistryFromStore,
452+ resetAllLanes,
453+ resetGatewayRestartStateForInProcessRestart,
454+} = await loadGatewayLifecycleRuntimeModule();
494455resetAllLanes();
495456resetGatewayRestartStateForInProcessRestart();
496457reloadTaskRegistryFromStore();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。