import type { Constraint, ConstraintContext, ConstraintResult, RequirementKey, StateView, } from './types.js'; export const evaluateConstraints = ( constraints: Constraint[], ctx: ConstraintContext, view: StateView ): ConstraintResult => { for (const constraint of constraints) { const missing = constraint .requires(ctx) .filter((req) => !view.has(req)); if (missing.length > 0 && ctx.mode === 'precheck') { return { kind: 'unknown', missing }; } const result = constraint.test(ctx, view); if (result.kind !== 'allow') { return result; } } return { kind: 'allow' }; }; export const collectRequirements = ( constraints: Constraint[], ctx: ConstraintContext ): RequirementKey[] => { const keys: RequirementKey[] = []; for (const constraint of constraints) { keys.push(...constraint.requires(ctx)); } return keys; };