mirror of
https://github.com/n8n-io/n8n.git
synced 2026-06-01 17:27:14 +02:00
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
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>
57 lines
1.7 KiB
TypeScript
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;
|
|
}
|
|
}
|