From a8d29f22725f9e29b4457956190eb87f8595a357 Mon Sep 17 00:00:00 2001 From: Albert Alises Date: Tue, 26 May 2026 20:43:10 +0200 Subject: [PATCH] fix(core): Stop idle-killing Instance AI active runs awaiting HITL (#31154) --- .../runtime/__tests__/liveness-policy.test.ts | 21 ++++++++++++++----- .../src/runtime/liveness-policy.ts | 4 ++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/@n8n/instance-ai/src/runtime/__tests__/liveness-policy.test.ts b/packages/@n8n/instance-ai/src/runtime/__tests__/liveness-policy.test.ts index c3d8e55a118..aee17fa5858 100644 --- a/packages/@n8n/instance-ai/src/runtime/__tests__/liveness-policy.test.ts +++ b/packages/@n8n/instance-ai/src/runtime/__tests__/liveness-policy.test.ts @@ -17,8 +17,8 @@ describe('InstanceAiLivenessPolicy', () => { confirmationTimeoutMs: day, backgroundTaskIdleTimeoutMs: 10 * minute, backgroundTaskMaxLifetimeMs: 30 * minute, - activeRunIdleTimeoutMs: 10 * minute, - activeRunMaxLifetimeMs: 30 * minute, + activeRunIdleTimeoutMs: 0, + activeRunMaxLifetimeMs: day, }); expect(createInstanceAiLivenessPolicyConfig({ confirmationTimeoutMs: 42_000 })).toEqual({ @@ -58,18 +58,29 @@ describe('InstanceAiLivenessPolicy', () => { const decision = createPolicy().evaluate({ surface: 'active-run', startedAt: 0, - lastActivityAt: 31 * minute, - now: 31 * minute, + lastActivityAt: day + minute, + now: day + minute, }); expect(decision).toMatchObject({ action: 'timeout', reason: 'max_lifetime', surface: 'active-run', - timeoutMs: 30 * minute, + timeoutMs: day, }); }); + it('does not idle-timeout an active run that is waiting on another surface', () => { + const decision = createPolicy().evaluate({ + surface: 'active-run', + startedAt: 0, + lastActivityAt: 0, + now: 6 * 60 * minute, + }); + + expect(decision).toEqual({ action: 'keep-alive' }); + }); + it('uses the one-day confirmation timeout for suspended runs and pending confirmations by default', () => { const policy = createPolicy(); const shorterWorkTimeout = 30 * minute; diff --git a/packages/@n8n/instance-ai/src/runtime/liveness-policy.ts b/packages/@n8n/instance-ai/src/runtime/liveness-policy.ts index 950a9ede43d..274453ff51d 100644 --- a/packages/@n8n/instance-ai/src/runtime/liveness-policy.ts +++ b/packages/@n8n/instance-ai/src/runtime/liveness-policy.ts @@ -21,8 +21,8 @@ export const INSTANCE_AI_DEFAULT_LIVENESS_POLICY_CONFIG = { confirmationTimeoutMs: DAY_MS, backgroundTaskIdleTimeoutMs: 10 * MINUTE_MS, backgroundTaskMaxLifetimeMs: 30 * MINUTE_MS, - activeRunIdleTimeoutMs: 10 * MINUTE_MS, - activeRunMaxLifetimeMs: 30 * MINUTE_MS, + activeRunIdleTimeoutMs: 0, + activeRunMaxLifetimeMs: DAY_MS, } satisfies InstanceAiLivenessPolicyConfig; export function createInstanceAiLivenessPolicyConfig(