This commit is contained in:
dovewars 2026-01-30 14:09:07 +03:00 committed by GitHub
commit c3e33c3500
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 49 additions and 2 deletions

View File

@ -14,7 +14,24 @@ import { defaultRuntime } from "../runtime.js";
import { deliveryContextFromSession, mergeDeliveryContext } from "../utils/delivery-context.js";
import { loadSessionEntry } from "./session-utils.js";
export async function scheduleRestartSentinelWake(params: { deps: CliDeps }) {
export type AddChatRunFn = (
runId: string,
entry: { sessionKey: string; clientRunId: string },
) => void;
export type BroadcastFn = (
event: string,
payload: unknown,
opts?: { dropIfSlow?: boolean },
) => void;
export interface RestartSentinelParams {
deps: CliDeps;
addChatRun?: AddChatRunFn;
broadcast?: BroadcastFn;
}
export async function scheduleRestartSentinelWake(params: RestartSentinelParams) {
const sentinel = await consumeRestartSentinel();
if (!sentinel) return;
const payload = sentinel.payload;
@ -61,7 +78,27 @@ export async function scheduleRestartSentinelWake(params: { deps: CliDeps }) {
const channel = channelRaw ? normalizeChannelId(channelRaw) : null;
const to = origin?.to;
if (!channel || !to) {
// No outbound channel (e.g., webchat sessions use WebSocket, not channel delivery).
// For webchat: register the run with addChatRun so responses stream to the client.
enqueueSystemEvent(message, { sessionKey });
if (params.addChatRun && params.broadcast) {
const runId = `restart-${Date.now()}`;
params.addChatRun(runId, { sessionKey, clientRunId: runId });
try {
await agentCommand(
{
message: `System: ${summary}`,
sessionKey,
runId,
deliver: false,
},
defaultRuntime,
params.deps,
);
} catch {
// Agent turn failed; system event already queued as fallback context
}
}
return;
}

View File

@ -19,6 +19,8 @@ import type { loadOpenClawPlugins } from "../plugins/loader.js";
import { type PluginServicesHandle, startPluginServices } from "../plugins/services.js";
import { startBrowserControlServerIfEnabled } from "./server-browser.js";
import {
type AddChatRunFn,
type BroadcastFn,
scheduleRestartSentinelWake,
shouldWakeFromRestartSentinel,
} from "./server-restart-sentinel.js";
@ -37,6 +39,8 @@ export async function startGatewaySidecars(params: {
};
logChannels: { info: (msg: string) => void; error: (msg: string) => void };
logBrowser: { error: (msg: string) => void };
addChatRun?: AddChatRunFn;
broadcast?: BroadcastFn;
}) {
// Start OpenClaw browser control server (unless disabled via config).
let browserControl: Awaited<ReturnType<typeof startBrowserControlServerIfEnabled>> = null;
@ -152,7 +156,11 @@ export async function startGatewaySidecars(params: {
if (shouldWakeFromRestartSentinel()) {
setTimeout(() => {
void scheduleRestartSentinelWake({ deps: params.deps });
void scheduleRestartSentinelWake({
deps: params.deps,
addChatRun: params.addChatRun,
broadcast: params.broadcast,
});
}, 750);
}

View File

@ -504,6 +504,8 @@ export async function startGatewayServer(
logHooks,
logChannels,
logBrowser,
addChatRun,
broadcast,
}));
const { applyHotReload, requestGatewayRestart } = createGatewayReloadHandlers({