n8n/packages/@n8n/instance-ai/src/workflow-loop/runtime.ts
oleg 629826ca1d
Some checks are pending
Build: Benchmark Image / build (push) Waiting to run
CI: Master (Build, Test, Lint) / Build for Github Cache (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (22.x) (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (24.14.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (25.x) (push) Waiting to run
CI: Master (Build, Test, Lint) / Lint (push) Waiting to run
CI: Master (Build, Test, Lint) / Performance (push) Waiting to run
CI: Master (Build, Test, Lint) / Notify Slack on failure (push) Blocked by required conditions
Util: Sync API Docs / sync-public-api (push) Waiting to run
feat: Instance AI and local gateway modules (no-changelog) (#27206)
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Albert Alises <albert.alises@gmail.com>
Co-authored-by: Jaakko Husso <jaakko@n8n.io>
Co-authored-by: Dimitri Lavrenük <20122620+dlavrenuek@users.noreply.github.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
Co-authored-by: Tuukka Kantola <Tuukkaa@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com>
Co-authored-by: Raúl Gómez Morales <raul00gm@gmail.com>
Co-authored-by: Elias Meire <elias@meire.dev>
Co-authored-by: Dimitri Lavrenük <dimitri.lavrenuek@n8n.io>
Co-authored-by: Tomi Turtiainen <10324676+tomi@users.noreply.github.com>
Co-authored-by: Mutasem Aldmour <mutasem@n8n.io>
2026-04-01 21:33:38 +03:00

57 lines
1.7 KiB
TypeScript

import { handleBuildOutcome, handleVerificationVerdict } from './workflow-loop-controller';
import type {
WorkflowBuildOutcome,
VerificationResult,
WorkflowLoopAction,
WorkflowLoopState,
} from './workflow-loop-state';
import type { WorkflowLoopStorage } from '../storage/workflow-loop-storage';
function createInitialState(threadId: string, outcome: WorkflowBuildOutcome): WorkflowLoopState {
return {
workItemId: outcome.workItemId,
threadId,
workflowId: outcome.workflowId,
phase: 'building',
status: 'active',
source: outcome.workflowId ? 'modify' : 'create',
rebuildAttempts: 0,
};
}
export class WorkflowLoopRuntime {
constructor(private readonly storage: WorkflowLoopStorage) {}
async applyBuildOutcome(
threadId: string,
outcome: WorkflowBuildOutcome,
): Promise<WorkflowLoopAction> {
const existing = await this.storage.getWorkItem(threadId, outcome.workItemId);
const state = existing?.state ?? createInitialState(threadId, outcome);
const attempts = existing?.attempts ?? [];
const { state: newState, action, attempt } = handleBuildOutcome(state, attempts, outcome);
await this.storage.saveWorkItem(threadId, newState, [...attempts, attempt], outcome);
return action;
}
async applyVerificationVerdict(
threadId: string,
verdict: VerificationResult,
): Promise<WorkflowLoopAction> {
const existing = await this.storage.getWorkItem(threadId, verdict.workItemId);
if (!existing) {
return { type: 'blocked', reason: `Unknown work item: ${verdict.workItemId}` };
}
const {
state: newState,
action,
attempt,
} = handleVerificationVerdict(existing.state, existing.attempts, verdict);
await this.storage.saveWorkItem(threadId, newState, [...existing.attempts, attempt]);
return action;
}
}