From faef57e138e9fe7c87dee5764dacd2517f078405 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 13 Jul 2026 04:18:05 -0700 Subject: [PATCH] fix(ci): repair suspension lane lint errors and stale deadcode entry --- scripts/deadcode-exports.baseline.mjs | 1 - src/agents/session-suspension.ts | 19 ++++++++++++------- src/gateway/server-lanes.ts | 17 +++++++---------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/scripts/deadcode-exports.baseline.mjs b/scripts/deadcode-exports.baseline.mjs index 65ce68dfe49c..fea9828be490 100644 --- a/scripts/deadcode-exports.baseline.mjs +++ b/scripts/deadcode-exports.baseline.mjs @@ -1914,7 +1914,6 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/config/sessions/transcript.ts: TailAssistantTranscriptText", "src/config/sessions/types.ts: LaneExecutionState", "src/config/sessions/types.ts: mergeSessionEntryWithPolicy", - "src/config/sessions/types.ts: QuotaSuspension", "src/config/sessions/types.ts: SessionAcpIdentitySource", "src/config/sessions/types.ts: SessionAcpIdentityState", "src/config/sessions/types.ts: SessionChannelId", diff --git a/src/agents/session-suspension.ts b/src/agents/session-suspension.ts index 83c29e194a2e..9e7b2485edf4 100644 --- a/src/agents/session-suspension.ts +++ b/src/agents/session-suspension.ts @@ -94,7 +94,7 @@ function getSessionSuspensionState(): SessionSuspensionRuntimeState { } >(); } - if (!state.suspensionWriteChain) { + if (state.suspensionWriteChain === undefined) { state.suspensionWriteChain = Promise.resolve(); } return state; @@ -136,12 +136,15 @@ function resolveLaneResumeConcurrency(cfg: OpenClawConfig | undefined, laneId: s } function isGatewayManagedLane(laneId: string): boolean { + // Lane ids are open strings (plugins mint their own); narrow once so the + // membership check compares within the enum. + const lane = laneId as CommandLane; return ( - laneId === CommandLane.Main || - laneId === CommandLane.Subagent || - laneId === CommandLane.Cron || - laneId === CommandLane.CronNested || - laneId === CommandLane.Nested + lane === CommandLane.Main || + lane === CommandLane.Subagent || + lane === CommandLane.Cron || + lane === CommandLane.CronNested || + lane === CommandLane.Nested ); } @@ -324,7 +327,9 @@ async function suspendSessionQueued(params: SessionSuspensionParams, queuedGener resolveLaneResumeConcurrency(params.cfg, params.laneId), ); }; - let persistedSuspension = false; + // Assigned at the end of the try; the catch path returns, so every read + // below sees the real patch outcome. + let persistedSuspension: boolean; try { const patchedEntry = await patchSessionEntry( diff --git a/src/gateway/server-lanes.ts b/src/gateway/server-lanes.ts index e877a860caef..26556de39c9e 100644 --- a/src/gateway/server-lanes.ts +++ b/src/gateway/server-lanes.ts @@ -28,11 +28,11 @@ export function applyGatewayLaneConcurrency( concurrency: GatewayLaneConcurrency, opts: { gatewayStart?: boolean } = {}, ): void { - let suspendedLaneIds: ReadonlySet = new Set(); - if (opts.gatewayStart) { - suspendedLaneIds = enableSessionSuspensionTimersForGatewayStart( - (laneId, savedResumeConcurrency) => { - switch (laneId) { + // Lane ids are open strings (plugins mint their own); narrow once so the + // gateway-managed cases compare within the enum. + const suspendedLaneIds: ReadonlySet = opts.gatewayStart + ? enableSessionSuspensionTimersForGatewayStart((laneId, savedResumeConcurrency) => { + switch (laneId as CommandLane) { case CommandLane.Cron: case CommandLane.CronNested: return concurrency.cron; @@ -45,11 +45,8 @@ export function applyGatewayLaneConcurrency( default: return savedResumeConcurrency; } - }, - ); - } else { - suspendedLaneIds = getCleanupSuspendedLaneIdsForGatewayPublication(); - } + }) + : getCleanupSuspendedLaneIdsForGatewayPublication(); // Resolution is deliberately separate: this commit-edge applier only updates // live queue state and cannot reject a config midway through publication. if (!suspendedLaneIds.has(CommandLane.Cron)) {